1

プログラミングの質問というよりも数学の質問であるため、これがこのフォーラムで受け入れられる質問であることを願っています。

cocos2d フレームワークを使用して基本的なスペース シューティング ゲームを開発しています。このゲームでは、ユーザーが宇宙船を制御して小惑星/敵を撃ち、敵も宇宙船を撃ち返します (オリジナルのえ?)。

敵が発射する「レーザー」はチューブのような形状で、通常は x 軸上で右から左にしか移動しません。これは簡単に実現でき、動きは次のコード行で作成されます。

currentEnemyProjectile.position = ccp(currentEnemyProjectile.position.x - ((screenSize.width/kLaserSpeed)* dtSixty), currentEnemyProjectile.position.y);

また、画面の中央に存在し、宇宙船で発射物を発射するために回転する特定の敵が 1 つあります。したがって、宇宙船が敵とは異なる y 位置にある場合、発射物スプライトは回転して移動します。宇宙船の位置に移動するため、y 軸も移動する必要があります。

私は現在、これを達成するためにコードを使用しています:

float xDiff = ((screenSize.width/kLaserSpeed)* dtSixty);
float yDiff = (xDiff / 57) * currentEnemyProjectile.rotation;

currentEnemyProjectile.position = ccp(currentEnemyProjectile.position.x - xDiff, currentEnemyProjectile.position.y + yDiff);

私はこれを一時的な修正として解決しましたが、それが最適な方法ではないことはわかっています。それはある程度機能しますが、x 軸に沿った動きから y オフセットを計算していると、y 軸に沿ってさらに移動する必要がある場合、発射体はより速く移動します。理想的には、それらがさらに上または下に移動している場合は、x 軸に沿ってゆっくりと移動する必要があります。これにより、どの軌道でも移動速度が一定になります。(私はそれを十分に説明したことを願っています)

最後に数学のレッスンを受けてから約 10 年が経ちました。そのため、私の幾何学/三角法はかなりぼやけている/存在しません。

また、cocos2d アクションを使用せずにこれを実行したいことにも注意してください。ゲームの一部として時間の流れを操作するために現在行っているように、フレームごとにスプライトを移動したいので、cocos2d アクションが提供できる以上の制御が必要です。

助けてくれてありがとう。

4

2 に答える 2

0

開始位置、角度、および距離を使用して位置を見つけるための式は、次のとおりです。

ccp( x + ( distance * sin( angle ) ), y + ( distance * cos( angle) ) )

この数式の角度は、度ではなくラジアンである必要があることに注意してください。次のように度をラジアンに変換できます。

radians = degrees * PI / 180
于 2013-02-19T16:48:26.023 に答える
0

これを試して。プレイヤーへのベクトルを知っているので、トリガーは必要ないことに気づきました。vとhを計算する必要があるのは一度だけなので、これらの値を保存し、すべてのフレームで計算する必要はありません。

// Vector from enemy to player
CGPoint v = enemy.position - player.position;

// distance from enemy to player (sqrt of the dot product of v with v)
float h = sqrt(v.x*v.x+v.y*v.y);

// Desired distance to move along v
delta = ((screenSize.width/kLaserSpeed)* dtSixty);

// delta/h is the % moved along v, find the % moved in the x and y direction 
xDiff = v.x * delta/h;
yDiff = v.y * delta/h;
于 2013-02-19T10:51:44.813 に答える