RPG 游戏循环和类结构(cocos2D for iPhone)

2024-01-28

我想在 iPhone 上使用 Cocos2D 制作一款 RPG。我做了相当多的研究,我真的很喜欢 Cocos2D 用于场景的模型。我可以实例化一个场景,设置我的角色等,这一切都工作得非常好......我遇到的问题是构建游戏循环并将代码与场景分开。

例如,我应该将在多个场景中维护游戏状态的代码放在哪里?我是否将场景中触发的事件的代码放入该场景的类中?或者我是否有其他一些类将初始化代码与逻辑分开?

另外,我读过很多提到更改场景的教程,但我没有读过任何有关更新场景的教程 - 获取用户的输入并据此更新显示。这种情况是发生在场景对象中,还是发生在单独的显示引擎类型类中。

提前致谢!


听起来你最好阅读一下模型-视图-控制器 http://www.martinfowler.com/eaaDev/uiArchs.html图案。您不必盲目地遵守它(例如,在某些情况下,允许模型和视图之间存在一些重叠是有意义的),但是对其有一个很好的理解将帮助您构建任何具有大量图形对象的程序以及控制它们的逻辑,以及广播状态或将其保存到光盘(游戏保存)的需要等。

您还必须认识到,cocos2d 提供了一个很好的系统来构建图形场景图并有效地渲染它,但它没有提供用于编程游戏的完整基础设施。从这个意义上说,它更像是一个图形引擎而不是游戏引擎。如果您尝试将游戏的架构融入到 cocos2d 的结构中,您可能不会得到最可维护的结果。相反,您应该像对待 cocos2d 一样对待它:一个满足您的显示和动画需求的出色工具。

除了维持游戏状态的场景之外,您绝对应该有一个对象,因为否则当您在场景之间切换时,所有状态都会去哪里?在场景/关卡中,您应该尝试使用良好的面向对象设计来将状态分布在各个类的对象上。每个角色对象都会记住自己的状态等。在这里您可以看到 MVC 在哪里变得有用:当您将游戏保存到光盘时,您想要记住每个角色的健康水平,但可能不记得精灵动画显示的确切帧索引。所以你需要区分sprite特点(模型)本身。也就是说,正如我之前提到的,对于没有太多逻辑附加的游戏对象,或者不需要保存的游戏对象,将模型和视图融合到一个类中可能是可以的(基本上是通过子类化CCSprite)。

要按照预期的方式实现 MVC,您还应该学习以下基础知识键值观察 http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html。 (你最好使用这个替换 http://www.mikeash.com/pyblog/key-value-observing-done-right.html对于 Apple 的界面。)在更强烈的实时游戏中,这样的技术可能太慢,但由于您正在制作 RPG(入门的好选择),您可能会为了更易于维护的架构而牺牲性能。

就 MVC 模式而言,游戏场景(只是另一个 cocos2d 精灵)扮演着控制器的角色。它本身不绘制任何东西,而是告诉其他所有东西根据输入和状态绘制自己。将各种逻辑和功能放入游戏场景中是很诱人的,但是当您注意到它膨胀时,您应该问自己如何将该功能分离到其他类中。分析您正在实现的功能类型。与数据和状态(模型)有关吗?或者是关于动画和渲染(View)?或者是关于将逻辑与渲染连接起来(在这种情况下,您应该尝试让视图直接观察模型)?

游戏场景/控制器基本上是一个调度中心,它接收输入事件(例如,来自用户或报告他们击中某物的精灵)并决定如何处理它们:它可能会告诉一个或多个模型例如,对象以某种方式更新自身,或者可能只是触发其他一些精灵中的动画。

在实时游戏中,场景中会有一个“tick”或“step”方法,告诉所有对象进行自我更新。该方法(游戏循环)是程序的核心,每次绘制新帧时都会运行。 (在现代游戏引擎中存在很多多线程,但我们不要考虑这一点。)但就您而言,您可能希望创建一个可以与游戏场景完全分离的“玩游戏”的模块。想象一下创建一个可以仅使用文本输入通过终端下棋的程序。如果您以这种方式创建整个游戏系统,然后通过一个小而干净的界面将其连接到图形引擎,您将拥有一个真正可维护的应用程序,其中包含许多可用于未来项目的可重用代码!

一些好的经验法则:模型(数据)不应该知道anything关于精灵或显示状态;视图(精灵)不应该包含任何游戏的实际逻辑(游戏规则),而只知道如何做简单的事情,例如移动和弹跳以及在发生复杂情况时向场景报告。只要有可能,视图就应该直接对模型中的更改做出反应,而无需控制器干预。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RPG 游戏循环和类结构(cocos2D for iPhone) 的相关文章

随机推荐

  • 如何将本地托管的MySQL数据库与docker容器连接

    Through docker compose yml我能够运行该应用程序 现在我们想要将应用程序转移到生产环境 但我们不想使用容器数据库 那么有什么方法可以让我可以使用以下命令将本地 MySQL 数据库与应用程序连接起来docker com
  • Laravel maatwebsite/excel Composer 在 mac 中安装错误

    尝试通过 Mac 版 Composer 在 XAMPP 7 1 32 rev 1 中安装 maatwebsite excel 如何在 XAMPP for mac 中启用这些扩展或者是否存在任何其他问题 请帮我 composer instal
  • 写重的elasticsearch

    我正在使用 kafka storm 和 Elasticsearch 编写一个实时分析工具 并且想要一个针对大约 50K 秒插入进行写入优化的 Elasticsearch 出于 POC 的目的 我尝试将批量文档插入到 Elasticsearc
  • magento管理部分添加类别时出现致命错误

    我在 Magento 管理部分遇到一个错误 当我尝试创建一个类别时 它显示以下致命错误 致命错误 在第 331 行对 C wamp www magento lib Varien Data Tree Dbp php 中的非对象调用成员函数 g
  • 我如何使用 jQuery 来解析 XML,就像我在这里一样

    这个 或其某些变体 是由我的 PHP 脚本输出的 请注意 某些标签在不同的上下文中使用相同的名称
  • 输入文本并保存到文件

    以下函数创建一个新的文本文件并允许用户输入要保存到文件中的文本 我遇到麻烦的主要问题是 1 允许单词之间有空格 2 按 Enter 保存文本 而不是转到新行 void new file void char c 10000 char file
  • 刷新令牌后,Azure AD B2C 访问令牌声明不会更新

    我们在应用程序中使用 Azure AD B2C 我们授权用户使用API https tenant b2clogin com tenant onmicrosoft com policy oauth2 v2 0 authorize client
  • Drupal 迁移 - 现在只有首页可以使用

    我刚刚从 ISP 迁移了 Drupal 站点 到专用的 Linux CentOS 服务器 MySQL 数据库已配置并生成首页 没有错误 问题是只有主页可以使用 所有其他页面均显示 404 页面未找到错误 所以 mysite com 可以工作
  • 具有不同布局的 Rails 邮件程序

    我在通知程序模型中对所有电子邮件 20 多封电子邮件 使用一种布局 但是有时我只想发送一封纯文本电子邮件 根本没有布局或 html 我似乎无法弄清楚如何 如果我尝试发送纯文本电子邮件 我仍然可以获得布局以及电子邮件中的所有 HTML 我正在
  • 有人知道从头开始创建增强现实应用程序或使用开源框架的好教程吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找涵盖创建 AR 应用程序每一步的优秀教程 如果它还涵盖光学等背后的一些理论 那将是有益的 一个好的设置是使用AR工具包 http
  • php header 立即定位?

    为什么 Location 标头没有立即重定向页面 它总是在重定向之前执行整个过程 我举一些例子 header Location http www php net f fopen demo txt w fwrite f Test fclose
  • 如何生成不生成超过 X 个连续元素的随机数序列

    好吧 我真的不知道如何正确地提出这个问题 因为我几乎不知道如何用一句话来描述我想要的东西 我很抱歉 让我开门见山 你可以跳过剩下的 因为我只是想表明我已经尝试过一些东西 而不是来这里一时兴起问问题 我需要一个生成 6 个随机数的算法 但在该
  • 无法从 Angular http 检索数据

    我正在尝试使用 http 模块使用下面的代码从 mongodb 中的集合中检索数据 getPosts return this http get http localhost 5005 blog getposts map res gt con
  • 如何使用 Android 代码使用呼叫拨号器(键盘)启动隐藏的应用程序? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想通过以编程方式拨打某些预定义号码来启动我的应用程序 这是一个隐藏的应用程序 例如 111 我打开拨号器并输入 111 然后我的应用程序收
  • 如何使用java在数组中获取用户输入?

    如何使用Java在数组中获取用户输入 即我们不会在程序中自己初始化它 但用户将给出它的值 请指导 这是一个简单的代码 用于读取字符串stdin 将它们添加到List
  • Matlab 图像中的自主接缝检测

    I m trying to detect seams in welding images for an autonomous welding process I want to find pixel positions of the det
  • JFileChooser 更改 Windows 中的默认目录

    我想将 JFileChooser 的默认目录更改为 Windows 上的 我的音乐 这个目录是C Users Fre Music在我的帐户上 因为我的用户名是Fre 默认设置为C Users Fre Documents 我认为取决于操作系统
  • 为所有新命令对象设置自定义默认 CommandTimeout

    默认命令超时 http msdn microsoft com en us library system data sqlclient sqlcommand commandtimeout aspx值为 30 秒 您可以通过执行以下操作手动更改
  • AngularJS:初始化 ZURB Foundation JS

    我同时使用 AngularJS 和 Foundation 要初始化 Foundation JS 您必须进行以下调用 document foundation 在 AngularJS 应用程序中进行此调用的最佳方式是什么 代码示例将不胜感激 另
  • RPG 游戏循环和类结构(cocos2D for iPhone)

    我想在 iPhone 上使用 Cocos2D 制作一款 RPG 我做了相当多的研究 我真的很喜欢 Cocos2D 用于场景的模型 我可以实例化一个场景 设置我的角色等 这一切都工作得非常好 我遇到的问题是构建游戏循环并将代码与场景分开 例如