【问题标题】:Galaxian-like Enemy movement银河系的敌人运动
【发布时间】:2012-12-19 16:05:48
【问题描述】:

我正在制作一个类似银河系的射击游戏,我的敌方物体有一个目的地向量,他们会使用以下代码:

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

运动是由:

this.Motion = InitialPosition - Destination;

这使它们沿直线向目的地行驶。

但是,我想让它们变得更有趣,并在 sin 或 cos 波中旅行,有点像 Galaxian 所做的那样。

我该怎么做?

【问题讨论】:

    标签: c# xna


    【解决方案1】:

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

    这是a primer on the maths of Bezier curves 的链接。这是一个相当长的文档,但很好地涵盖了所涉及的数学,并提供了大量示例。

    希望对您有所启发。

    【讨论】:

    • 大多数答案都提供了很好的想法,但我觉得这是最好的。贝塞尔曲线允许更多种类的运动,并且可以让事情变得更有趣。非常感谢所有的答案!
    【解决方案2】:

    执行此操作的一种方法是为水平运动创建一个加速因子,并将该因子添加到每个刻度的水平速度。因此,如果你对给定敌人的水平速度一开始是 2,而你的加速度是 -.01,那么在 200 个滴答声之后,敌人会直线下降,再过 200 个滴答声之后,它会以 -2 的水平速度移动.这将给出一个漂亮的曲线。

    通过随机确定每个敌人的速度和加速度(在实验确定的特定限制范围内),您可以轻松创建各种漂亮的攻击配置文件。这将给出一个非常类似银河的运动。

    你也可以对垂直方向做同样的事情,当然,加速度限制会非常不同......对于水平加速度,你可能想要确定一个范围在任一侧的大小相等为 0(例如 -.02 到 +.02),而对于垂直加速度,您可能总是希望船最终从屏幕底部下降,因此您可能希望该加速度始终为正(或负数取决于你如何处理屏幕坐标。)

    【讨论】:

      【解决方案3】:

      您可以根据您当前的动作代码使用waypoint navigation 来执行此操作。您将通过绘制正弦波来计算航点。你可以通过使用Destination.Y = Math.Sin(Destination.X) 的效果来做到这一点——如果没有看到你的代码,这有点难以确定。

      【讨论】:

        【解决方案4】:

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

        以下示例在运行时显然只是一个指南。希望对你有帮助。

        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
        }
        

        【讨论】:

          猜你喜欢
          • 2012-07-14
          • 2017-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多