如何正确创建游戏对象

时间:2009-12-30 17:23:26

标签: c# actionscript-3 interface

我正在制作像游戏这样的模拟游戏,现在我正在试图弄清楚我将如何构建我的对象。

现在我正在考虑创建一个名为GameObject的类,psuedo位于

之下
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的实例,而无需创建指定它确实是房屋或树的属性。这似乎更合乎逻辑,但同时它似乎分配了更多的内存,因为我正在创建更多的类。

我只需要知道处理这类对象的最佳做法。如果有人可以帮我解决这个问题。如果您了解减少游戏或任何应用程序加载的最佳实践的任何资源。我也想使用Interfaces。第二个概念似乎更合理,我正在考虑让父实现一个类似下面的接口

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

现在我可以创建一个具有松散接受的方法的类接受任何继承GameObject的类型。

Selector.loadObject(gObject:IGameObject); 

根据它的类型(即树,建筑,房屋),我可以使用case语句来确定它是哪种类型并相应地对其进行评估。

我还创建了一个将通过loadObject方法传递的Tile类。它也将是GameOject类的一个孩子。如果case语句发现它是Tile类型,它将突出显示任何Tile,具体取决于我的鼠标所在的tile。

我的第二个问题是,如果一个类继承了一个实现接口的类,那么该类子类也被认为是一个IGameObject。或者是否必须直接实现该接口。

所有这些听起来像我正朝着正确的方向大声笑,就组织而言。

感谢您的帮助,谢谢你们!

3 个答案:

答案 0 :(得分:3)

您可以考虑的一件事是使用对象的组合而不是继承。这种情况与Flyweight的答案一致。而不是让所有GameObjects继承GameObject的属性;相反,让每个游戏对象只有一个引用或指向具有所需属性的对象或接口。例如,您的所有游戏对象可能都具有某种“大小”属性 - 而不是从基类继承此属性,只需将每个游戏对象引用或指向“大小”类,以便可以共享大小对象在类似的对象中。

答案 1 :(得分:2)

您应该查看Flyweight模式

来自维基百科:

  

Flyweight是一种软件设计   图案。 flyweight是一个对象   通过共享来最小化内存使用   尽可能多的数据与其他人   类似的对象;这是一种使用方式   一个简单的大量对象   重复表示将使用   不可接受的记忆量。

至于你的第二个问题,答案是肯定的。可以说类的所有子类都实现了父类实现的所有接口。

答案 2 :(得分:1)

  

这似乎更符合逻辑,但在   同时它似乎分配更多   记忆因为我正在创造更多   类。

创建新类不会占用大量内存。它正在创建使用内存的实例 - 但同样,与在图形中加载所使用的内存相比,数量可以忽略不计。不要担心内存。在这个阶段你唯一关心的应该是良好的代码组织。

当他们有不同的行为时,你应该有单独的类。如果它们具有相同的行为但属性不同,则使用相同的类并相应地设置属性。

在这种情况下,您似乎没有明显不同的行为,但如果将其分为Tree,Building和House,则在管理哪些项目可以包含在其他项目等时,您可以更轻松地完成生活。