J2ME 2D - обнаружение столкновений - PullRequest
1 голос
/ 16 марта 2012

Я создаю свою собственную игру для мобильных телефонов: 2D-графика, перемещение и стрельба солдатом.И у меня проблема.У меня два TiledLayer.Первый - земля, второй - стены, деревья и т. Д. Как я могу обнаружить столкновения с этими объектами, расположенными на втором TiledLayer?Я попробовал так: если произошло столкновение, продолжайте двигаться в направлении сзади.Это не правильно.Я двигаюсь вперед и вот стена: нажми ВВЕРХ - хорошо, солдат уходит вниз.Но когда нажимаешь ЛЕВО, солдат идет ВПРАВО, несмотря на то, что должен идти ВЛЕВО (я знаю, что таким образом написал код).

Однако, как это будет написано?

 public void run() {
   while(true) {
    int keyState = getKeyStates();
       if ((keyState & LEFT_PRESSED) != 0) {
           soldier.setTransform(Sprite.TRANS_ROT270);
            if(!(soldier.collidesWith(traps, false))) {
             soldier.move(-10, 0);
           } else {
        if((keyState & LEFT_PRESSED) != 0) soldier.move(10, 0);
    }
  }  else if ((keyState & UP_PRESSED) != 0) {
      soldier.setTransform(Sprite.TRANS_NONE);
       if(!(soldier.collidesWith(traps, false))) {
        soldier.move(0, -10);
       } else {
        if((keyState & UP_PRESSED) != 0) soldier.move(0, 10);
    }
  }  else if ((keyState & DOWN_PRESSED) != 0) {
      soldier.setTransform(Sprite.TRANS_ROT180);
       if(!(soldier.collidesWith(traps, false))) {
        soldier.move(0, 10);
       } else {
        if((keyState & DOWN_PRESSED) != 0) soldier.move(0, -10);
    }
  }  else if ((keyState & RIGHT_PRESSED) != 0) {
      soldier.setTransform(Sprite.TRANS_ROT90);
       if(!(soldier.collidesWith(traps, false))) {
        soldier.move(10, 0);
       } else {
        if((keyState & RIGHT_PRESSED) != 0) soldier.move(-10, 0);
    }
  } else if((keyState & FIRE_PRESSED) != 0) {
    createBullet();
  }

1 Ответ

1 голос
/ 29 марта 2012

Рассмотрите возможность упрощения вашего кода и добавления операторов журналирования, чтобы упростить отладку проблем, подобных описанным вами.

... как это будет написано?

Ниже приведено описание того, как я ...

перепишу "это", прежде чем даже попытаться сверлить ...

...в том, что именно пошло не так в конкретном углу фрагмента кода, приведенного в вопросе :

public void run() {
    while (true) {
        // extract method:
        handle(getKeyStates(), soldier.collidesWith(traps, false));
    }
}

private void log(String msg) { System.out.println(msg); } // simplify logging

private void moveSoldier(int dx, int dy) {
    // extract method to simplify logging
    System.out.println("move soldier, dx = [" + dx + "], dy = [" + dy + "]");
    soldier.move(dx, dy);
}

private void handle(int keyState, boolean soldierCollidesWithTraps) {
    // IMPL NOTE below code could (should) be refactored further
    if ((keyState & LEFT_PRESSED) != 0) {
        // IMPL NOTE consider extracting this block into dedicated method
        log("left pressed"); // log useful information
        soldier.setTransform(Sprite.TRANS_ROT270);
        if (!soldierCollidesWithTraps) {
            log("no collision");
            moveSoldier(-10, 0);
            return; // return as soon as we think we're done
        }
        // because of 'return' above, 'else' here is not needed anymore
        if ((keyState & LEFT_PRESSED) != 0) {
            log("left pressed - why re-check it here?");
            moveSoldier(10, 0);
            return;
        }
        log("no move"); // IMPL NOTE seems to be bug in your code logic above
        return;
    }
    if ((keyState & UP_PRESSED) != 0) {
        log("up pressed");
        soldier.setTransform(Sprite.TRANS_NONE);
        if (!soldierCollidesWithTraps) {
            log("no collision");
            moveSoldier(0, -10);
            return;
        }
        if ((keyState & UP_PRESSED) != 0) {
            log("up pressed - why re-check it here?");
            moveSoldier(0, 10);
            return;
        }
        log("no move"); // IMPL NOTE seems to be bug in your code logic above
        return;
    }
    if ((keyState & DOWN_PRESSED) != 0) {
        log("down pressed");
        soldier.setTransform(Sprite.TRANS_ROT180);
        if (!soldierCollidesWithTraps) {
            log("no collision");
            moveSoldier(0, 10);
            return;
        }
        if ((keyState & DOWN_PRESSED) != 0) {
            log("down pressed - why re-check it here?");
            moveSoldier(0, -10);
            return;
        }
        log("no move"); // IMPL NOTE seems to be bug in your code logic above
        return;
    }
    if ((keyState & RIGHT_PRESSED) != 0) {
        log("right pressed");
        soldier.setTransform(Sprite.TRANS_ROT90);
        if (!soldierCollidesWithTraps) {
            log("no collision");
            moveSoldier(10, 0);
            return;
        }
        if ((keyState & RIGHT_PRESSED) != 0) {
            log("right pressed - why re-check it here?");
            moveSoldier(-10, 0);
            return;
        }
        log("no move"); // IMPL NOTE seems to be bug in your code logic above
        return;
    }
    if ((keyState & FIRE_PRESSED) != 0) {
        log("fire pressed");
        createBullet();
        return;
    }
    log("no action");
}
...