円形の弾丸の広がりは均一ではありません


7

私は東方のスタイルで弾丸シューターを作成しています。今、私は非常にシンプルな円形のショットを敵から発射したいと思っています。

ただし、間隔は非常に不均一であり、生き残るためにはあまり良いとは言えません。

私が使用しているコードはこれです:

private function shoot() : void
{
    const BULLETS_PER_WAVE : int = 72;
    var interval : Number = BULLETS_PER_WAVE / 360;

    for (var i : int = 0; i < BULLETS_PER_WAVE; ++i)
    {
        var xSpeed : Number = GameConstants.BULLET_NORMAL_SPEED_X * Math.sin(i * interval);
        var ySpeed : Number = GameConstants.BULLET_NORMAL_SPEED_Y * Math.cos(i * interval);

        BulletFactory.createNormalBullet(bulletColor_, alice_.center, xSpeed, ySpeed);
    }

    canShoot_ = false;
    cooldownTimer_.start();
}

私の間違いはsincos関数にあると思いますが、何が間違っているのか完全にはわかりません。


入力エラーはどのようにしてコードスニペットに入り込んだのですか?コードのコンパイルを確認した後、エディターから貼り付けをコピーしませんでしたか?
aaaaaaaaaaaa 2011年

2
これは数学的な答えではありませんが、BulletMLは弾丸の弾幕をXMLで定義および保存するのに役立ちます:asahi-net.or.jp/~cs8k-cyu/bulletml/index_e.html
BrandFeelsGood

@eBusiness:どんなタイプミス?コードは問題なくコンパイルされます。
IAE、2011年

@SoulBeaver 6行目にエンドブラケットがない場合はありません。そのため、もちろんコードにありますが、なぜ問題が解決しなかったのでしょうか。
aaaaaaaaaaaa 2011年

@eBusiness:私はそこで何が起こったのか全く分かりません。GameDevで正しく表示されるようにコードをインデントおよびフォーマットしているときに間違いがあった可能性がありますが、xDを修正する他の説明はありません。
IAE

回答:


13

あらゆる角度で作業する場合の基本的なルール:正しい単位を使用していることを確認してください。この場合、度数ではなくラジアンを使用する必要があります。

Math.sin(i * interval * Math.PI / 180);
Math.cos(i * interval * Math.PI / 180);

ボスとプレイヤーの間で直接弾を発射したい場合はatan2、FYIを使用します。


なぜラジアンは度より優れているのですか?
灰999

360で除算しているからです。基本的には、円を何百回も回転しているので、均一ではありません。
UltimateBrent

1
AS3のトリガー関数呼び出しにはラジアンが必要です。しかし、なぜそれらが数学的に優れているのか(したがって、多くの言語がそれらを選んでいるのか)は、ラジアンは、普遍的な数学定数であるpiの値に直接関係しているためです。間接の余分なレベルがされている(処理に関与しているので、度のに対し、人工構造です*/ Math.PI/180それは基本三角関数に含まれていない場合、あなたがするそれを自分で行う必要があります-あなたがそこにオープンに出て見ます度との間の変換)。
エンジニア、

1
サインとコサインは、一連の分数として計算されます。最も単純な形式では、これらのシリーズはラジアンを入力として受け取ります。πに基づく定数を導入することによってのみ、これらの系列は度数とともに使用できます。内部表現では度をすべてスキップすることをお勧めします。ラジアンは少し慣れる必要がありますが、長期的には、常に変換する必要がない方が簡単です。
aaaaaaaaaaaa

楽しいラジアントリビア:あなたは1メートルの半径の円を持っている、とあなたが一緒に歩けばnはその円のラジアン弧、あなたは正確に距離を移動しているだろう Nメートル、その歩行によって定義される円の部門があり正確に** n ** / 2平方メートルの面積。ラジアンは素晴らしいです。
Trevor Powell

7

除算を間違った方法で行っており、数学関数のようにラジアンではなく度を使用しています。たまたまこれにより、希望どおりのパターンができます。間隔変数の計算を修正してください。

var interval : Number = 2 * Math.PI / BULLETS_PER_WAVE;

編集:概念に精通していないものについては、このコードは、このように計算を残す可能、ラジアンで弾丸との間の所望の角度を生成xSpeedし、ySpeedそれが更なる定数であるとして適用。


+1正しい。彼は計算する必要がありperiod = 2 * pi、その後の機能およびCoS /罪のinterval = period / BULLETS_PER_WAVE
user712092 2011年

5

代わりに360 / BULLETS_PER_WAVEを実行する必要があると思います。この場合、各弾丸の間は360/72 = 5度になります。また、Math.sin関数とMath.cos関数がラジアンではなく度単位の入力を必要としていることを確信していますか?


4

あなたが答えられている間、これはおかしな答えです:自然から学ぶ。

代わりに黄金比を使用してください。

const GOLDEN_RATIO : Number = 1.618033989;
var interval : Number = 2 * Math.PI * GOLDEN_RATIO;

参照:http : //www.mathsisfun.com/numbers/nature-golden-ratio-fibonacci.html


今、あなたが各ショットの間に小さな遅延を入れれば、それは本当に美しいパターンになるでしょう。
aaaaaaaaaaaa 2011年

@クレムス:すごい!私はこれを次のパターンに完全に使用しています:3
IAE

3

考えられる次数/ラジアン問題は別として、主な問題は計算に整数値を使用していることだと思います。表示されていないGameConstants.BULLET_NORMAL_SPEED_Xか、対応するY は表示されていませんが、それらが整数ではなく浮動小数点数として表されていることを確認してください。または、速度計算の乗算中にそれらを浮動小数点値にキャストします。


値は自動キャストされます。私はActionscriptに慣れていないので、すべてのケースを呼び出すことはできませんが、この場合は問題ではないと確信しています。
aaaaaaaaaaaa 2011年

私はそれらが適切にキャストされているとは思いません。キャラクターの一番上と右側にある2つの円を見てください。これらの2つ、およびこれらの光線の両方のすべての円は、他の光線の1つと同じY値を持っています。これは、Yの増分が浮動小数点値である場合に予想されるものではありません。
カイロタン

正解です。値が丸められるという問題がありますが、投稿されたコードスニペットには表示されないと思います。不良になる可能性があると、0になり、円のように見えるものは何も生成されません。チェーンのさらに下の問題である必要があります。おそらく、number宣言されるべきだった変数が代わりに宣言されていintます。
aaaaaaaaaaaa 2011年

+1:BULLET_Xのタイプを指定するのを忘れたので、ASはそれをintにデフォルト設定しました。おっとっと。
IAE、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.