0

ゲームのメニュー ボタンとして SKLabelNode を使用しようとしています。

左上、右上、左下、右下の4つのボタンがあります

私はそれらに名前を付けて、接触しているノードをキャッチできるようにしましたが、ラベルの名前を別の名前に変更すると、機能せず、新しい名前のアクションを実行する代わりに両方のアクションを実行します

コードの例を次に示します。

初期化 :

    buttonUpLeft.name = @"UpLeft";
    buttonUpRight.name = @"UpRight";
    buttonDownLeft.name = @"DownLeft";
    buttonDownRight.name = @"DownRight";

touchBegan :

UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKLabelNode *node = (SKLabelNode*) [self nodeAtPoint:location];


if ([node.name isEqualToString:@"DownLeft"]) {

        ...
        buttonUpLeft.name = @"Attack";
        buttonUpRight.name = @"Cry";
        buttonDownLeft.name = @"Execution";
        buttonDownRight.name = @"Back";
        ...
}

if ([node.name isEqualToString:@"Back"]) {

    ...
    buttonUpLeft.name=@"UpLeft";
    buttonUpRight.name=@"UpRight";
    buttonDownLeft.name=@"DownLeft";
    buttonDownRight.name=@"DownRight";
    ...
}

if ([node.name isEqualToString:@"Attack"]) {
    ...
}

if ([node.name isEqualToString:@"Cry"]) {   
    ...
}

if ([node.name isEqualToString:@"Execution"]) {
    ...
}

if ([node.name isEqualToString:@"DownRight"]) {
    ...
} 

しかし、「実行」または「ダウンレフト」をクリックすると、同時に起動し、「バック」と「ダウンライト」についても同じことが言えます

これを避けるためのアイデアはありますか?

4

1 に答える 1

0

ほとんどの場合、if ブロックの作成方法に問題があります。

たとえば、「DownLeft」ボタンが押された場合、DownLeft が処理された後にその名前が「Execution」になるため、DownLeft と Execution ブロックの両方が実行され、両方の if ブロックが同じタッチで実行されます。

if ([node.name isEqualToString:@"DownLeft"]) {

        ...
        buttonDownLeft.name = @"Execution";
        ...
}

if ([node.name isEqualToString:@"Execution"]) {
    ...
}

nodebuttonDownLeftが同じノードを指していることに注意してください。

あなたがすべきことは、ボタンタッチ処理ブロック全体で if / else if so を使用することです:

if ([node.name isEqualToString:@"DownLeft"]) {

        ...
        buttonDownLeft.name = @"Execution";
        ...
}
else if ([node.name isEqualToString:@"Execution"]) {
    ...
}

また、ブレークポイントを設定してコードをステップ実行する方法についてもお読みください。このようなことは、デバッガーで非常に簡単に分析できます。

于 2014-06-07T16:52:36.410 に答える