Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OOP-如何删除具有不同“属性”的游戏对象;“死亡”;行为_Java_Oop - Fatal编程技术网

Java OOP-如何删除具有不同“属性”的游戏对象;“死亡”;行为

Java OOP-如何删除具有不同“属性”的游戏对象;“死亡”;行为,java,oop,Java,Oop,我最近开始学习Java中OOP的概念,并开始构建一个游戏,其中包括散布在屏幕上的球和钉子。这个游戏的目的是通过让球与屏幕上的钉子碰撞来移除屏幕上的所有钉子。有不同类型的销钉,它们在被破坏时具有一定的行为。(即黑钉不能被摧毁,红钉会产生两个新球等) 下面的方法是通过迭代ArrayList中的每个peg来检查球和peg之间的碰撞。如果检测到冲突,peg将在从ArrayList中删除之前执行一个操作 // inside MainGame class public void checkCollision

我最近开始学习Java中OOP的概念,并开始构建一个游戏,其中包括散布在屏幕上的球和钉子。这个游戏的目的是通过让球与屏幕上的钉子碰撞来移除屏幕上的所有钉子。有不同类型的销钉,它们在被破坏时具有一定的行为。(即黑钉不能被摧毁,红钉会产生两个新球等)

下面的方法是通过迭代ArrayList中的每个peg来检查球和peg之间的碰撞。如果检测到冲突,peg将在从ArrayList中删除之前执行一个操作

// inside MainGame class
public void checkCollisions(Ball ball) {
    for (GameObject peg: pegs) {
        if (peg.checkCollision(ball)) {
            // peg does something before getting removed from the ArrayList
        }
    }
}
我的第一种方法是使用instanceOf使用一组if语句来检查peg的类型,但尽管它可能适用于像我这样的具有很少peg类型的小游戏,但我怀疑这种解决方案在具有许多不同类型的游戏对象(如RPG)的游戏中是否能优雅地工作

如果某些类型不能被破坏(比如黑色的木钉),或者它影响了周围的其他木钉,该怎么办


我正试图找到一个灵活的解决方案,使添加“死亡”行为变得容易,这可能会影响/创建其他钉/游戏对象,但我不知道解决此问题的设计模式,希望有一些提示/资源可以帮助我解决此问题。

分配类id(实际上,C++ RTTI对每个类都做同样的操作,但很难使用),然后按类ID使用分派表是一种更坏的方法。代替调度表,可以添加ID(如藏文所说的那样)。请澄清“动态解决方案…添加“死亡”行为”-你的意思是,比如说,黑钉可能在某一时间有一种行为,然后在另一时间有一种行为(当游戏运行时)他们可能有完全不同的行为?或者你的意思是,今天你编写black peg的行为代码,然后6个月后,你想要一种可维护的方式来改变这种行为(或者添加更多类型的peg)?在我看来,后者似乎是直接多态性-但这是真的还是前者?@racraman这将是后一种情况。我可以在一个Peg类中有一个抽象的
handleCollision()
,并对Peg的每个子类实现它(创建新类型的Peg时).但是由于所有游戏对象都存储在MainGame类中,因此会出现一些peg类型的问题,例如红色peg类型(碰撞时会产生两个额外的球)这需要返回到MainGame类以创建新的球/游戏对象。您可以修改
handleCollision
以获取
MainGame
参数,以便它可以执行这些操作。或者,每个peg都可以“知道”如何访问主游戏-例如,它可能是单例。