我只是在玩一个旧的SNES RPG(Mana的秘密,如果有人关心的话),并且想知道一些关于游戏编程的一般事情。
对于一些脑死亡的问题,我很抱歉,我真的是初学者。 :)
这些问题非常笼统,但使用SNES风格的角色扮演游戏作为“模板”来了解我的意思:
游戏如何在“世界”中跟踪所有对象,触发事件等?例如,它如何跟踪哪些宝箱已被打开,哪些门被锁定,哪些故事事件已经触发?
它是否基本上创建了一个元素数组,每个元素对应一个胸部/门/事件/等,并且当它被打开/触发时,每个元素都“标记”(将其值从0更改为1)?如果有多种方法,它们是什么?
如何处理“变量列表”?也就是说,如果你有一个游戏,当你可以拥有大量物体(即:盔甲,剑)并拥有每个物体的X时,这是怎么做到的?
我的猜测:有一个结构有一个大数组,每个可能的对象都有一个点(一个X int数组,其中X是可能拥有的对象的数量),其中每个元素的值代表你有多少个对象,然后有一个每个对象的巨型枚举,以便一个对象与相应的索引匹配,并访问它,如:numberOfSwords = inventory [SWORDS]其中SWORDS是一个枚举的一部分,并有一个与之关联的整数。我有多接近?
物体数量可以变化的情况怎么样?也就是说,如果我有一个游戏,我在屏幕上有一些敌人,他们可以在任何时候被杀死/生出新的敌人,在我看来,我会需要一系列“敌人”物体来循环通过和处理,但元素的数量在任何时候都会有所不同。通常的做法是什么?链接列表?
非常感谢任何帮助/提示/指示。
答案 0 :(得分:8)
以非常基本的方式,你的答案并不太遥远,事情可以像你提到的那样完成。然而,空间和处理能力可以发挥作用,因此,而不是一系列的bool来跟踪哪些宝箱或你在事件链上走了多远,你可能想要将它缩小到打开和关闭的位并使用按位运算符屏蔽以查看故事情节中的位置,或者是否显示您将要显示为打开或关闭的宝箱。
对于库存而言,不是跟踪玩家拥有的每件物品的数量,而是为玩家可以获取的所有物品提供基本物品可能更好;武器,盔甲甚至钱。然后你可以制作一个只有玩家拥有的物品的链表。如上所述,使用Enum作为项目,然后使用该项目的数量。这将允许对事物进行排序,并且还将仅保留玩家角色实际拥有/拥有的项目。您可以扩展此数据结构以跟踪项目是否配备。您可以在项目表中保留更通用的项目信息。
敌人可能会有点复杂,因为你需要用它们做更多的事情。这里的链接列表仍然是您最好的选择。这样从列表中删除一个对象就会轻松一点(当玩家杀死它们时可以简单地移除链接等,或者在列表中需要的地方添加一个新的敌人。)
老实说,没有一个答案,它可以取决于很多事情。最好的方法就是简单地尝试一下......对于一个简单的'如果我为此做这个',它真的不会花费很长时间来给它一个旋转,看看你得到多远。如果您开始遇到问题,可以开始考虑其他选项:)
希望这有帮助。
编辑:只想添加一个指向www.codesampler.com的链接。通常更多的DirectX导向教程网站,但作为一个初学者,它可以开始你思考或给你一组起点。作为一个额外的奖励,很多DirectX SDK示例/示例开始被格式化,就像这个网站的教程是如何完成的。可以帮助您轻松完成整个事情。
答案 1 :(得分:3)
除了詹姆斯的优秀帖子,还有一些关键词供你google
用于动态内存管理理论。
另外,让我分享一下我的标准推荐链接,以便人们在基本的c ++上寻求帮助:
C++ Language Reference (including STL)
ANSI C Language reference for all those pesky C stuff that C++ keeps using
答案 2 :(得分:3)
对于初学者来说,这是一个非常高级的问题。
我想回应在Silico的回答中,在解决这个问题之前,你应该学习C ++语言基础知识。
为了给你一个开始的地方,你应该知道容器类(链接列表,向量,哈希表/字典,队列等)以及它们的工作方式。由于标准模板库(STL)非常标准化,因此对于初学者来说,这将是一个很好的地方。
您还应该了解继承以及如何构建类的层次结构。
例如,您询问角色扮演游戏中的广告资源: 我首先定义一个InventoryItem类,它定义或设置一个项目参与您的库存系统所需的所有代码的接口。 类似的东西:
class InventoryItem { private: std::string description; // A description of the item bool inInventory; // True if in the players inventory, false if on the ground etc... int weight; // How much the item weighs int size; // How much space the item takes in inventory // etc... };
在InventoryItem类中,您还要定义InventoryItem放置在您选择的容器类中所需的成员函数和数据。
同样的事情适用于触发物品,地面物体等。它们通常保存在某种容器类中。
STL容器将处理问题最后部分中提到的容器的可变大小。
vector是一个开始一般项目列表的好地方。 HashTables / Dictionaries很适合用密钥查找。
我希望这足以让你开始。祝你好运。
答案 3 :(得分:2)
您的问题并非针对“游戏编程”。您在询问如何在更大的程序中组织和存储任意数据。对此没有明确的答案,有很多不同的方法。一种常见的通用方法是为您要存储的所有内容制作数据模型。在C ++(或具有面向对象功能的任何其他语言)中,可以为此目的创建面向对象的类模型。 This introduction to C++包含一个关于C ++中面向对象建模的完整教程。
许多应用程序通常使用分层方法 - 数据模型是应用程序中的一个层,与表示层或应用程序(“游戏”)逻辑等其他层分开。
您的数据建模方法必须处理持久性(这意味着,您希望将所有数据存储在磁盘上并在以后重新加载)。之前曾问过这个问题here on SO。这个事实会给你一些限制,例如,使用指针。
编辑:如果您的数据模型达到一定的复杂度,您可以考虑使用({3}}的(轻量级)数据库,它具有C / C ++ API。
最后,这里有一个链接,可能会给你一个良好的开端,似乎完全适合你的问题:
答案 4 :(得分:1)
关于问题#1,我同意James和其他人使用存储游戏对象持久状态的数据库。
关于问题#2和#3,关于需要频繁更新的可变数量的对象和对象:我建议维护一个对象的注册表,这些对象需要为每个游戏“周期”进行更新(大多数游戏在周期上运行 - 循环,如果你愿意,虽然现代游戏使用许多循环产生的单独线程。)
例如,每当您引入需要更新的新敌人或其他对象以响应当前情况或以某种方式行事时,您都会在列表中注册该对象。每个循环,您遍历当前的可更新列表(可能基于某些优先级调度机制),并相应地更新它们。
但您使用的特定数据结构将取决于您的程序。链接列表是有效的基础结构,但您很可能希望使用满足您特定需求的自定义复合结构。您的方法可以结合任意数量的经典数据结构,以达到最佳的性能和效果。
考虑到这一点,在解决任何严肃的编程项目之前,我无法充分强调研究高级数据结构的重要性。有很多关于这个主题的好书,你会很好地研究它们。以下是对经典数据结构的可容忍概述的链接:http://randu.org/tutorials/c/ads.php