如何正确创建游戏对象

3

我正在制作类似模拟人生的游戏,现在我正在思考如何构建我的对象结构。

目前我考虑创建一个名为GameObject的类,伪代码如下:

public class GameObject {
       name:String
       width:int
       height:int
}

这样我就可以创建像灌木、树和建筑物之类的对象。但是后来我开始思考,如果我想创建多个相同类型的建筑和树呢?我必须不断地创建GameObject实例,并给它一个新的名称、高度和宽度。为了复制一个对象,属性必须是相同的值。这似乎有点繁琐。然后我想,也许那不是正确的方法。所以我想,我需要扩展GameObject,如下所示:

public class Tree extends GameObject{
       birdHouse:Boolean
}

public class Building extends GameObject{
       packingGarage:Boolean
       stories:Number
}

public class House extends GameObject{
      garage:Boolean
      stories:Number
}

现在我可以创建多个 house 或 tree 实例,而无需创建指定它是 house 或 tree 的属性。这似乎更合理,但同时似乎会分配更多的内存,因为我正在创建更多的类。
我只需要知道处理这种对象的最佳实践。如果有人能帮我解决这个问题。如果您知道有关减少游戏或任何应用程序负载的最佳实践资源,请也告诉我。我还想使用接口。第二个概念似乎更合理,我考虑让父类实现以下接口。
public class GameObject implement IGameObject {
           name:String
           width:int
           height:int
    }

现在我可以创建一个类,它具有一个方法,可以松散地接受任何继承自GameObject的类型。
Selector.loadObject(gObject:IGameObject); 

根据类型的不同(例如树、建筑物、房屋),我可以使用case语句来确定它的类型并相应地评估它。
我还创建了一个Tile类,它将通过loadObject方法传递。如果case语句发现它是Tile类型,则会突出显示任何Tile,具体取决于我的鼠标停留在哪个Tile上。
我的第二个问题是,如果一个类继承了一个实现接口的类,那么该类的子类也被认为是一个IGameObject吗?或者它必须直接实现该接口。
这一切听起来像是我在正确的方向上前进了,关于组织方面的问题。
谢谢你们的帮助,谢谢!
3个回答

3

你可以考虑使用对象组合而不是继承。这与Flyweight答案有些类似。不要让所有的游戏对象都从GameObject继承属性,而是让每个游戏对象只引用或指向一个具有所需属性的对象或接口。例如,所有的游戏对象可能都有某种“大小”属性 - 而不是从基类继承这个属性,只需让每个游戏对象引用或指向一个“Size”类,这样大小对象就可以在相似的对象之间共享。


2
您应该了解Flyweight模式。
来自维基百科:
Flyweight是一种软件设计模式。Flyweight是一个对象,通过与其他类似对象共享尽可能多的数据,最小化内存使用;这是在大量使用对象时使用的一种方法,当简单重复表示将使用不可接受的大量内存时。
至于您的第二个问题,答案是肯定的。所有Class的子类都可以说实现了父类实现的所有接口。

1
创建新类并不会使用大量内存。使用内存的是创建实例 - 但同样,与加载图形等使用的内存相比,这个数量微不足道。不要担心内存。您现在唯一关心的是良好的代码组织。
当它们具有不同行为时,应该有单独的类。如果它们具有相同的行为但具有不同的属性,则使用相同的类并相应地设置属性。
在这种情况下,您似乎没有显着不同的行为,但如果将其分成树、建筑和房屋使您在管理哪些项目可以包含在其他项目中时更容易,请这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接