2013-07-08 2 views
0

У меня есть два класса: BasicEnemy.java и Upgrade.java. У меня есть метод getX() в каждом, который возвращает координату X экземпляра класса.Проверка/сравнение метода из любого экземпляра класса

От Upgrade.java, Я хочу, чтобы проверить, находится ли координата X любого экземпляра BasicEnemy рядом с координатой X любого экземпляра Upgrade. В настоящее время, у меня есть строка кода, который не работает: (. Метод main.distance потребляет два множества (X, Y) координаты и выводит расстояние между ними)

if(main.distance(getX(), getY(), BasicEnemy.getX(), BasicEnemy.getY()) < 15) 

Как я могу проверить если какой-либо экземпляр Upgrade близок к любому экземпляру BasicEnemy? Спасибо

+1

это кажется вам необходимость третий класс, ответственный за это. – nachokk

ответ

2

Самый простой способ - перебрать все основные враги и все обновления, чтобы увидеть, меньше ли расстояние между любой парой, чем вы считаете «близким».

Это можно улучшить, используя причудливые алгоритмы. Попробуйте выполнить поиск по ключевому слову spacial partitioning, если вы чувствуете академичность.

Если вы разместите код в distance, я был бы рад исправить его для вас. Не видя его, если вы уверены, что расчет расстояния правильно, проверьте, что координаты, используемые для противника и обновления находятся в одной и той же координате пространства

EDIT (т.е. обе мировые координаты.):

основе ваши комментарии, вы путаетесь о том, что означает статичность. Статическая переменная используется для каждого экземпляра класса. В этом случае у ваших врагов, конечно же, не будет статического режима getX(). Каждый враг нуждается в своей позиции, они не имеют единственного положения.

Так что я предлагаю:

  1. Сделайте ваши обновления и вражеские классы имеют нестатические х и у переменных и нестатические получить/установить процедуры.
  2. Храните все ваши экземпляры врага в структуре данных, например списке.
  3. Храните все экземпляры обновления в структуре данных, например в списке.

Затем перечислить по обоим так:

for(int i=0;i<enemies.size();i++){ 
    Enemy enemy = enemies.get(i); 
    for(int j=0;j<upgrades.size();j++){ 
     Upgrade upgrade = upgrades.get(j); 
     if(main.distance(enemy.getX(),upgrade.getX(),enemy.getY(),upgrade.getY())<15){ 
      //enemy is close to upgrade. 
     } 
    } 
} 
+0

Код для расстояния: двойное расстояние (двойной x1, двойной y1, двойной x2, двойной y2) { return Math.sqrt ((x1-x2) * (x1-x2) + (Y1-Y2) * (y1-y2)); } Однако это не проблема. Проблема заключается в том, чтобы ссылаться на BasicEnemy.getX() из нестатического контекста, поскольку BasicEnemy.getX() является статическим. Мне нужно что-то, что бы это сделать: if (main.distance (getX(), getY(), [everyInstanceOfBasicEnemy] .getX(), [everyInstanceOfBasicEnemy] .getY()) – user2562011

+0

Извините ... Я тоже нажал клавишу ввода рано. Мой ответ выше. – user2562011

+0

Это хорошо, ваши вычисления выглядят корректно. Я отредактировал свой вопрос на основе ваших комментариев о статическом контексте. –

0

Вы можете использовать Mediator, класс, который может отправить сообщение для обновления экземпляра и BasicEnemy экземпляров, но для этого вы должны сделать их коллегами поэтому создайте общий интерфейс.

public interface Targetable{ 

int getX(); 

} 

теперь в вашем классе

public BasicEnemy implements Targetable public Upgrade implements Targetable

и класс Mediator

public class TargetMediator { 
    Set<Upgrade> upgradeables; 


    public Targeteable isSomeOneCloseToMe (Targeteable basicEnemy){ 
       //code here 
    } 

    } 

Вы можете захотеть прочитать об этом дизайн-шаблон: Mediator

+0

У меня уже есть интерфейс, Entity, который имеет метод getX(), и как BasicEnemy, так и Upgrade реализуют его. Я просто использовал бы это вместо «Targetable»? – user2562011

+0

@ user2562011 Да, вы поняли, что можете читать о шаблоне «Посредник», похоже, это то, что вы ищете! – nachokk

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