所以,我已经开始在SpriteKit上开展一个项目了,我希望能够实现一个主菜单"有几个按钮的场景。一个人将进入一个关卡选择屏幕,一个是选项等等。然后从关卡选择屏幕中,会有几个其他按钮在选择时会启动游戏并加载所选关卡。
我的问题是:如何设置项目?每个屏幕(级别选择,主菜单,选项)是否应该是自己的场景并且有一个主视图控制器?或者我应该有多个视图控制器吗?或者可能是每个级别的视图控制器(虽然这并没有太多意义),它由故事板中的NavigationController控制?
稍微玩了一下并在线阅读后,我注意到我可以使用视图控制器为我的主菜单添加UIButtons。然而,他们坚持通过精灵套件场景变化,这不是我想要的。这意味着我必须设置隐藏在每个显示的新场景上的按钮,这让我很担心,因为我不确定按钮究竟发生了什么。我知道可以用SKSpriteNodes创建按钮(类似于Graf发布的类和许多人使用的类)。这是更好的选择吗?我没有在VC上使用UIButton,而是检查touchBegan方法和touchesEnded方法是否触摸了该按钮节点,如下所示:
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文件
加载它们,而不是为每个级别单独实现我还在考虑是否可以为按钮设置动画。我想我会希望它们在选中时浮动或变大(当用户触摸它但不放手时),并且我相信UIButton不会允许它,因为它不是SKSpriteNode。
很抱歉这么长的帖子,但希望能提供足够的信息来帮助我,让我走上正轨!谢谢!
答案 0 :(得分:7)
如果您想要一个简单的菜单,您可以使用 SpriteKit 创建它,但如果您想要一个复杂的菜单,您应该使用 UIKit 。
让我们假设您要创建一个具有CoverFlow效果的关卡选择菜单,这将很难在 SpriteKit 上从头开始实现,但对于 UIKit 您可以找到像iCarousel这样的库,轻松实现令人惊叹的CoverFlow和滚动效果。
SKLabelNode 目前只支持一个文本行,所以如果你想在你的游戏中添加一个非常长的消息很困难,但如果你使用UIKit,你可以使用UITextView来显示你的很长的消息。
使用 UIKit 可以更轻松地创建详细的In App Purchases菜单。
UIKit会避免让你头疼,我真的鼓励你使用它。
该如何设置项目?
你只需要一个场景
MenuviewController->(推送Segue) - > LevelSelectionController->(推送Segue) - > GameScene
我想我会希望它们在选中时漂浮或变大(当用户触摸但不放手时),我相信UIButton不允许它,因为它不是一个SKSpriteNode。
您可以使用UIView animateWithDuration 或 CABasicAnimation
向UIButton添加动画这意味着我必须设置按钮以隐藏在每个显示的新场景
上
用函数
解决它- (void)setHidden:(BOOL)hide {
UIButton *tmpButton = (UIButton *)[self.view viewWithTag:100];
tmpButton.hidden = hide ? YES : NO;
}
像这样隐藏
[self setHidden:YES];
希望有所帮助
祝你好运!
答案 1 :(得分:2)
虽然@ Albert的答案很好,但我一直只使用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
}
}
希望这有帮助!
答案 2 :(得分:0)
几个月前,当我开始使用spriteKit构建游戏时,我遇到了这个问题。
我的回答并不是很明确,但这是我的建议:对于游戏中我会以编程方式设置UI - 看起来很多工作但是对于视频游戏来说实际上并没有那么糟糕。 但是一些菜单可能在故事板设置或xib文件中 - 如主菜单,以及游戏外的不同子菜单。
对于触摸,将该功能添加到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];