我正在研究激光与Java中的怪物相撞的边界框碰撞。碰撞没有问题。问题是OneEye类中的Rectangle对象是静态的!
问题1:如果一个怪物在游戏中,这是没有问题但在我的游戏中我会添加很多Monster类的实例。因此,如果我要添加多个怪物,我的Rectangle对象不能是静态的。
问题2:注意:如果Rectangle对象是非静态的,那么Rectangle的getter方法需要是非静态的。
但我似乎无法弄清楚如何解决这两个问题。
再次,我的碰撞工作!如果我要添加同一类的不同实例,那更多的是代码设计缺陷。总而言之,我如何引用当前类中不同类的实例我正在编写代码而不在静态上下文中引用它。
这是我的两个类的代码:Laser class和OneEye Class
public class Laser {
/* use a bounding box
* to test collision detection
*
*/
private Rectangle rect;
public void update(long milliseconds) {
// surround a bounding box around the laser
rect = new Rectangle((int)position.x,(int)position.y,this.getWidth(),this.getHeight());
// collision against the OneEye monster
if(rect.intersects(OneEye.getRectangle()))
{
Game.getInstance().remove(this);
}
}
public class OneEye {
/*
* use bounding box
* for collision
* detection
*/
private static Rectangle rect;
public void update(long milliseconds) {
// surround a bounding box around the oneEye monster
rect = new Rectangle((int)position.x,(int)position.y,this.getWidth(),this.getHeight());
}
// can be useful for collision detection
public static Rectangle getRectangle()
{
return rect;
}
}
答案 0 :(得分:1)
毫无疑问,你肯定需要走非静态路线。只需将rect Rectangle变量和getRectangle()
方法设为非静态。如果这会导致更多问题,那么您需要发布这些问题的详细信息。
修改您声明:
我试过了。但问题就出现了:我不能在我的Laser类中调用getRectangle方法(在我的Monster类中)。
问题不在于您无法在激光课程中调用getRectangle()
,而是在OneEye上无法调用它。你告诉我们的东西很少。我假设OneEye是Monster 变量而不是Monster子类。如果是后者,那么你的设计是关闭的,因为你应该在类实例上调用方法,而不是在类本身上调用。
编辑2
好的,现在我看到OneEye,我发现它是一个类,而不是一个实例。不要试图调用方法。而是创建一个包含Monster对象的oneEye变量,或者扩展Monster的OneEye类,但不管怎样,不要在类上调用getRectangle()
。在引用Monster或Monster子类对象的变量上调用它。