我是编程和Obj-c的新手,并且正在寻找一些我正在遇到的问题的清晰度。我正在使用故事板来呈现我的游戏的每个页面,并且在主游戏场景中,我有代码在某个时间实例化Game Over屏幕,但我担心我调用新场景的方式不是得到我想要的东西的正确方法。
目前主要场景继续在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];
}
我希望我的目标很明确,如果不是,请告诉我,我会尝试改写一些事情。
答案 0 :(得分:0)
视图控制器的工作方式是它们将一直处于活动状态,直到它们被“弹出”或“解除”。由于您在游戏页面上呈现模态视图,因此游戏页面仍在内存中,并且如果您愿意,可以继续执行操作。
一个非常常见的设计模式是“underneath”页面 - 创建和呈现模态视图控制器的页面应该通过名为protocol / delegate的机制来解除它。它能做到的唯一方法是,如果它仍处于活动状态,并且因为它仍处于活动状态 - 其他代码也可以正在运行。
我不确定你的游戏会在“游戏结束”视图出现后发生什么?可以开始新游戏,如果是,他们从哪里开始?无论如何,导航总是因应用程序而异。
我想到的一个想法是返回到一个基本导航点并从该控制器显示您的起始页面和游戏页面,当您的游戏结束时,让活动视图控制器“弹出”回到根控制器它可以在游戏中呈现视图。然后就这样,如果你想“重新开始”,一个简单的“弹出”或“解雇”会让你回到起初你想要游戏开始的地方。
要实际实现这一点,您需要一个UINavigationController。既然你提到你使用了故事板和segue,那么排列连接到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];
我希望这个想法在某种程度上有所帮助。有时候让您的导航按照您希望的方式工作可能具有挑战性。