0

我是编程和 Obj-c 的新手,正在寻找一些关于我遇到的问题的清晰度。我正在使用故事板来展示我游戏的每一页,在主游戏场景中,我有代码可以在某个时间实例化 Game Over 屏幕,但我担心我调用新场景的方式不是获得我所追求的正确方法。

目前,主场景继续在 Game Over 屏幕下运行,相反我希望它停止游戏场景中的所有内容,只有得分值被传输到 Game Over 页面。

我当前加载游戏结束屏幕的代码:

-(void)goGameOver
{
//Send to Game Over screen
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"gameOverPage"];
vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:vc animated:NO completion:NULL];
}

我希望我的目标很明确,如果没有,请告诉我,我会尝试重新措辞。

4

1 回答 1

0

视图控制器的工作方式是它们将继续处于活动状态,直到它们被“弹出”或“解雇”。由于您在游戏页面上呈现模式视图,因此游戏页面仍在内存中,并且可以继续执行您想要的操作。

一种非常常见的设计模式是“底层”页面——创建和呈现模式视图控制器的页面应该通过称为协议/委托的机制将其关闭。它可以做到这一点的唯一方法是它仍然处于活动状态并且因为它仍然处于活动状态 - 其他代码也可以运行。

我不确定在您的游戏中出现“游戏结束”视图后会发生什么?可以开始新游戏吗?如果可以,它们从哪里开始?无论如何,导航总是会因应用程序而异。

我的一个想法是返回基本导航点并从该控制器呈现您的起始页面和游戏结束页面,当您的游戏结束时,让活动视图控制器“弹出”回它可以呈现的根控制器游戏概览。这样,如果你想“重新开始”,一个简单的“pop”或“dismiss”就会让你回到你希望游戏从头开始的地方。

要真正做到这一点,您需要一个 UINavigationController。由于您提到您使用的是故事板和转场,因此排列附加到 UINavigation 控制器的视图控制器是很常见的。

如果是这种情况,您可以使用标志或对象来确定游戏已经开始,并使用相同的标志来确定游戏结束。

因此,例如,在导航堆栈中的第一个视图控制器上,您可能有一些如下逻辑:

-(void)viewWillAppear:(BOOL)animated {

     if(self.gameStarted == NO){
         self.gameStarted = YES;
         [self performSegueWithIdentifier:@"startGame"];
}
else {
        self.gameStarted = NO;
        [self performSegueWithIdentifier:@"endGame"];
}

现在,当您确定游戏结束时,在该视图控制器中并且它应该在导航堆栈中,您需要像这样“弹出”回第一个控制器:

[self.navigationController popToRootViewControllerAnimated:YES];

我希望这个想法在某种程度上有所帮助。有时让您的导航以您希望的方式工作可能具有挑战性。

于 2012-11-25T20:24:40.620 回答