Метод проверки столкновений работает на Mac, но не на ПК - PullRequest
0 голосов
/ 20 февраля 2012

Так что я в тупике.Вот мой метод проверки столкновения`

 public void checkCollision ()
  {
   for (int i = 0; i < bullets.size()-1; i ++)
{
  for (int j = 0; j < enemiesLaunched.size()-1; j++)
  {
    Rectangle temp = enemiesLaunched.get(j).getRectangle();
    Rectangle temp2 = bullets.get(i).getRectangle();
    `

    if (temp2.intersects (temp))
    {
      String str = bullets.get(i).getPath();

      // since the bullets are selective, the following code is to check
      // if the right bullets hit the right germs

      if (str.equals("oil gland.png")) // bullet is from oil gland
      {
        if (enemiesLaunched.get(j).getInfo().equals("highAcid"))
        {
         enemiesLaunched.get(j).setVisible(false);
         bullets.remove(i);
        }
      }
      else if (str.equals ("sweat gland.png"))
      {
        if (enemiesLaunched.get(j).getInfo().equals("lysozome"))
        {
         enemiesLaunched.get(j).setVisible(false);
         bullets.remove(i);
        }
      }
      else
      {
        if (enemiesLaunched.get(j).getInfo().equals("mucus"))
        {
         enemiesLaunched.get(j).setVisible(false);
         bullets.remove(i);
        }
      }

`

На моем Mac это работает именно так, как я и предполагал.Однако на моем ПК это не так.Чтобы еще больше сбить с толку, я реализовал ту же логику для игр в дальнейшем, и она прекрасно работает как на Mac, так и на ПК, любая помощь будет принята с благодарностью!

Ответы [ 3 ]

2 голосов
/ 20 февраля 2012

Как ты делаешь свою дельту времени, и какова скорость на двух объектах?Если ваша дельта времени достаточно велика, вы можете не обнаружить столкновения, так как два объекта могут проходить сквозь проверки между ними.Посмотрите здесь для объяснения.

1 голос
/ 20 февраля 2012

Я бы предпочел использовать циклы for, как это, если это возможно, чтобы убедиться, что у меня нет неправильных индексов из-за опечаток или чего-то еще:

List<Enemy> enemies = new ArrayList<Enemy>;
for (Enemy enemy : enemies) {
    ...
}

Например, с помощью этого цикла:

for (int i = 0; i < enemies.size()-1; ++i)

Вы всегда оставите последнего "врага" нетронутым.

И затем, чтобы быть уверенным, что я не испорчу свои списки и итерации, я буду хранить ссылки на объекты, которые необходимо удалить, и удаляю их впоследствии, потому что я не уверен, что происходит при удалении элементов из коллекции. перебирая одну и ту же коллекцию. Поведение может зависеть от типа коллекции и реализации (коллекции).

1 голос
/ 20 февраля 2012

Что слезы внимания это size()-1 - конечно?Но за bullets.remove(i); обязательно должно следовать --i;, так как в противном случае для увеличения будет пропущен следующий пункт.

Оптимизировано это будет, если оставить get(i) и get(j) в их собственных переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...