类似Galaxian的敌人运动

时间:2012-12-19 16:05:48

标签: c# xna

我正在制作一个类似星系的射击游戏,我的敌人物体有一个目的地矢量,他们使用这段代码前往:

position.X -= (Motion.X / Magnitude) * Speed;
position.Y -= (Motion.Y / Magnitude) * Speed;

动作由:

制定
this.Motion = InitialPosition - Destination;

这使他们直线前往目的地。

然而,我想让它们变得更有趣,并且在一个sin或cos波上旅行,有点像Galaxian。

我该怎么做?

4 个答案:

答案 0 :(得分:9)

您可能最好为运动功能定义贝塞尔曲线,而不是像正弦波这样的简单函数。 Galaxian肯定有比这更复杂的动作。

以下是a primer on the maths of Bezier curves的链接。这是一篇相当长的文档,但是通过大量的例子很好地涵盖了所涉及的数学。

希望这有助于激励你。

答案 1 :(得分:5)

执行此操作的一种方法是为水平运动创建加速因子,并将该因子添加到每个滴答的水平速度。因此,如果你的特定敌人的水平速度是2开始,你的加速度是-01,那么在200个蜱之后,敌人将直接向下,并且在另外200个蜱后,它将以-2的水平速度移动。这将给出一个很好的曲线。

通过为每个敌人随机确定速度和加速度(在实验确定的特定限制范围内),您可以轻松创建各种各样的攻击配置文件。这会产生类似Galaxian的动作。

你也可以对垂直方向做同样的事情,当然,加速度限制会有很大的不同......对于水平加速度,你可能想要确定两边大小相等的范围0(比如-.02到+ 0.02),而对于垂直加速度,你可能总是希望船最终从屏幕底部下降,所以你可能希望加速总是最终为正(或者负面取决于你如何做屏幕坐标。)

答案 2 :(得分:3)

您可以根据当前的动作代码使用waypoint navigation来完成此操作。您可以通过绘制正弦波图来计算航点。你可以通过使用Destination.Y = Math.Sin(Destination.X)的效果来做到这一点 - 如果没有看到你的代码那么肯定有点难以说明。

答案 3 :(得分:2)

创建一个振荡器并使敌人(即使没有动量)垂直于其方向移动一个等于振荡器正弦或余弦的偏移就足够了。

以下示例在工作时,显然只是一个指导原则。我希望它可以帮到你。

var dest = new PointF(200, 100);
var pos = new PointF(30, 140);
var oscAngle = 0d;
var dirAngle = Math.Atan2(dest.Y - pos.Y, dest.X - pos.X);
//Constants for your simulation
const int movSpeed = 2;
const int amp = 2;
const double frequency = Math.PI / 5;
//Inappropriate loop condition, change it to proper
while (true)
{
    oscAngle += frequency;
    //Scalar offset, you can use Cos as well
    var oscDelta = Math.Sin(oscAngle);
    //Linear movement
    var stepVector = new SizeF((float)(Math.Cos(dirAngle) * movSpeed), (float)(Math.Sin(dirAngle) * movSpeed));
    //Oscillating movement, making it transversal by adding 90° to the direction angle
    var oscNormalAngle = dirAngle + Math.PI / 2;
    //Vector for the oscillation
    var oscVector = new SizeF((float)(Math.Cos(oscNormalAngle) * oscDelta) * amp, (float)(Math.Sin(oscNormalAngle) * oscDelta) * amp);
    pos += stepVector + oscVector;
    //Operate below
}