【发布时间】:2015-11-16 09:38:10
【问题描述】:
不幸的是,因为我学校的面向对象软件工程项目,我正在使用 java 和 slick2d 制作冒险游戏。
我正在应用 MVC 架构,并通过从 ItemFactory 类中的 Tiled 映射文件中读取来创建项目。他们似乎很适合这种游戏。
游戏中有多个项目会影响游戏,尤其是角色。 (在此上下文中角色与玩家相同)
有一个字符模型,它有一个内部类 Inventory,它基本上由一个 ArrayList 项目组成。
字符控制器有一个名为 takeItem 的函数,它接受一个容器参数(即货架),该参数也有一个 ArrayList 项目,然后删除里面的内容并放入库存。
它有一个名为 useItem 的函数,它接受一个 int 索引并使用相应索引中的项目。
在那之前,一切都很好。
现在的主要问题是,这些物品有特定的用途。例如,生命药水增加角色的生命值,隐形药水使其隐形等。
为了维持一个好的设计,我可以如何以及在哪里对这些项目进行解释和附加功能?
到目前为止,我认为是这样的: 1-我没有向项目类添加任何功能。它只有 name、description 和 Enumerated ItemType 和 int power 2- 我在角色控制器的 useItem() 方法中做所有工作,即
if (itemBeingUsed.getType() == Common.ItemType.POTION)
`characterModel.increaseHealth(itemBeingUsed.getPower())`
如您所见,这似乎很奇怪,因为角色控制器就像一个项目解释器。
3- 另一种方法可能是创建一个使用字符控制器的 ItemInterpreter 类。虽然这看起来更优雅,但它会让我在角色控制器中执行一堆不必要的功能,例如调用角色模型的 increaseHelth() 函数的“increaseCharacterHealth”函数等等。
另外一个可能的问题是我使用Character Controller的函数来使用物品,但是物品也可能会影响游戏,即减慢时间,但是Character Controller在游戏的类层次结构之下,无法访问Game/GameController功能。减慢游戏时间等似乎至少现在不是这种情况,所以看起来我可以在 CharacterController 类中使用 Items,但我想知道你的意见,如果它是一个好的设计或者什么可以更好。
一些清除问题的代码:(注意:它们不完整) 注意:我将 ItemType、Direction 等枚举类型放在所有类都通用的 Common 类中。
在 CharacterController 中使用 item 函数:
public void useItem(int index){
Item item = ((Character)obj).inventory.takeItem(index);
if (item != null) {
if (item.getType() == Common.ItemType.POTION) {
((Character)obj).increaseHealth(item.getPower()); // I have extended a Person class, now I have to typecast to character everytime, which is also nonsense
}
else
System.out.println("and other items..");
}
else
System.out.println("Cannot use");
}
我没有把所有的代码都放上来,但是如果我解释不清楚,我可以。
【问题讨论】:
-
每个项目都实现了一个接口项目,它具有“useItem”声明。所有的项目都应该实现这个方法,并且在控制器中你只知道你在一个对象实例上调用 useItem 函数。它将是在他的实现中具有逻辑的项目。
-
这意味着我将为每种类型的项目实现一个新类。会不会是多余的?
-
您希望控制器中的每种类型的项目都有一个开关?
标签: java oop design-patterns adventure