0

弾丸を撃つためにこっそりジョイスティックを使いたいです。ジョイスティックがアクティブになるたびに、ジョイスティックが指す方向にプレイヤーから弾丸を発射する必要があります。

どうやってやるの?

PS: 誰かがコードを説明できれば素晴らしいことです。私はそれを理解したいです;)

編集

static CGPoint applyVelocity(CGPoint velocity, CGPoint position, float delta){
    return CGPointMake(position.x + velocity.x * delta, position.y + velocity.y * delta);
}
-(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;
        CCLOG(@"%.5f //// %.5f",vel.x,vel.y);
        vel = ccpMult(ccpNormalize(vel), 50);
        sp.position = applyVelocity(vel,player.position, 50);

    }
}

しかし、何も起こりません:(

4

1 に答える 1

1

上記のコードを理解したいですか?? はいの場合、ここにいくつかの説明があります。

上記のコードには 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]];
     }
于 2011-04-11T06:51:28.173 に答える