减少Java游戏中碰撞方法的数量

减少Java游戏中碰撞方法的数量,java,awt,collision,graphics2d,java-2d,Java,Awt,Collision,Graphics2d,Java 2d,我正在用java做一个简单的游戏,我有很多方法来测试两个对象是否发生碰撞。物品包括人、敌人、箭、墙、硬币等。我有一系列方法可以计算可能发生的每种类型的碰撞,它们如下所示: public boolean collide(Arrow a, Enemy b) { Rectangle a1 = a.getBounds(); Rectangle b1 = b.getBounds(); if(a1.intersects(b1)) return

我正在用java做一个简单的游戏,我有很多方法来测试两个对象是否发生碰撞。物品包括人、敌人、箭、墙、硬币等。我有一系列方法可以计算可能发生的每种类型的碰撞,它们如下所示:

    public boolean collide(Arrow a, Enemy b)
    {
        Rectangle a1 = a.getBounds();
        Rectangle b1 = b.getBounds();
        if(a1.intersects(b1)) return true;
        else return false;
    }

是否需要创建一个通用方法?我尝试使用对象a和对象b作为参数,但编译器发现它找不到对象的getBounds()。

您可以执行以下操作:

public boolean collide(HasBounds a, HasBounds b){...
使用界面:

public interface HasBounds{
  Rectangle getBounds();
}

您应该在对象上定义
箭头
敌人
等。。。(您可能已经有了适合的对象层次结构)。

您可以执行以下操作:

public boolean collide(HasBounds a, HasBounds b){...
使用界面:

public interface HasBounds{
  Rectangle getBounds();
}

您应该在对象上定义
箭头
敌人
等。。。(您可能已经有了适合的对象层次结构)。

只需使用方法:Rectangle2D getShape()创建抽象类GameObject即可。此方法可能类似于:

abstract class GameObject {
    private Image image;

    GameObject(String path) {
        try {
          image = ImageIO.read(new File(path));
        } catch (IOException ex) {}
    }

    Rectangle2D getShape() {
       return new Rectangle2D.Float(0, 0, (int)image.getWidth(), (int)image.getHeight());
    }
}

玩家、敌人、箭、墙将是GameObject类的子类

只需使用Rectangle2D getShape()方法创建抽象类GameObject即可。此方法可能类似于:

abstract class GameObject {
    private Image image;

    GameObject(String path) {
        try {
          image = ImageIO.read(new File(path));
        } catch (IOException ex) {}
    }

    Rectangle2D getShape() {
       return new Rectangle2D.Float(0, 0, (int)image.getWidth(), (int)image.getHeight());
    }
}

玩家、敌人、箭、墙将是GameObject类的子类

您对此有何看法

 public boolean collide(Rectangle a1, Rectangle b1)
 {
        return a1.intersects(b1);
 }
或者可以创建一个接口

public interface CanCollide {
   Rectangle getBounds();
}
并在方法中使用它

 public boolean collide(CanCollide a, CanCollide b)
 {
     Rectangle a1 = a.getBounds();
     Rectangle b1 = b.getBounds();
     if(a1.intersects(b1)) return true;
     else return false;
 }
希望你觉得有用

谢谢


@狮子座。

你觉得这个怎么样

 public boolean collide(Rectangle a1, Rectangle b1)
 {
        return a1.intersects(b1);
 }
或者可以创建一个接口

public interface CanCollide {
   Rectangle getBounds();
}
并在方法中使用它

 public boolean collide(CanCollide a, CanCollide b)
 {
     Rectangle a1 = a.getBounds();
     Rectangle b1 = b.getBounds();
     if(a1.intersects(b1)) return true;
     else return false;
 }
希望你觉得有用

谢谢


@leo.

使用这些类的公共接口,而不是
对象
。该接口必须包含一个方法
Rectangle getBounds()返回a1。相交(b1)有关使用
形状
实例进行碰撞检测的示例,请参见。请使用这些类的公共接口,而不是
对象
。该接口必须包含一个方法
Rectangle getBounds()返回a1。相交(b1)请参见使用
Shape
实例进行冲突检测的示例。更简单的是:
公共布尔碰撞(HasBounds a,HasBounds b){
更简单的是:
公共布尔碰撞(HasBounds a,HasBounds b){
这如何减少
碰撞()
方法的数量?现在不需要重载碰撞()方法具有不同的碰撞修改。相反,只有一个方法宽度参数:(GameObject collid1,GameObject collid2)应该是答案的一部分。构造函数和
getShape()
方法与OPs问题无关。这如何减少
collide()的数量
方法?现在您不需要使用不同的Collid修改重载collide()方法。相反,答案中应该有一个方法宽度参数:(GameObject collid1,GameObject collid2)。构造函数和
getShape()
方法与OPs问题无关。。