寻找管理游戏关卡视图、关卡选择视图、偏好视图、存储关卡、环境变量的概念

Posted

技术标签:

【中文标题】寻找管理游戏关卡视图、关卡选择视图、偏好视图、存储关卡、环境变量的概念【英文标题】:Looking for concept for managing game level views, level selection views, preferences view, storing levels, environment variables 【发布时间】:2009-11-20 09:46:18 【问题描述】:

我正在为 iPhone 开发一个益智游戏应用程序 - watch on youtube,实际的“游戏内”部分几乎完成。它是一个单独的类(UIView 的子类),它使用谜题线索、谜题碎片进行初始化,并准备好在谜题解决后向某人发送消息(每次 touchesEnded 都会调用“完整性”检查)。

现在我很困扰如何以编程方式设计整个应用程序模式。

游戏需要一个主菜单视图,一个拼图选择器视图,我可以从中“创建”puzzleLevel 实例,我必须存储实际的拼图数据在一个单独的类中(我想),可能在存档文件中,并且需要一个首选项视图,我可以在其中更改“全局”变量 每个puzzleLevel 实例都应该使用(角度捕捉值、皮肤等)。

我能感觉到我必须用主viewController 来控制我上面提到的所有视图,但我不知道具体该怎么做。 我应该在哪里存储全局变量?我应该在哪里存储拼图数据?我应该如何报告“拼图完整性”,我应该为谁报告?我应该如何设计视图层次结构?

我想知道是否有人可以向我展示一些概念,或者只是一个我可以相处的链接。 我主要对概念感兴趣,实际编码部分可以“google”后。

【问题讨论】:

哇,what's 强调无处不在 我认为其目的是让长问题更容易浏览。我也这样做了,直到我意识到这会分散读者的注意力。 【参考方案1】:

通常,我的游戏顶部有一个 App 对象,它拥有多个 AppState(菜单、选择器、首选项等)之一,并根据需要在它们之间切换,这是 State 模式的典型用法。这些状态处理它们自己的渲染和输入,并存储它们需要的任何资源。 App 对象还拥有任何全局应用程序范围的设置和跨状态共享的对象(例如渲染、声音)。这些可以单独传递给状态,或者状态可以在某个时候从应用程序请求相关接口。

其中一个 AppStates 将是游戏运行状态,它包含当前谜题的定义,以及此游戏会话的当前状态(例如,它的完成程度)。我倾向于仍然有一个由相关 GamePlayingState 拥有的单独 Game 类,因为前者只包含游戏逻辑信息,而后者处理输入/输出。

【讨论】:

感谢您的回答。是不是像我使用自定义 compactTangramViewController:UIViewController 类的实例(作为 App 对象),所有视图的实例变量(@property-s)和 pref 变量?目前尚不清楚,如何将它们“连接”在一起。状态如何请求拼图选择器视图进入(它如何告诉控制器进入选择器视图)?谜题选择器如何告诉控制器初始化一个新谜题?一个谜题如何得到实际的 - 例如- 来自控制器的angleSnapDegrees? ... ... 我应该从 AppController:NSObject 继承所有内容吗?一个拼图选择器应该是一个puzzleSelector:AppController?还是 AppController 的实例变量?我很擅长在课堂上解决问题,但对我来说,组织它们似乎有点困难。总而言之:你能给我发一张关于这个想法的类层次结构/继承的草图吗? 此外, - codeproject.com/KB/architecture/statepattern3.aspx - 像这样?看起来很有希望,即使我不知道如何实现所有这些......现在是阅读部分...... 如果 viewController 运行 NSTimer,它可以从它的子视图中收集/读取任何数据,并重定向/更新/等。他们根据需要。也许它可以成为一个解决方案,但我希望有更聪明的方法来做到这一点(“仅调用用户交互”方式)。而且我仍然不知道全局变量。 我不能给你 Objective-C 的建议,只是结构的一般概述。您询问了设计模式,因此请确保您熟悉它们 - 状态模式是一种常用的模式,您可以在多个地方了解它。【参考方案2】:

我认为我应该使用 NSNotification 类。它只是在包含子视图的对象(viewController)中设置一个“监听器”,然后子视图可以向控制器发送通知。然后通知处理程序可以调用任何方法。

viewController 部分:

-(void) viewDidLoad
   
//Set up a listener.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationHandler:) name:@"finishedCurrentLevel" object:nil];   
...


-(void) notificationHandler: (NSNotification*) notification

//Notification handling.
if ([notification name] == @"finishedCurrentLevel") [self finishedCurrentLevel];


-(void) finishedCurrentLevel

//View managing code here...

设置的通知的通知、侦听和“响应”。实际的通知是这样的(可以从任何子视图执行):

[[NSNotificationCenter defaultCenter] postNotificationName:@"finishedCurrentLevel" object:nil];

我认为它解决了我的“沟通”问题。

关于全局变量我只是创建了一个单独的 globals.m 文件,其中对应的 globals.h 没有定义任何类。他们只是“附加”了一些 extern 变量,所以我可以从任何导入了 globals.h 的文件中访问它们。

【讨论】:

以上是关于寻找管理游戏关卡视图、关卡选择视图、偏好视图、存储关卡、环境变量的概念的主要内容,如果未能解决你的问题,请参考以下文章

Swift UI 集合视图布局

有没有办法在 .sks 文件中布局我的整个关卡,但只加载当前视图中的内容?

Swift - 在 segue 之后释放前一个视图控制器

集合视图更新问题 - Swift

如何根据本地 json 文件填充表格视图?

iOS:UIView 与 SKView