我正在制作一个类似星系的射击游戏,我的敌人物体有一个目的地矢量,他们使用这段代码前往:
position.X -= (Motion.X / Magnitude) * Speed;
position.Y -= (Motion.Y / Magnitude) * Speed;
动作由:
制定this.Motion = InitialPosition - Destination;
这使他们直线前往目的地。
然而,我想让它们变得更有趣,并且在一个sin或cos波上旅行,有点像Galaxian。
我该怎么做?
答案 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
}