Java-апплет - ArrayIndexOutOfBoundsException - PullRequest
0 голосов
/ 10 июля 2010

ОК, так что у меня есть этот апплет, который позволяет игроку перемещать свой символ 32x32 между плитками ... и каждый раз, когда он находится на краю карты, он перемещается куда-либо еще ... Я получаю исключение ArrayIndexOutOfBounds. Также, когда это происходит, персонаж может пройти через заблокированные плитки! Однако это происходит только на восточном и южном краях, но на южном краю персонаж НЕ МОЖЕТ пройти сквозь заблокированные плитки при удалении от края.

Я не знаю, как это исправить, и, может быть, вы могли бы мне помочь?

Вот мое изображение, объясняющее мою проблему:

апплет http://i26.tinypic.com/64qujt.jpg

Вот код:

/ ** Tile Generator Программист: Дэн Дж. Спасибо: g00se, pbl, Мэнни. Началось 23 мая 2010 г. ** /

import java.awt. ; Импортировать java.awt.event . Импортировать java.applet.Applet; import java.io. ; import java.util. ;

общественный класс tileGen расширяет апплет реализует KeyListener {

Изображение [] плитки; // мозаичные изображения игрок; // изображение игрока int x, y, px, py, tx, ty; // x плитка - y плитка // игрок x - игрок y // плитка x - плитка y логическое значение влево, вправо, вниз, вверх, canMove, респаун; // правда? ИНТ [] [] доска; // рядные плитки для окончательного опыт картирования! финал int NUM_TILES = 33; // сколько плиток мы внедряем? Метка lx, ly; // для посмотри где мы находимся! int r1, r2, u1, u2, l1, l2, d1, d2;

int lastX, lastY, row, col; этикетка lbl1, lbl2, p1, p2;

public void init () {

board = loadBoard ();

tiles = new Image[NUM_TILES];     for(int i = 0;i < NUM_TILES;i++) {
  tiles[i] = getImage(getClass().getResource(String.format("tiles/t%d.png",
* * Я тысяча тридцать один))); }
    player = getImage(getClass().getResource("player.png"));

// наш игрок addKeyListener (это); canMove = true; int spawnX = 4; int spawnY = 4; px = 0; py = 0; lastX = 0; lastY = 0; lbl1 = новая метка («LastX», Label.LEFT); lbl2 = новая метка («LastY», Label.LEFT);

      p1 = new Label("X", Label.LEFT);
      p2 = new Label("Y", Label.LEFT);
       add(lbl1);
       add(lbl2);

       add(p1);
       add(p2);
       this.setFocusable( true );
}

private static final HashSet<Integer> BLOCKED_TILES = new
* * HashSet тысяча тридцать-семь (); статический {

BLOCKED_TILES.add (24);
BLOCKED_TILES.add (0);
BLOCKED_TILES.add (6);
BLOCKED_TILES.add (25); * * одна тысяча сорок-два BLOCKED_TILES.add (3); //добавить больше плитка здесь}

public void keyPressed (KeyEvent e) {

if (isInBound (lastX, lastY) == true) { System.out.println ("\ nYOU WENT OFF СЕТКА. \ N ");}

  if (lastX > 0) {        r1 = lastX + 1;
  }else{      r1 = 0;         }       r2 = lastY;

  u1 = lastX;         if (lastY > 0) {         u2 = lastY - 1;         }else{
   u2 = 0;
   }



  if (lastX > 0) {        l1 = lastX - 1;
  }else{      l1 = 0;         }       l2 = lastY;

  d1 = lastX;         if (lastY > 0) {            d2

= lastY + 1; } else {d2 = 0; }

  right = true;       left = true;        up =

верно; вниз = true;

try {if (заблокирован (r1, r2) == true) право = ложь; // мы не можем идти прямо if (заблокирован (u1, u2) == true) up = ложный; // мы не можем подняться, если (заблокирован (l1, l2) == true) left = false; // мы не можем идти налево, если (заблокирован (d1, d2) == правда) вниз = ложь; // мы не можем спуститься

  }catch(ArrayIndexOutOfBoundsException

dap) {System.out.println ("Индекс массива выходит за пределы ...: (\ n "+ dap.getCause ()); }

if (left == true) {if (e.getKeyCode () == KeyEvent.VK_LEFT) { левый = правда; px = px - 32; lastX = lastX - 1; }}

if (right == true) {if (e.getKeyCode () == KeyEvent.VK_RIGHT) { право = правда; px = px + 32; lastX = lastX + 1; }}

if (down == true) {if (e.getKeyCode () == KeyEvent.VK_DOWN) { вниз = правда; py = py + 32; lastY = lastY + 1; }}

if (up == true) {

      if (e.getKeyCode() ==

KeyEvent.VK_UP) { up = true; py = py - 32; lastY = lastY - 1; }}

String txtLastX = Integer.toString (точек); lbl1.setText (txtLastX); * * тысяча семьдесят-одна

String txtLastY = Integer.toString (Py); lbl2.setText (txtLastY);

String txtLastX1 = Integer.toString (lastX);p1.setText (txtLastX1);

String txtLastX2 = Integer.toString (ласты); p2.setText (txtLastX2); перекрасить ();

} public void keyReleased (KeyEvent е) {

} // игнорировать публичный void keyTyped (KeyEvent e) {} // игнорировать

общественная пустота краски (графика г) {

    for (row = 0; row < board.length; row++) {
        for (col = 0; col < board[row].length; col++) {
            int index = board[row][col];
            g.drawImage(tiles[index], 32 * col, 32

* строка, это);

        }
    }
    if (respawn == false) {
    g.drawImage(player, px, py, this);    }   if (respawn == true) {      

g.drawImage (игрок, 0,0, это);
System.out.println ( "Respawned!");
респаун = ложь; } } // конец метода рисования

 public void update(Graphics g)
 {
      paint(g);
 }

public int[][] loadBoard() {
    int[][] board = {
            { 2,2,24,24,24,24,24,1,3,0,0,0 },
            { 2,2,24,23,23,23,24,1,3,0,0,0 },
            { 1,1,24,23,23,23,24,1,3,3,3,1 },
            { 1,1,24,24,23,24,24,1,1,1,1,1 },
            { 1,1,1,1,7,1,1,1,1,1,1,1 },
            { 5,1,1,1,7,7,7,7,7,1,1,1 },
            { 6,1,3,1,1,1,3,1,7,7,7,1 },
            { 6,1,3,1,3,1,1,1,1,1,7,3 }
        };    return board;
}

public boolean заблокирован (int tx, int ty) { вернуть BLOCKED_TILES.contains (совет [ти] [ТХ]); }

public boolean isInBound (int r, int в) { return (r> = 0) && (r <8) && (c> = 12) && (c <1); } </p>

} // конец всего

Если бы это было решено, это сделало бы меня чрезвычайно не грустным. :-D Я уверен, что проблема заключается в плитке карты ...: \ Мое предположение ...

Спасибо, Dan

1 Ответ

1 голос
/ 10 июля 2010

Цитирую:

if (lastX > 0) {        r1 = lastX + 1;
  }else{      r1 = 0;         }       r2 = lastY;

  u1 = lastX;         if (lastY > 0) {         u2 = lastY - 1;         }else{
   u2 = 0;
   }

Вы увеличиваете X, только если оно уже больше 0? Я думаю, вы хотите убедиться, что это меньше, чем наибольшее допустимое значение для x!

РЕДАКТИРОВАТЬ: более подробно:

Вот ваш чек на право:

if (lastX > 0) {        r1 = lastX + 1;
  }else{      r1 = 0;         }       r2 = lastY;

  u1 = lastX;         if (lastY > 0) {         u2 = lastY - 1;         }else{
   u2 = 0;
   }

... и вот ваш чек для движения налево:

  if (lastX > 0) {        l1 = lastX - 1;
  }else{      l1 = 0;         }       l2 = lastY;

Вы проверяете одно и то же в обоих случаях! Это должно быть логически неправильно. На самом деле, первая проверка - причина, по которой вы делаете исключение правильным: вы спрашиваете, безопасно ли идти налево, тогда вы идете направо!

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