iOS 7 SpriteKit - 创建游戏菜单/按钮(场景与更多视图控制器)

时间:2014-06-20 04:42:55

标签: ios objective-c uibutton

所以,我已经开始在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。

很抱歉这么长的帖子,但希望能提供足够的信息来帮助我,让我走上正轨!谢谢!

3 个答案:

答案 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];

Setting up buttons in SKScene