0

RunAction で 2 つのパラメーターを送信する方法はありますか?

上にラベルが付いたスプライトを移動しようとしているのがわかります。それぞれに別の関数を作成しました。これに似ています。

     [sprite runAction:
 [CCSequence actions:actionMove, actionMoveDone, nil]];


id actionMoveDone = [CCCallFuncN actionWithTarget:self
                                         selector:@selector(spriteLabelMoveFinished:)];

ここで、2 つの質問があります。1-2 つ以上のパラメーターを送信する方法はありますか???? 2-メモリを節約し、両方を1つのアクションで実行する方法があるかどうか疑問に思っていましたか?

    - (void) spriteMoveFinished:(id)sender
{
CCLOG(@"Sprite move finished");
Sprites *sprite = (Sprites *)sender;

[self animateSprite:sprite];

}


- (void) animateSprite:(Sprites *)zprite
    {
CCLOG(@"We're animating sprite"):

Sprites *sprite = nil;

sprite = zprite;


int actualDuration = sprite.speed; //property of sprite

// Create the actions

id actionMove = [CCMoveBy actionWithDuration:actualDuration
                                    position:ccpMult(ccpNormalize(ccpSub(_player.position,sprite.position)), 10)];

id actionMoveDone = [CCCallFuncN actionWithTarget:self
                                         selector:@selector(spriteMoveFinished:)];
[sprite runAction:
 [CCSequence actions:actionMove, actionMoveDone, nil]];


}


- (void) spriteLabelMoveFinished:(CCLabelTTF *)sender
{   

[self animateSpriteLabel:sender];   
}

-(void)animateEnemyHP:(CCLabelTTF *)zpriteLabel
{


CCLabelTTF *spriteLabel = nil;

spriteLabel = zpriteLabel;


int actualDuration = spriteSpeed; //another property


id actionMove = [CCMoveBy actionWithDuration:actualDuration
                                    position:ccpMult(ccpNormalize(ccpSub(_player.position,spriteLabel.position)), 10)];

id actionMoveDone = [CCCallFuncN actionWithTarget:self
                                         selector:@selector(spriteLabelMoveFinished:)];
[spriteLabel runAction:
 [CCSequence actions:actionMove, actionMoveDone, nil]];

}

さて、この4つの機能はちょっと明白です。

1-Move Sprite スプライトの移動が終了したら、もう一度移動します。2-同じ速度で同じ位置に向かってラベルを移動します。ラベルの移動が終了したら、もう一度移動します。

二人は同じ場所に行く。この4つの機能を2つに混ぜる方法はありますか? その場合、アクションが終了したときに 2 つのパラメーターを送信するにはどうすればよいですか? あなたの助けとあなたの時間をありがとう、素晴らしい一日を!

4

2 に答える 2

0

複数のパラメータを送信するには、代わりに CCCallFunc を使用して CCCallBlock を使用し、コード ブロックを呼び出します。ブロック内で、任意のパラメーターを使用してメソッド (セレクター) を呼び出すことができます。

簡単な例:

  CCAction *actionMoveDone = [CCCallBlock actionWithBlock:^()
                                   {
                                       [self spriteMoveFinished:param1 withParam2:param2 andParam3:param3];
                                   }];

より良い方法は、メモリ割り当てを防ぐために、ブロック パラメーターとして「self」を使用することです。

  CCAction *actionMoveDone = [CCCallBlockN actionWithBlock:^(CCNode *myNode)
                                   {
                                       [(MyClass*)myNode spriteMoveFinished:param1 withParam2:param2 andParam3:param3];
                                   }];
于 2013-06-11T01:53:42.603 に答える
0

それは間違いなく「メモリ」を節約します...私は通常、CCNodeを拡張するクラスでこれを行います。たとえば、私のSoldierMapLayoutクラスはそうします。SoldierMapLayout ノードでは、兵士のスタンス アニメーション (アイドル、右から左、上下に歩く)、ヘルス バー、オプションのラベル、適切な場合は「HP ヒット」アニメーション、適切な場合は「XP 獲得」アニメーションを配置しました。 、頭の上の「毒雲」など...そして、全体を動かす必要があるときにノードを動かします。移動の完了時に 1 つのコールバックを伴う、1 つのアニメーション。

于 2013-06-10T21:30:43.477 に答える