它是被认为不好的做法,存储对象和它的父类,并与预期的比较级object.getClass()强制转换为子类。
说明:作为2D游戏基于瓦片运动的一部分我有几种类型的“游戏物体”的对象,如“门户”,“玩家”,“NPC”,“胸”等。每个存储在2维阵列构成其每一个也作为一个更新和渲染队列和游戏对象级别体现由等级所需要的信息。如果我的所有对象存储为父类型游戏对象,然后将它们转换成实际的类,例如(在播放器类):
private void checkPosition(x, y) {
GameObject obj = Level.getObject(x,y);
if(obj instanceof NPC) {
NPC npc = (NPC)obj;
//interact with npc
} else if(obj instanceof Chest) {
//handle chest
}
}
请问这通常是难以阅读?哪些问题是我可能有做的事情这样?这将是一个更好的方法,如果任何提供的每个对象使用数组来互相交流,我将可能有其他类型的未来“GameObjects”,每一个根本不同的功能。
如果因为我真的不知道该怎么解释这个问题,这是遗憾罗嗦。
编辑:我要澄清类似的代码可以从游戏物体的其他子类来运行,而不仅仅是播放器(即NPC或更高级别)和强调的是能够改变每个子类之间的互动,而不改变每个存储级别类它时间一个人的潜在存储的类型被创建/改变。谢谢那些谁推荐的instanceof
我已经更新了问题,把重点放在其他地方,但我可能会使用它从现在开始。感谢您的反馈。
结论:我已经决定去大妞的回答的一个变种,每个游戏对象具有延伸所提到的接口的存根/适配器自己的AI子类。因此,我没有实现永远类的反应,我可以对同一个对象类型赋予不同的行为和处理互动应该是这样的:
getObject(x,y).getAI().react(obj);
这是一个用例访问者模式。
添加的接口(可通过电平移动的一切)
interface LevelCrawler {
void accept(Chest chest);
void accept(NPC npc);
}
和你的 GameObject
interface GameObject { // or abstract class
// added method
void accept(LevelCrawler lc); // abstract if class
}
该LevelCrawler
会通过例如实现Player
类(或NPC
等如您在编辑说明)。
class Player implements LevelCrawler {
public void accept(Chest chest) { ... }
public void accept(NPC npc) { ... }
}
包含在代码if () {...}
块。
然后,你如
class Chest implements GameObject { // I think it's a class, so probably "extends"
void accept(LevelCrawler p) { p.handle(this); } // to call Player#handle(Chest)
}
和你的代码看起来像
GameObject o = Level.getObject(x, y);
o.accept(player); // or NPC or whatever is moving right now
你看,它的工作原理。
这样做的好处是,当你创建一个新的GameObject
类,你可以轻松地添加新的行为,以现有的LevelCrawler
类和离开checkPosition
代码不变。
编辑的版本有两个Player
,并NPC
通过地牢移动。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句