2015-09-04 72 views
0

目前我正在尝试编写一款小型视频游戏,其风格是旧的塞尔达游戏。但是,我在整个OOP思维方式上遇到了一些麻烦。更具体地说,我不知道如何“设计”屏幕。每个精灵的对象? (Games,OOP)

比方说,我有一个我的精灵班,并加载了一个Wall-Sprite来为某个区域设置边框,如果我制作了额外的“墙”级别,或者墙已经足够“精灵”了?我认为定义一个额外的类可能是没有意义的,因为它不会有任何不同的变量而不是实际的精灵类(因为我的墙只是一个精灵),所以我不认为它是一个有用的想法。

我在问这个,因为我碰到碰撞检测也有点问题:我现在做的只是加载一个对象的精灵一次,并在多个位置渲染多次。但问题在于,这会导致仅在精灵渲染的最后一个位置检测到碰撞。

当我在某处呈现2个洞穴入口时,它给了我更多的问题,但是如果我“进入”它,我的游戏只会检查第二个入口。所以我认为制作一个额外的“入口”类,并创建两个完全不同的对象,分开处理可能会有所帮助,但是,我是否也应该为我的墙壁精灵创建30个对象?

+0

http://programmers.stackexchange.com/可能是这类问题的更好的论坛。 –

+0

@DonBottstein在提及其他网站时,指出[交叉发帖令人不悦](http://meta.stackexchange.com/tags/cross-posting/info) – gnat

+0

我知道这个问题有点儿一般,但是在那里埋下了一个很好的具体问题。然而,@DonBottstein在将来是对的,这种帖子将会更好地位于程序员网站上。 –

回答

0

嗯,真的有两个问题,三个,但是面向对象的思维对于一个好问题来说太不具体了。所以让我们看看我们是否可以通过回答有效的答案来回答。

良好的OO设计以“模式”为中心(针对各种问题的常见解决方案),如果您的精灵在OO中重用,这将称为“飞行重量”模式。好的面向对象中的三个重要结构元素并理解它们是“获得它”的关键。它们是:

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

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

对象 - 相同形式的类(理想主席)的对象 - 实例(这把椅子或椅子,而不是主席作为理想)。对象(理想情况下)应该只保留实例值,以将其与同一理想的其他实例区分开来。

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

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

不要以为它一次只能有30个完整的副本,你只有30个副本的实例变量。如果你使用OO,这是真的;在一个程序性的解决方案,以获得适当的碰撞检测,你将不得不维护一个数组的所有地方,你渲染该精灵和迭代通过每一次,进一步你的代码将不太干净地分开,你将不得不遍历整个数组精灵交互以及更新移动的精灵。使用OO,您可以使用一个类方法调用来处理这个问题,并将它递归给子节点。

这个简单的例子,一个很好的类结构可能是:

提要Sprite类(抽象的,因为你永远不会使用非特定雪碧)只包含通用代码,所有的精灵

水泥墙Sprite类扩展了Sprite,只有非移动壁精灵的代码。

的具体触发Sprite类(它的图形可能是清晰或空)对于需要在“开放空间”

被触发的具体代理Sprite类的移动精灵的行为(可能实现一个可移动的接口意味着所有的类的衍生物具有move()方法。

延伸剂用于由用户命令驱动的可动子画面的具体字符类。

它可能看起来在第一混淆,但它实际上是清洁器,更简单的,并且更容易维护OO方式。

:)

+0

非常感谢!迭代通过数组实际上正是我一直在做的,就我的“解决方案”而言,我很高兴知道这似乎是一个真正的“已知”解决方案,我没有做一些完全奇怪的事情。我目前正在使用一个sprite类,它具有加载和渲染动画和非动画sprites的方法,但我不知道如何组织我的关卡设计而不使用数组,因为我总是需要一些坐标来把精灵放在他们各自的地方,你能解释一下吗? 尽管如此,非常感谢! (: – Philipp317