难以使用SKScene将任务游戏委托给UIViewController

时间:2014-02-26 13:55:26

标签: ios uiviewcontroller sprite-kit skscene skview

我有两个UIViewControllers。用户以 UIViewController 开头。然后用户点击按钮来玩游戏。因此,应用程序会切换到另一个视图控制器 PlayViewController ,它会显示使用 SKView 的游戏。 ActionScene 是一个 SKScene 子类,负责游戏。当用户失败时,应用程序将显示一个标签(SKLabelNode)并询问他或她是否想要退出游戏。如果用户点击此标签,游戏者将通过PlayViewController返回主视图控制器(UIViewController)。所以我认为ActionScene应该将此任务委托给PlayViewController。以下内容来自ActionScene。

// ActionScene.h
#import <SpriteKit/SpriteKit.h>

@protocol actionDelegate;
@interface ActionScene : SKScene

@property (weak) id <actionDelegate> delegate;
@end

@protocol actionDelegate <NSObject>
@required

// Delegate
- (void)closeScene;
@end

// ActionScene.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
    SKNode *n = [self nodeAtPoint:[touch locationInNode:self]];
        if (n != self && [n.name isEqual: @"doneLabel"]) { // It was else if before.  I've made a change.
            [[self childNodeWithName:@"doneLabel"] removeFromParent]; // The user chooses to end the game by tapping doneLabel (SKLabelNode)
            [self.delegate closeScene];
        }
    }
}

对于PlayViewController,它负责向SKView呈现ActionScene,并将用户发送回UIViewController,如下所示。

// PlayViewController.h
#import "ActionScene.h"

@interface PlayViewController : UIViewController <actionDelegate>
@property (strong,nonatomic) ActionScene *actionScene;

@end

// PlayViewController.m
- (void)viewWillLayoutSubviews {
    SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:spriteView];

    SKScene *scene = [[ActionScene alloc] initWithSize:spriteView.frame.size];
    [self.actionScene setDelegate:self]; // Letting ActionScene delegate a task to itself
    [spriteView presentScene:scene];
}

- (void)closeScene {
    // It doesn't get a call from ActionScene
}

因此,当用户点击完成标签时,closeScene旨在启动。但此委托方法永远不会接到调用。我在过去的9个月里没有开发过iOS应用程序。但我认为我有正确的想法。我究竟做错了什么?到目前为止,我已阅读this topicthis topic和其他人。

感谢您的帮助。

//其他解释//

  1. 在用户点击doneLabel之前删除所有操作。
  2. 游戏应用程序将进入touchBegan。然而,它会跳过[spriteView presentScene:scene]行。

2 个答案:

答案 0 :(得分:0)

我实现了你的代码,一切都像魅力一样。在一行上设置断点:

[self.delegate closeScene];

看看它是否被调用。

答案 1 :(得分:0)

关于this post,我的绝望措施已经解决了。对PlayViewController.m进行了以下更改,以将用户带回UIViewController。

- (void)viewWillLayoutSubviews {
    SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:spriteView];

    SKScene *scene = [[ActionScene alloc] initWithSize:spriteView.frame.size];
    [self.actionScene setDelegate:self]; // Letting ActionScene delegate a task to itself
    [spriteView presentScene:scene];
}

- (void)viewWillLayoutSubviews {        
    SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:spriteView];

    ActionScene *scene = [ActionScene sceneWithSize:spriteView.bounds.size];
    [scene setDelegate:self];
    [spriteView presentScene:scene];
}

现在,我可以全速前进我的游戏开发而不用担心。