如何在Sprite Kit中制作动画按钮

时间:2014-07-20 13:53:14

标签: ios objective-c xcode ios7 sprite-kit

我一直在尝试实现一种方法,用户可以按下播放按钮,然后将纹理更改为按下的图像。然后,如果用户决定不继续他们的行动。比如开始游戏。然后他们可以简单地拖出精灵的框架/身体,然后不再将触摸检测为将开始动作的那个。

这个实现的问题是,如果用户拖动到播放按钮的精灵框架之外,我就无法取消按钮取消。

您将在下面看到的代码没有场景之间的转换,因为我想在必须始终退出应用程序以尝试按钮之前测试按钮的可用性。

另外,我已经在.h文件中声明了大多数对象。

来自MenuScene.m的代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    //Touch detection declaration
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInNode:self];
    touchNode = [self nodeAtPoint:touchLocation];

    if([touchNode.name isEqualToString:@"playButton"]){
        [playButtonSprite runAction:changePlayButtonTextureON];
    }else{}

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    if ([touchNode.name isEqualToString:@"playButton"]) {
        [playButtonSprite runAction:changePlayButtonTextureOFF];
    }
}

我还想知道是否有另一种方法来检测触摸是否在播放按钮精灵节点上。但是,当我找到前一个问题的解决方案时,这可以解决。

2 个答案:

答案 0 :(得分:1)

处理此问题的最佳方法是将SKSpriteNode子类化以处理它自己的触摸。您可以在GitHub上的project中看到这样的实现。当触摸超出节点边界时,它会取消触摸。

您发布的现有代码非常好,因为当触摸结束播放按钮的界限时,代码将不会被调用。

在您的情况下,由于您正在处理场景本身的触摸,因此只要在节点边界外检测到触摸,就可以显式设置playButton的纹理。

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInNode:self];
    touchNode = [self nodeAtPoint:touchLocation];

    if(![touchNode.name isEqualToString:@"playButton"]){
        [playButtonSprite runAction:changePlayButtonTextureOFF];
    }
}

答案 1 :(得分:0)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    //Touch detection declaration
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInNode:self];
    touchNode = [self nodeAtPoint:touchLocation];

    if([touchNode.name isEqualToString:@"playButton"]){
        [playButtonSprite runAction:changePlayButtonTextureON];
        playButtonSprite.isON = YES;
    }else{}
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if (playButtonSprite.isON) {
        if ([touchNode.name isEqualToString:@"playButton"]) {  // The user really wants to play!
            [self startPlaying];
        }
        [playButtonSprite runAction:changePlayButtonTextureOFF];
        playButtonSprite.isON = NO;
    }
}

changePlayButtonTextureON还将playButtonSprite.isON设置为YES,反之亦然。

您需要为SKSpriteNode创建playButtonSprite的子类,并在那里添加该布尔属性isON