Sprite Kit:如何在运行场景的顶部添加场景

时间:2014-02-15 17:22:24

标签: ios objective-c sprite-kit

所以我正在努力将我的cocos2d游戏移植到Sprite Kit。

在cocos2d中我有两种情况可以覆盖整个游戏场景中的菜单。第一种情况是暂停,第二种情况是游戏结束。

在cocos2d游戏结束时我做了

CCScene *runningScene = [[CCDirector sharedDirector] runningScene];
WaveEndLayer *waveEndedLayer = [[WaveEndLayer alloc] initWithWon:didWin];
[waveEndedLayer setOpacity:0];
[runningScene addChild:waveEndedLayer z:kZHUD];
CCFadeTo *fadeIn = [CCFadeTo actionWithDuration:0.5 opacity:255];
[waveEndedLayer runAction:fadeIn];

WaveEndLayer类上有一些CCMenuItems,cocos2d处理了将触摸事件传递给它们的处理程序。

在sprite kit中做这样的事情的正确方法是什么?

我的游戏对于什么应该继承(SKNodeSKViewSKScene)?

我尝试使用SKScene,但你不能有2个正在运行的场景(或者我错了吗?),所以我将这个场景作为孩子添加到主游戏场景中。但触摸事件只是在主要游戏场景上被调用,而不是在场景上的游戏中被调用。所以我试过像

这样的东西
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];

    if (_gameOver)
    {
        [_gameOverScene touchAtLocation:location];
    }
}

但为了简单起见,当我重新启动关卡时,我不会重置所有内容的状态,我只是再次推动游戏场景,因为它在技术上仍在运行,所以它不喜欢。

无论如何,如何覆盖需要触摸事件的菜单?

1 个答案:

答案 0 :(得分:4)

所以我最终在我的游戏中使用了SKNode。

我将这个图层作为孩子添加到我的游戏场景中init方法。

_gameOverLayer = [[GameOverLayer alloc] initWithSize:size];
_gameOverLayer.alpha = 0;
[self addChild:_gameOverLayer];

我的游戏方法如下:

- (void)gameOver
{
    _gameOver = YES;
    SKAction *fade = [SKAction fadeInWithDuration:0.5];
    [_gameOverLayer runAction:fade];
}

然后我改变了我在游戏场景中的触摸方法来实现这个目标:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];

    if (_gameOver)
    {
        [_gameOverLayer touchesEnded:touches withEvent:event];
        return;
    }
    ...
}

一切运作完美,游戏结束时会出现在正在运行的游戏之上,并且可以获得输入。