iOS 7 SpriteKit – 创build游戏菜单/button(场景vs更多视图控制器)

所以,我已经开始在SpriteKit中开发一个项目了,我希望能够通过几个button来实现一个“主菜单”场景。 其中一个会进入关卡select屏幕,一个是选项等。然后从关卡select屏幕上,将会有其他几个button,当select时将启动游戏并加载选定的关卡。

我的问题是这个项目应该如何build立? 每个屏幕(水平select,主菜单,选项)应该是自己的场景,并有一个主视图控制器? 或者我应该有多个视图控制器的一切? 或者,也许每个级别的视图控制器(尽pipe这没有太大的意义),这是由故事板中的NavigationControllerpipe辖?

玩了一下,在网上阅读后,我注意到,我可以使用视图控制器有我的主菜单的UIButtons。 然而,他们坚持通过精灵套件场景的变化,这是不是我想要的。 这意味着我必须设置button隐藏在显示的每个新的场景中,这使我担心,因为我不确定button到底发生了什么。 我知道可以从SKSpriteNodes创buildbutton(类似Graf发布的类,许多人已经使用过)。 这是更好的select吗? 而不是在VC上使用UIButtons,我会检查touchBegan方法和touchesEnded方法中的button节点是否触摸,如下所示:

UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInNode:self]; SKNode *node = [self nodeAtPoint:location]; if ([node.name isEqualToString:@"scene button"]) { LevelScene *scene = [LevelScene sceneWithSize:self.view.bounds.size]; scene.scaleMode = SKSceneScaleModeAspectFill; [self.view presentScene:scene]; } 

这是处理它的正确方法吗?

最终我会希望能够添加暂停屏幕,游戏屏幕等,并确定是否只是交换场景就足够了。 此外,我可以从.plist文件加载它们,而不是为每个级别单独实施

我也在考虑是否可以使button动起来。 我想我会希望他们浮动四周或select(当用户已经触摸它,但不放手)更大,我相信,UIButton不会允许它,因为它不是一个SKSpriteNode。

对不起,这么长的一篇文章,但希望能够提供足够的信息来帮助我,让我走上正轨! 谢谢!

如果你想要一个简单的菜单,你可以用SpriteKit创build它,但是如果你想要一个复杂的菜单,你应该使用UIKit

假设您要创build一个带有CoverFlow效果的关卡select菜单,这将很难从头开始在SpriteKit上实现,但是对于UIKit,您可以find像iCarousel这样的库,可以轻松实现令人惊叹的CoverFlow和滚动效果。

SKLabelNode到目前为止只支持一个文本行,所以如果你想在游戏中添加一个非常长的消息,这将是困难的,但如果你使用UIKit,你可以使用UITextView来显示你的长消息。

使用UIKit可以更轻松地创build详细的“应用内购买”菜单。

UIKit会避免你很多头痛,我真的鼓励你使用它。

该如何build立项目?

你只需要1场景

MenuviewController – >(Push Segue) – > LevelSelectionController – >(Push Segue) – > GameScene

我想我会希望他们浮动四周或select(当用户已经触摸它,但不放手)更大,我相信,UIButton不会允许它,因为它不是一个SKSpriteNode。

您可以使用UIView animateWithDurationCABasicAnimation将animation添加到UIButton

这意味着我将不得不设置button隐藏在每个新的场景显示

解决它与一个函数

 - (void)setHidden:(BOOL)hide { UIButton *tmpButton = (UIButton *)[self.view viewWithTag:100]; tmpButton.hidden = hide ? YES : NO; } 

像这样隐藏它

 [self setHidden:YES]; 

希望能帮助到你

祝你好运!

虽然@艾伯特的答案是一个很好的答案,但我总是使用SKLabelNode。 这是一个已经在SpriteKit框架内部的类,不需要使用手势。

这让你想知道,它对行为有什么反应? 那实际上很简单。

我只是使用touchesBegan:withEvent:方法,并检查标签节点是否被按下。 这是一个例子。

 // in .m file @interface ClassName () { SKLabelNode *menuItem1; SKLabelNode *menuItem2; } @implementation - (id) initWithSize:(CGSize)size // can't fully remember this one... { if(self = [super initWithSize:size]) { // here you create your labels menuItem1 = [SKLabelNode labelNodeWithFontNamed:@"Your font."]; // this will position this at the center, top 1/3 of the screen menuItem1.position = CGPointMake(self.frame.size.width/2, self.frame.size.height * .3); menuItem1.text = @"Menu 1"; [self addChild:menuItem1]; // takes care of the first menuItem2 = [SKLabelNode labelNodeWithFontNamed:@"Your font."]; // place at center, lower 1/3 of screen menuItem2.position = CGPointMake(self.frame.size.width/2, self.frame.size.height * .6); menuItem2.text = @"Menu 2"; [self addChild:menuItem2]; } return self; } - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *t = [touches anyObject]; CGPoint touchLocation = [t locationInNode:self.scene]; if(CGRectContainsPoint(menuItem1.frame, touchLocation)) { // do whatever for first menu } if(CGRectContainsPoint(menuItem2.frame, touchLocation)) { // do whatever for second menu } } 

希望这可以帮助!

几个月前我遇到了这个问题,当时我开始用spriteKit构build我的游戏。

我的回答并不是很确定,但这里是我的build议:对于游戏内部,我将以编程的方式设置用户界面 – 看起来很多工作,但对于video游戏来说,其实并没有那么糟糕。 但是有些菜单可能在故事板设置或xib文件中 – 比如主菜单和游戏外的不同子菜单。

触摸function添加到你的scene.m

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

然后你可以使用CGRectContainsPoint();

或者你可以添加一个UITapGestureRecognizer到你的视图控制器。

 UITapGestureRecognizer * recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; recognizer.delegate = self; [view addGestureRecognizer:recognizer]; 

在SKScene中设置button