嗯,真的有两个问题,三个,但是面向对象的思维对于一个好问题来说太不具体了。所以让我们看看我们是否可以通过回答有效的答案来回答。
良好的OO设计以“模式”为中心(针对各种问题的常见解决方案),如果您的精灵在OO中重用,这将称为“飞行重量”模式。好的面向对象中的三个重要结构元素并理解它们是“获得它”的关键。它们是:
接口 - 它们是免费的(相对)操作代码,并且只提供方法和构造函数签名(通常)以允许清晰地分离编码问题。
类 - 只有对象实例化(或图案化)的对象的可重用部分(理想情况下)是“模具或模式”。
对象 - 相同形式的类(理想主席)的对象 - 实例(这把椅子或椅子,而不是主席作为理想)。对象(理想情况下)应该只保留实例值,以将其与同一理想的其他实例区分开来。
但是,因为你的原始精灵不是一个对象,你有这个碰撞问题,因为它实际上是一次又一次渲染的同一个实例,图形管道并没有将它所有的前面的位置保存为单独的东西,它实际上只是一旦它们被翻译,就会存储像素(通常)。
在这种情况下,如果每个实例都是一个对象,则每个实例都将其位置作为本地实例变量,而其图形表示和冲突检测方法对于该类的所有实例都是通用的。
不要以为它一次只能有30个完整的副本,你只有30个副本的实例变量。如果你使用OO,这是真的;在一个程序性的解决方案,以获得适当的碰撞检测,你将不得不维护一个数组的所有地方,你渲染该精灵和迭代通过每一次,进一步你的代码将不太干净地分开,你将不得不遍历整个数组精灵交互以及更新移动的精灵。使用OO,您可以使用一个类方法调用来处理这个问题,并将它递归给子节点。
这个简单的例子,一个很好的类结构可能是:
提要Sprite类(抽象的,因为你永远不会使用非特定雪碧)只包含通用代码,所有的精灵
水泥墙Sprite类扩展了Sprite,只有非移动壁精灵的代码。
的具体触发Sprite类(它的图形可能是清晰或空)对于需要在“开放空间”
被触发的具体代理Sprite类的移动精灵的行为(可能实现一个可移动的接口意味着所有的类的衍生物具有move()方法。
延伸剂用于由用户命令驱动的可动子画面的具体字符类。
它可能看起来在第一混淆,但它实际上是清洁器,更简单的,并且更容易维护OO方式。
:)
http://programmers.stackexchange.com/可能是这类问题的更好的论坛。 –
@DonBottstein在提及其他网站时,指出[交叉发帖令人不悦](http://meta.stackexchange.com/tags/cross-posting/info) – gnat
我知道这个问题有点儿一般,但是在那里埋下了一个很好的具体问题。然而,@DonBottstein在将来是对的,这种帖子将会更好地位于程序员网站上。 –