所以我正在努力将我的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中做这样的事情的正确方法是什么?
我的游戏对于什么应该继承(SKNode
,SKView
,SKScene
)?
我尝试使用SKScene
,但你不能有2个正在运行的场景(或者我错了吗?),所以我将这个场景作为孩子添加到主游戏场景中。但触摸事件只是在主要游戏场景上被调用,而不是在场景上的游戏中被调用。所以我试过像
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
if (_gameOver)
{
[_gameOverScene touchAtLocation:location];
}
}
但为了简单起见,当我重新启动关卡时,我不会重置所有内容的状态,我只是再次推动游戏场景,因为它在技术上仍在运行,所以它不喜欢。
无论如何,如何覆盖需要触摸事件的菜单?
答案 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;
}
...
}
一切运作完美,游戏结束时会出现在正在运行的游戏之上,并且可以获得输入。