首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使物体以恒定的速度直接远离鼠标

如何使物体以恒定的速度直接远离鼠标
EN

Stack Overflow用户
提问于 2015-10-16 14:19:20
回答 3查看 207关注 0票数 0

我有一艘发射激光的飞船。它从自身到(mouseX,mouseY)绘制一条线。我怎么能让这艘船在相反的方向加速,就像被往后推一样?

我一直在经历一些三角和比率,但没有取得多大进展。加速度是恒定的,所以鼠标到底有多远并不重要,只是方向。

我一直在尝试创建一个只适用于范围(-4,4)整数的向量,因为我不能让船以浮动的速度在屏幕上移动,而(-4,4)范围至少会给我.16不同方向的船舶移动,虽然我不希望这是一个限制。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-16 14:33:17

不涉及三角学,只是矢量。如果你从船的位置减去鼠标的位置

代码语言:javascript
复制
(shipX-mouseX, shipY-mouseY)

这给了你移动飞船的方向。把它乘以一些因子,把它四舍五入成整数,然后把它加到船的当前位置。你可能想做几次,给一些连续的议案。另外,您可能希望因素发生变化:增加前几个滴答数,然后降到零。

票数 2
EN

Stack Overflow用户

发布于 2015-10-16 14:29:43

加速度的矢量将在从鼠标光标到船的方向,远离鼠标位置,所以如果从鼠标到船的线是θ到水平的角度(逆时针θ是+ve,顺时针方向是-ve),那么F作用在飞船上加速它。如果船舶有质量M然后使用f=ma,加速度A将是F/M,x轴的加速度将是A*cos(θ),在y A*sin(θ)中,然后在每次模拟的时间间隔后使用v=u+at。这个计算必须使用浮点数学。

票数 0
EN

Stack Overflow用户

发布于 2015-10-16 14:39:43

下面是一个使用简单向量数学的完整示例。注意注释。

代码语言:javascript
复制
import pygame
import math

# some simple vector helper functions, stolen from http://stackoverflow.com/a/4114962/142637
def magnitude(v):
    return math.sqrt(sum(v[i]*v[i] for i in range(len(v))))

def add(u, v):
    return [ u[i]+v[i] for i in range(len(u)) ]

def sub(u, v):
    return [ u[i]-v[i] for i in range(len(u)) ]    

def dot(u, v):
    return sum(u[i]*v[i] for i in range(len(u)))

def normalize(v):
    vmag = magnitude(v)
    return [ v[i]/vmag  for i in range(len(v)) ]

class Ship(object):
    def __init__(self):
        self.x, self.y = (0, 0)
        self.set_target((0, 0))
        self.org_speed = 0.9
        self.speed = self.org_speed
        self.laser = (None, 0)

    @property
    def pos(self):
        return self.x, self.y

    # for drawing, we need the position as tuple of ints
    # so lets create a helper property
    @property
    def int_pos(self):
        return map(int, self.pos)

    @property
    def target(self):
        return self.t_x, self.t_y

    @property
    def int_target(self):
        return map(int, self.target)   

    def set_target(self, pos):
        self.t_x, self.t_y = pos

    def update(self):
        if self.speed < self.org_speed:
            self.speed += min(self.org_speed, 0.3)

        # if we won't move, don't calculate new vectors
        if self.int_pos == self.int_target:
            return 

        target_vector = sub(self.target, self.pos) 

        # a threshold to stop moving if the distance is to small.
        # it prevents a 'flickering' between two points
        if magnitude(target_vector) < 2: 
            return

        # apply the ship's speed to the vector
        move_vector = [c * self.speed for c in normalize(target_vector)]

        # update position
        self.x, self.y = add(self.pos, move_vector)

    def draw(self, s):
        pygame.draw.circle(s, (255, 0 ,0), self.int_pos, 5)
        end, state = self.laser
        if state > 0:
            pygame.draw.line(s, (255, 255, 0 if state % 2 else 255), self.pos, end, 2)
            self.laser = end, state - 1

    def fire(self, pos):
        self.speed = -min(5, magnitude(sub(pos, self.pos)) / 10.0)
        self.laser = pos, 5

pygame.init()
quit = False
s = pygame.display.set_mode((300, 300))
c = pygame.time.Clock()
ship = Ship()

FIRE = pygame.USEREVENT
pygame.time.set_timer(FIRE, 2000)

while not quit:
    quit = pygame.event.get(pygame.QUIT)
    if pygame.event.get(FIRE):
        ship.fire(pygame.mouse.get_pos())
    ship.set_target(pygame.mouse.get_pos())
    pygame.event.poll()
    ship.update()
    s.fill((0, 0, 0))
    ship.draw(s)
    pygame.display.flip()
    c.tick(60)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33172753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档