Sprite Kit:如何在运行场景之上添加场景
Posted
技术标签:
【中文标题】Sprite Kit:如何在运行场景之上添加场景【英文标题】:Sprite Kit: How to add scene on top of running scene 【发布时间】:2014-02-15 17:22:24 【问题描述】:所以我正在努力将我的 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];
但为了简单起见,当我重新启动关卡时,我不会重置所有内容的状态,我只是再次推动游戏场景,它不喜欢它,因为它在技术上仍在运行。
无论如何,覆盖需要触摸事件的菜单的正确方法是什么?
【问题讨论】:
尝试简单地将游戏添加为 SKNode 而不是 SKScene,并将其 setUsserInteractionEnabled 设置为 YES。 使用 kobold 工具包,您可以像 cocos2d 中一样获得 pushScene 和 popScene 方法 【参考方案1】:所以我最终在游戏结束时使用了 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;
...
一切正常,游戏结束出现在正在运行的游戏之上,并且可以获得输入。
【讨论】:
以上是关于Sprite Kit:如何在运行场景之上添加场景的主要内容,如果未能解决你的问题,请参考以下文章
在 Sprite Kit 场景中创建带有重复图像的栏 - iOS