【发布时间】:2011-11-20 07:26:53
【问题描述】:
我正在用 Java 为 Android 游戏编写游戏引擎,我的引擎处理不同形状的碰撞检测。每个形状都是它自己的类(Square、Circle 等),并且派生自一个通用的抽象父 Collidable。我有一个物理管理器类,它基本上检查游戏中的任何现有对象是否与另一个对象发生碰撞,然后在检测到碰撞时执行适当的操作。碰撞检查在每个物理形状子类中实现,如下面的代码所示。
public abstract class Collidable
{
}
public class Square extends Collidable
{
public boolean Collides(Square) {...}
public boolean Collides(Circle) {...}
public boolean Collides(Triangle) {...}
}
public class Circle extends Collidable
{
public boolean Collides(Square) {...}
public boolean Collides(Circle) {...}
public boolean Collides(Triangle) {...}
}
public class Triangle extends Collidable
{
public boolean Collides(Square) {...}
public boolean Collides(Circle) {...}
public boolean Collides(Triangle) {...}
}
public class PhysicsMgr
{
public boolean Collides(Collidable p1, Collidable p2)
{
return p1.Collides(p2);
// This obviously won't work because there is no Collides
// method in Collidable. I want it to somehow call the child's
// method and pass in p2 as its child type rather than as
// a parent. Or somehow do this:
return (p1.child()).Collides(p2.child());
// I know that obviously nothing like this exists.
}
}
我知道“instanceof”并且真的不想检查 p1 和 p2 的子类型与我拥有的每个碰撞形状。一定会有更好的办法。我正在寻找解决我当前问题的方法,或者最好重新设计我当前的碰撞检测系统以完全避免这个问题。
谢谢!
【问题讨论】:
-
有一个标准的碰撞检测方法检查多方法实现:codeproject.com/KB/recipes/mmcppfcs.aspx
标签: java oop inheritance collision-detection game-engine