我知道之前已经问过这个问题,而且我已经让它工作了。我已经使用了我在这里和其他地方找到的代码:
tx = target_pos.x - self.pos.x
ty = target_pos.y - self.pos.y
tvx = target_vel.x
tvy = target_vel.y
# Get quadratic equation components
a = tvx*tvx + tvy*tvy - self.max_speed * self.max_speed
b = 2 * (tvx * tx + tvy * ty)
c = tx*tx + ty*ty
# Solve quadratic
ts = self.quad(a, b, c); # See quad(), below
# Find smallest positive solution
desired_vel = None;
if (ts):
t0 = ts[0]
t1 = ts[1]
t = min(t0, t1)
if (t < 0):
t = max(t0, t1)
if (t > 0):
desired_vel = Vector2D(target_pos.x + target_vel.x*t,target_pos.y + target_vel.y*t) * self.max_speed
这是有效的,除了它只在射击者被放置在屏幕的右下方时才起作用(它是一个自上而下的游戏,有一个射手和一个移动目标)。通过这种设置,射手总是会击中,但是如果我将射击者移动到屏幕的中间位置,射手只有在目标位于射击者右侧时才能正确射击射弹,否则它只会向前射击。以下是一些屏幕截图链接来说明问题。
Accurate (shooter can't be seen in bottom left)
可以看出,射弹的矢量很好,出于某种原因,它只是没有跟随它。
答案 0 :(得分:0)
知道了!只需改变最后一行就可以考虑到射击者的位置。
desired_vel = Vector2D( (target_pos.x + target_vel.x * t) - shooter.pos.x, (target_pos.y + target_vel.y*t) - shooter.pos.y ) * self.max_speed