每个精灵的对象? (游戏,OOP)

时间:2015-09-04 19:41:35

标签: oop object sprite

目前,我正在尝试使用旧塞尔达游戏的方式编写一个小型视频游戏。但是,我在整个OOP思维方式上遇到了一些麻烦。更具体地说,我真的不知道如何“设计”屏幕。

假设我的精灵有一个类,并且加载了一个Wall-sprite来为某个区域设置边框,我应该制作一个额外的“墙”级,还是墙已经足够了?精灵?我认为定义一个额外的类可能毫无意义,因为它没有任何不同的变量而不是实际的精灵类(因为我的墙只是一个精灵)所以我不认为它是一个有用的想法。

我问这个是因为我在碰撞检测方面也遇到了一些问题:我目前所做的是只为一个对象加载一个sprite并在多个位置多次渲染它。但问题是这导致仅在精灵渲染的最后位置检测到碰撞。

当我在某处渲染2个洞穴入口时,它给了我更多的问题,但是如果我“进入”它,我的游戏只检查第二个入口。

所以我想要制作一个额外的“入口”级别并创建2个完全不同的对象,这些对象可以帮助,但是我是否应该为我的墙精灵创建30个对象?

1 个答案:

答案 0 :(得分:0)

嗯,实际上有两个问题,三个问题,但OOP思维对于一个好问题来说太具体了。因此,让我们看看我们是否可以通过回答您的有效回答来回答问题。

良好的OO设计以"模式"为中心。 (对于各种问题的常见解决方案)如果您的精灵在OO中重复使用,这将被称为" Fly-weight"图案。良好的OO中的三个重要结构元素和理解它们是获得它的关键。他们是:

接口 - 它们是免费的(相对)操作代码,并且只提供方法和构造函数签名(通常),以便清楚地分离编码问题。

类 - 只有对象的可重用部分(理想情况下)才是"模具或模式"这些对象从。实例化(或图案化)。

对象 - 相同形式的类(理想主席)的实例(这个主席或那个主席,而不是主席作为理想主持人)。对象(理想情况下)应仅保留为实例值,使其与同一理想的其他实例区分开来。

但是,因为你的原始精灵不是你遇到这种碰撞问题的对象,因为它实际上是一次又一次渲染的同一个实例,所以图形管道并没有将它以前的所有位置保持为它实际存储的单独的东西像素(通常),一旦被翻译过。

在这种情况下,如果每个实例都是一个对象,则每个实例都将其位置作为本地实例变量,而其图形表示和冲突检测方法对于该类的所有实例都是通用的。

不要认为它一次在内存中有30个完整副本,你只有30个实例变量副本。如果您使用OO,则确实如此;在一个程序解决方案中,为了获得正确的碰撞检测,你必须维护一个每次渲染精灵和迭代的所有位置的数组,进一步你的代码将不那么干净地分开,你将不得不为每一个迭代数组精灵交互以及更新移动的精灵。使用OO,您可以使用一个类方法调用来处理这个问题,该方法调用它可以对孩子进

这个简单示例的良好类结构可能是:

一个抽象精灵类(抽象,因为你永远不会使用非特定的精灵)只包含所有精灵共有的代码

一个混凝土墙精灵类,它扩展了Sprite,只是非移动墙精灵的代码。

具体触发精灵类(其图形可能是清晰的或空的),用于需要在"开放空间中触发的行为"

用于移动精灵的Concrete Agent Sprite类(可能实现一个可移动的接口,这意味着该类的所有派生都有一个move()方法。

一个Concrete Character类,它扩展了由用户命令驱动的可移动精灵的代理。

一开始看起来可能会让人感到困惑,但它实际上更干净,更简单,更易于维护。

:)