【问题标题】:Moving object towards certain coordinates and beyond always with the same speed始终以相同的速度将物体移向特定坐标并超出坐标
【发布时间】:2019-03-27 19:33:42
【问题描述】:

大家好,我正在用 python tkinter 制作一个游戏,你可以控制一个能够在你点击的地方射击的角色。我希望子弹使用 move 和 after 方法始终以相同的速度向点击的玩家移动,并且我没有数学知识来考虑计算移动子弹所需的 x 和 y 距离的方程朝向玩家点击的点并越过它,直到它到达画布的末端。有任何想法吗?感谢您的时间和回答

我已经有了 player 和 tkinter 类以及在点击时创建子弹并传递点击坐标的方法。现在我需要计算一次刷新后 x 和 y 的变化

def fly(self):
    self.app.canvsas.move(self.bullet, x and y you calculated)
    self.app.canvas.after(some refresh time, self.fly)

【问题讨论】:

    标签: python tkinter tkinter-canvas


    【解决方案1】:

    您可能希望在子弹发射时给子弹一个 x_speed 和 y_speed,然后通过移动指定的量来更新每一帧。假设您单击(cx,cy),子弹的起始位置为(sx,sy)。从这里你会想要找到cos(angle)sin(angle) 的角度。幸运的是,我们甚至可以在没有角度的情况下获得这些!通过点击点和起点r = ((sx-cx)**2+(sy-cy)**2)**0.5的直接距离,我们将有:

    cos_angle = (cx-sx)/r

    sin_angle = (cy-sy)/r

    可以将其保存在您的子弹实例中并乘以子弹的速度,以获得您想要将子弹在xy 方向上移动的距离:

    def updatebulletbycallingthiseveryframe(self):
        self.x += self.bullet_speed*self.cos_angle
        self.y += self.bullet_speed*self.sin_angle
    

    这将使子弹永远移动,添加一个检查以查看它是否超出范围并在发生这种情况时删除子弹。

    【讨论】:

    • 我试着实现了,子弹有不同的速度,有的慢,有的快,我应该把与move方法的after方法或differnet的速度相同并平衡它们吗?
    • 在您的子弹类中,我将有一个名为self.bullet_speed 的变量,如果您愿意,每个子弹可以不同。如果它们都具有相同的速度,则此方法应该可以正常工作。您可以让程序在子弹发射时打印出cos_anglesin_angle 的值,看看它们是否有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多