【问题标题】:Angular movement in pygamepygame中的角运动
【发布时间】:2013-02-16 16:42:52
【问题描述】:

我已经定义了一个函数,可以让我沿对角线移动对象:

    if(myX > targetX):
        dx = myX - targetX
    else:
        dx = targetX - myX 
    if(myY > targetY):
        dy = myY - targetY
    else:
        dy = targetY - myY

    if(dy == 0):
        dy = 1
    if(dx == 0):
        dx = 1

    #Calc Movement
    if(dx < dy):
        Speedy = dy/dx 
        Speedx = 1
    if(dx > dy):
        Speedy = 1
        Speedx = dx/dy
    elif(dx == dy):
        Speedx = 1
        Speedy = 1

    if(myX < targetX):
        Speedx = Speedx * -1
    if(myY < targetY):
        Speedy = Speedy * -1


    return Speedx,Speedy

代码有效,但问题是它没有按照我的意愿行事。现在,如果我靠近它,物体就会加速,这看起来很奇怪。我很清楚为什么会这样,但是有没有一种简单的方法可以将速度固定为恒定,而不是方向?

【问题讨论】:

  • 是时候学习一些三角学了!你可以计算它需要经过的角度,然后用 sin 和 cos 得到 x 和 y。从这里你可以乘以你想要去的速度。
  • @placeybordeaux:虽然三角函数可以工作,但这不是必需的。

标签: python pygame game-physics


【解决方案1】:

如果你这样做,dx 和 dy 是从你的人指向目标的向量的标量。然后除以它们的大小,这里表示为 dz。现在 dx 和 dy 代表一个单位向量。将它们乘以速度后,您的对象将以恒定速度移动,但方向会发生变化。

import math

#set speed to how fast you want your guy to move
speed = 1
dx = myX - targetX
dy = myY - targetY

dz = math.sqrt(dx**2 + dy**2)

speedx = dx/dz * speed
speedy = dy/dz * speed

【讨论】:

  • 另外,如果你想在num_steps 中从点Mytarget,只需使用speedx = float(dx) / num_stepsspeedy = float(dy) / num_steps
  • 试过这个,但没用,所以我尝试了三角版本。也没有用。原来我需要速度高于 1 否则它不会移动:S 让它工作,谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多