如何在Objective-C的Sprite-Kit项目中的MyScene以外的类中调用更新方法?



所以我正在制作一款基于Objective-C Sprite-Kit的游戏。我对Objective-C相当陌生,所以我似乎被一些涉及更新方法的东西卡住了。

通常在默认的Sprite-Kit项目中,它会为你生成一个包含场景的视图,其中包含你想要操作的所有节点。它还附带了一个预生成的空更新方法,从那时起我就用自己的方法替换了它(它工作得很好)。但是我不希望我的更新方法基于MyScene类,这就是我的问题所在。如果我将更新方法留在MyScene类中,我可以看到使用NSLog,它实际上会像它应该的那样不断被调用,但如果我将它移动到viewcontroller类中,它根本不会被调用。

我的问题是我如何去让它调用更新方法在一个类以外的MyScene..?你可能会问我为什么要这样做,所以我会在下面解释,但没有必要回答这个问题,但是如果你对我的程序有任何建议,请告诉我!

传统Sprite-Kit Project

ViewController ->创建一个MyScene(它只是从SKScene继承)MyScene ->创建所有节点,并具有更新方法来处理游戏逻辑/图形。

我的精灵游戏的理想结构

ViewController ->创建一个ForegroundScene和BackgroundScene(仍然继承自SKScene)ForegroundScene ->为游戏创建所有节点/角色背景场景->为游戏创建天空,云,一般景观的东西。GameController——>包含调用displayView和updateGame的update方法。

编辑:为了澄清任何混淆,ForgegroundScene和BackgroundScene本质上与最初生成的MyScene类相同,但现在有两个类重新命名,一个包含背景的东西,另一个用于前景。

Update Game仍然位于GameController类中,它只是执行碰撞测试,更新节点位置,删除被杀死的角色等操作。

DisplayView位于ViewController中,它的名字不言自明,它显示由BackgroundScene和ForegroundScene的节点组成的游戏视图。

无论如何,这是我为游戏设定的想法,不确定它是否实用。我很乐意听取建议。

这是我的预期更新方法,以防你有兴趣看到它,但就像我说的,我用NSLog测试它,它相应地滴答,但在任何其他类中它从未被调用。

-(void)update:(CFTimeInterval)currentTime
{
    const int TICKS_PER_SECOND = 35;
    const int SKIP_TICKS = 1000 / TICKS_PER_SECOND; //these ivars would be moved to top of intended class
    const int MAX_FRAMESKIP = 10;
    NSDate *referenceDate = [NSDate date];
    double timePassed_ms = [referenceDate timeIntervalSinceNow] * -1000.0;
    NSUInteger next_game_tick = timePassed_ms;
    int loops;
    bool game_is_running = true;
    while( game_is_running ) {
        loops = 0;
        while([referenceDate timeIntervalSinceNow] * -1000.0 > next_game_tick && loops < MAX_FRAMESKIP) {
            [self updateGame] //calls GameController to do logic updates/collision test, etc.
            NSLog(@"update game");
            next_game_tick += SKIP_TICKS;
            loops++;
        }
        [self displayGame]; //calls viewcontroler to display game
    }
}

你可以在每次调用-update:时将你想要通知的类设置为场景的实例变量,然后将消息转发给该类。例如,在你想要通知的类的场景中创建一个实例变量。

@interface MyScene ()
@property (nonatomic) ClassToNotify *notify;
@end

然后在您的-update:方法中,只需通知实例变量。

- (void)update:(CFTimeInterval)currentTime
{
    // pass the message on
    [self.notify notifyThatUpdateWasJustCalledWithTime:currentTime];
}

在这种情况下,-notifyThatUpdateWasJustCalledWithTime:将是您的ClassToNotify类的方法。

最新更新