14

私は銀河のようなシューティング ゲームを作成しています。私の敵オブジェクトには、次のコードを使用して移動する目的地のベクトルがあります。

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

モーションは次のように計算されます。

this.Motion = InitialPosition - Destination;

これにより、目的地に向かって一直線に移動します。

しかし、私はそれらをもう少し面白くして、Galaxian のように sin 波または cos 波で移動したいと考えています。

これどうやってするの?

4

4 に答える 4

9

正弦波のような単純な関数よりも、移動関数のベジエ曲線を定義したほうがよい場合があります。ギャラクシアンは確かにそれよりも複雑な動きをしていました。

これは、ベジエ曲線の数学に関する入門書へのリンクです。これは非常に長い文書ですが、関連する数学をうまくカバーし、多くの例を示しています。

それがあなたを刺激するのに役立つことを願っています。

于 2012-12-19T16:19:05.653 に答える
5

これを行う1つの方法は、水平方向の動きの加速係数を作成し、その係数をティックごとに水平方向の速度に追加することです。したがって、特定の敵の水平速度が開始時に2で、加速度が-.01の場合、200ティック後、敵は真っ直ぐ下に移動し、さらに200ティック後、水平速度-2で移動します。 。これは素晴らしい曲線を与えるでしょう。

各敵の速度と加速度をランダムに決定することで(実験によって決定された特定の制限内で)、あまり労力をかけずに見栄えの良いさまざまな攻撃プロファイルを作成できます。これにより、非常にギャラクシアンのような動きが得られます。

垂直方向でも同じことができますが、もちろん、加速限界は大きく異なります...水平方向の加速では、0の両側で大きさが等しい範囲を決定する必要があります(たとえば-.02から+.02)、垂直方向の加速度の場合、船は常に画面の下部から下がってしまうので、加速度は常に正(または場合によっては負)になります。画面の座標をどのように処理しているか。)

于 2012-12-19T16:17:57.913 に答える
3

これを行うには、現在のモーション コードに沿ってウェイポイント ナビゲーションを利用します。正弦波をグラフ化してウェイポイントを計算します。これを行うには、次のような効果のあるものを使用しDestination.Y = Math.Sin(Destination.X)ます。コード全体を見ないと、確実に言うのは少し難しいです。

于 2012-12-19T16:19:29.243 に答える
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
}
于 2012-12-19T16:52:56.240 に答える