这可能更多的是关于OOP语言和过程语言如何用于设计游戏的问题。
我看到的大多数使用OOP语言(例如C++或Java)的教程和页面都使用对象来创建游戏中使用的基本上所有内容,例如用户可控角色的类、屏幕上子弹的类、烟雾效果的类、飞行箭头的另一个类等。
我的第一个问题是:将游戏中的所有内容作为一个类来实现的想法是"正常的"还是"推荐的"?如果我使用OOP语言,我应该这样写游戏吗?
我的第二个问题是:如果有人用C这样的程序语言编写游戏,你会如何创建相同的系统?我无法为游戏中的每个项目创建一个对象。据推测,我会创建一个struct
,并拥有一个所述structs
的数组?此外,在OOP设计中,我会让每个对象都能够控制自己(例如碰撞检测)。我将如何在程序语言中实现这一点?是否有某种代码可以遍历每个struct
并从中操作每个结构?
关于你的第一个问题:这就是事情是如何自然发展的。当你思考你的游戏时,你会想到玩家、敌人、场景、房间、武器、目标等。所有这些东西都被自然地建模为对象,因为它们将属性(即成员变量)和行为(即方法)分组。所以这就是它通常的方式,如果你选择实现这些东西的语言提供了一种表达方式,你为什么不使用它呢?
关于你的第二个问题:如果你选择的语言不允许接近自然的实现,你会想尝试尽可能接近自然的建模。举个例子:你可以用structs(属性)为对象建模,并相应地实现行为——要么用在这些structs上操作的函数(例如enemy_hit(播放器)),要么用包含在structs中的函数指针(即播放器->hit(播放器,…))
添加到其他答案中。
OO范式确实是处理游戏等事物的自然方法,如果你被迫使用过程范式,你可能应该尝试模仿OO行为。
我想补充的是,除了模块化和自然思考之外,面向对象语言还支持多态性,我经常使用这些语言,发现在过程语言中很难使用。多态代码允许抽象层,使设计您的一般行为(枪支、角色等)变得更加容易,然后根据您的情况转向具体的、不同的实现(枪支像这样发射,枪支像那样发射等)。您可以使用具体的实现,甚至不需要了解它们(作为使用某人API的程序员),因为您总是可以使用他们的接口。还有通用编程,它允许更深入的抽象。
当你为游戏设计干净、可扩展、可维护的代码时,抽象的论点很有用。