两个“选定”精灵节点中只有一个执行动作

时间:2016-03-02 18:43:55

标签: ios objective-c cocoa-touch sprite-kit

我正在尝试突出显示两个SKSpriteNodes,当两个都突出显示时,让它们从屏幕淡出。我的代码目前看起来像这样:

// BOOL variables to indicate whether sprite is highlighted    
// Declared after the @implementation
BOOL sprite1Touch = NO;
BOOL sprite2Touch = NO;

然后触摸方法:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    /* Called when a touch begins */
    for(UITouch *touch in touches)
    {
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInNode:self];
        SKNode *Sprite1 = [self nodeAtPoint:location];
        SKNode *Sprite2 = [self nodeAtPoint:location];

        // Resize action to highlight a sprite has been touched.
        SKAction *highlightedSprite = [SKAction scaleTo:0.55 duration:0.2];

        // Action to unhighlight by setting sprite size back to normal.
        SKAction *unhighlightedSprite = [SKAction scaleTo:0.5 duration:0.2];

        // Action to fade out sprites 
        SKAction *fadeOut = [SKAction fadeOutWithDuration:0.2];

        // Action to remove from parent
        SKAction *remove = [SKAction removeFromParent];

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

            if (sprite1Touch == NO)
            {
                // if unhighlighted sprite is touched, highlight.
                [Sprite1 runAction:highlightedSprite];
                sprite1Touch = YES;
            }
            else if (sprite1Touch == YES)
            {
                // if highlighted sprite is touched, unhighlight.
                [Sprite1 runAction:unhighlightedSprite];
                sprite1Touch = NO;
            }
        }

        else if ([Sprite2.name isEqualToString:@"Sprite2"])
        {
            if (sprite2Touch == NO)
            {
                // if unhighlighted sprite is touched, highlight.
                [Sprite2 runAction:highlightedSprite];
                sprite2Touch = YES;
            }
            else if (sprite2Touch == YES)
            {
                // if highlighted sprite is touched, unhighlight.
               [Sprite2 runAction:unhighlightedSprite];
                sprite2Touch = NO;
            }          
        }

        // if both sprites are highlighted, fade out both of them and remove from parent
        if (sprite1Touch == YES && sprite2Touch == YES)
        {
            [Sprite1 runAction:fadeOut];
            [Sprite2 runAction:fadeOut];
            [Sprite1 runAction:remove];
            [Sprite2 runAction:remove];
        }
    }
}

当我在模拟器中运行它时,突出显示/取消突出显示一个精灵可以正常工作。但是,当两者都突出显示时(因此意味着两者都应该淡出),只有最后一次触摸的精灵实际上淡出。我必须取消强光,然后再次突出显示第一个触摸的精灵,以便淡出。

有谁知道如何解决这个问题,让两个精灵同时淡出?

1 个答案:

答案 0 :(得分:0)

您的逻辑存在问题。

每次触摸时,您都会将Sprite1Sprite2(以及另一个您似乎没有使用的指针,node)分配给同一个对象

因此,当你到达最后的if语句块时,你会告诉同一个SKSpriteNode“淡出”和“删除”两次。

你需要找到一些方法来保持对先前选择的精灵的引用,可能使用一对ivars而不是局部变量。