上記のコードを理解したいですか?? はいの場合、ここにいくつかの説明があります。
上記のコードには 2 つの関数があります。最初の関数「applyVelocity」は、「velocity」、「current position」、および「dela」を受け取り、現在の位置に速度とデルタを追加した後に新しい位置を返します。
Sneaky Joystick は速度 (方向と大きさ) を提供することに注意してください。これを使用して、移動する方向と移動量を確認する必要があります。
if (hudLayer.rightJoystick.velocity.x != 0 && hudLayer.rightJoystick.velocity.y != 0)
上記の行は、速度の X および Y 成分が 0 でないかどうかをチェックします。これは、ジョイスティックがアクティブで動いていることを意味します。
CCSprite* sp = [CCSprite spriteWithFile:@"red.png"];
sp.position = player.position;
[self addChild:sp z:10];
ここでは、弾丸スプライト「sp」を作成し、その位置をプレーヤーと同じ位置に設定してから、そのスプライトをレイヤーに追加して、表示されるようにします。
弾丸スプライトが作成されたので、移動する必要があります。
CGPoint vel = hudLayer.rightJoystick.velocity;
CCLOG(@"%.5f //// %.5f",vel.x,vel.y);
vel = ccpMult(ccpNormalize(vel), 50);
sp.position = applyVelocity(vel,player.position, 50);
上記のコードでは、ジョイスティックから速度を取得し、ジョイスティックの現在の状態を取得し、その速度ベクトルに 50 (任意) を掛けてから、「applyVelocity」関数を呼び出して弾丸スプライトの新しい位置を計算します。そして、その新しい位置を弾丸「sp.position」に割り当てます。
コードのコメントに記載されているように、 tick() メソッドで「canShootWithRightJoystick」関数を呼び出していると仮定します。したがって、この関数は、スケジュール セレクターで指定した間隔で何度も呼び出されます。呼び出されるたびに、ジョイスティックの速度をチェックし、新しい弾丸スプライトを作成してその位置を更新します。
しかし、問題は、位置 A でスプライトを作成し、すぐにその位置を B に変更していることです。そのため、弾丸が A から B に移動するのが見えません。また、計算ポイント B が画面から離れている場合は、次のように表示されます。何もありません。
コンソール ログを確認し、新しいログを追加して、速度を適用する前と速度を適用した後の "sp.position" の値を確認します。
CCLOG(@"Postion of bullet before: %.5f //// %.5f",sp.position.x,sp.position.y);
sp.position = applyVelocity(vel,player.position, 50);
CCLOG(@"Postion of bullet after: %.5f //// %.5f",sp.position.x,sp.position.y);
「canShootWithRightJoystick」関数の最後の行を上記のコードに置き換えて、コンソールで出力を確認します。
お役に立てば幸いです。
編集: CCMoveBy ソリューションは、sneakyInput ジョイスティックを使用して弾丸をアニメーション化するために機能しました。以下は、更新された「canShootWithRightJoystick」関数です。
-(void)canShootWithRightJoystick { //called in tick method
if (hudLayer.rightJoystick.velocity.x != 0 && hudLayer.rightJoystick.velocity.y != 0) {
CCSprite* sp = [CCSprite spriteWithFile:@"red.png"];
sp.position = player.position;
[self addChild:sp z:10];
CGPoint vel = hudLayer.rightJoystick.velocity;
vel = ccpMult(ccpNormalize(vel), 1000);
[sp runAction:[CCMoveBy actionWithDuration:3 position:vel]];
}