我拥有一个位置为Vector2的塔,当我足够接近时会射击目标。抛射物应该继承塔的位置,因为它的起始位置然后它会得到一个目标Vector2,它可以被击中。
当射弹知道它自己的位置和目标位置加上速度时,我需要在每次更新时计算新位置吗?
答案 0 :(得分:3)
如果你有目标和原点,那么只需做目标 - 原点就会给你一个新的Vector2就是方向。然后,您需要对此方向向量进行标准化,并将其乘以抛射速度。
伪代码:
Vector2 target = objectToShootAt.position();
Vector2 origin = tower.position();
Vector2 direction = target - origin;
direction.normalize(); // or direction *= 1/direction.length()
direction *= speed;
然后只需使用方向并将其乘以帧之间的时间,并将其添加到项目符号位置。
编辑:跟进乔治的评论 如果目标正在移动,我显示的伪代码将总是错过目标,因为它假设子弹不能弯曲并且没有考虑目标速度。如果子弹曲线,正如乔治所说,你需要重新计算每帧的方向向量。
要有一个非弯曲的子弹,但考虑到目标的速度,你需要预测目标的位置,这是通过根据目标的当前航向,速度和时间来估算目标的位置来完成的。让子弹到达那里。
答案 1 :(得分:0)
也许更容易逐帧更新子弹,但是我试图解决从塔到敌人预期位置的线方程。
Equation from Enemy => Target = EnemyOrigin + EnemyDirection.Normalized * EnemySpeed * Time;
Equation from Tower => Target = TowerOrigin + BulletDirection.Normalized * BulletSpeed * Time;
Target = EO + ED * ES * T, Target = TO + BD * BS *T =>
(EO - TO) + ED * ES * T
=> EO + ED * ES * T = TO + BD * BS * T => BD = -----------------------
BS * T
现在我们不知道时间,但我们可以近似它,(子弹相对于距离会有不同的速度):
Time = |(EnemyOrigen - TowerOrigen) / BulletSpeed| = |(EO - TO) / BS|;
(EO - TO )+ ED * ES * (EO - TO) / BS
=> BD = ---------------------------------------- => (+-1) * (One + (ED * ES) / BS);
BS * (EO - TO) / BS
现在我们知道BulletDirection,BulletOrigen和飞行时间,我们只需要插值
BulletPos = TowerOrigin + BulletDirectionNormalized * BulletSpeed * TimeElapsedFromShot;
我没有测试过它,它可能不是一个好的解决方案......但只是为了展示其他替代方案......;)