我知道这个问题之前已经问过了,我基本上已经让它工作了。我使用了在这里和其他地方找到的代码:
tx = target_pos.x - self.pos.xty = target_pos.y - self.pos.ytvx = target_vel.xtvy = target_vel.y# 获取二次方程的组成部分a = tvx*tvx + tvy*tvy - self.max_speed * self.max_speedb = 2 * (tvx * tx + tvy * ty)c = tx*tx + ty*ty# 解二次方程ts = self.quad(a, b, c); # 见下面的quad()# 找到最小的正解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
这个方法有效,但仅当射手位于屏幕的右下角时有效(这是一个自上而下的游戏,有一个射手和一个移动目标)。在这种设置下,射手总是能击中目标,但如果我将射手移动到屏幕的底部中间位置,射手只有在目标位于射手右侧时才能正确发射弹丸,否则它只会向前直射。这里有一些截图链接来说明这个问题。
可以看出,弹丸的矢量是正确的,但不知为何它没有跟随这个矢量。
回答:
明白了!只需要更改最后一行以考虑射手的位置即可。
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