2013-03-09 1 views
0

Я делаю простую игру в java, и у меня есть много методов, которые проверяют, сталкиваются ли два объекта. Объекты включают человека, врага, стрелы, стены, монеты и т. Д. У меня есть куча методов, которые рассчитывают для каждого типа столкновения, которое может произойти, то они выглядят так:Уменьшение числа методов столкновения в 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 и object b в качестве аргументов, но компилятор подсчитал, что не может найти getBounds() для объектов.

+1

Используйте общий интерфейс этих классов вместо 'Object'. Этот интерфейс должен содержать метод 'Rectangle getBounds();' и эти классы должны его реализовать. Кроме того, вы можете заменить последние две строки на 'return a1.intersects (b1);' – jlordo

+0

См. [Этот ответ] (http://stackoverflow.com/a/14575043/418556) для примера обнаружения столкновений с использованием 'Shape 'экземпляры. –

ответ

3

Вы можете сделать что-то вроде:

public boolean collide(HasBounds a, HasBounds b){... 

с интерфейсом:

public interface HasBounds{ 
    Rectangle getBounds(); 
} 

Что вы должны определить на ваших объектах Arrow, Enemy и т.д ... (возможно, уже есть иерархия объектов подходит для этого).

+0

еще проще: 'public boolean collide (HasBounds a, HasBounds b) {' – jlordo

+0

действительно, я отредактировал свой ответ соответственно – benzonico

+0

Спасибо, это работает отлично! – Joe

-1

Просто сделайте абстрактный класс GameObject с помощью метода: Rectangle2D getShape(). Этот метод может выглядеть следующим образом:

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()); 
    } 
} 

Игрок, Враг, Стрелка, стена будет подклассы класса геймобжекты

+0

И как это уменьшает количество методов 'collide()'? – jlordo

+0

Теперь вам не нужно перегружать метод collide() с различными модификациями коллизий. Вместо этого есть один параметр ширины метода: (GameObject collid1, GameObject collid2) –

+0

Это должно быть частью ответа. Конструктор и методы 'getShape()' не имеют ничего общего с проблемой OP. – jlordo

1

Что вы думаете об этом ..

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.

Смежные вопросы