2010-07-10 3 views
0

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

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

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

applet http://i26.tinypic.com/64qujt.jpg

Вот код:

/** Плитка Генератор Программист: Dan J. Благодаря: g00se, pbl, Мэнни. Начато 23 мая 2010 г. **/

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

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

Image [] плитка; // tile arrays Изображение плеер; // player image int x, y, px, py, tx, ty; // x tile - y tile // игрок x - игрок y // tile x - tile y boolean left, right, down, up, canMove, respawn; // правда? int [] [] плата; // строка плитки для окончательного опыт отображения! final int NUM_TILES = 33; // Сколько плиток мы реализуем? Label lx, ly; // to Посмотрите, где мы находимся! int r1, r2, u1, u2, l1, l2, d1, d2;

int lastX, lastY, row, col; Ярлык lbl1, lbl2, p1, p2;

общественного недействительными Init() {

плата = 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", 

i))); }

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(); static {
BLOCKED_TILES.add (24);
BLOCKED_TILES.Добавить (0);
BLOCKED_TILES.add (6);
BLOCKED_TILES.add (25);
BLOCKED_TILES.add (3); // добавить больше плитки здесь}

общественного недействительный Keypressed (KeyEvent е) {

если (isInBound (lastX, ласты) == TRUE) { System.out.println ("\ nВ Ушли GRID. \ 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; down = true;

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

}catch(ArrayIndexOutOfBoundsException 

DAP) {System.out.println ("Index массива находится вне границ ...: (\ п" + dap.getCause());}

, если (слева == TRUE) {если (e.getKeyCode() == KeyEvent.VK_LEFT) { левый = TRUE; ПВ = ПВ - 32; lastX = lastX - 1;}}

if (right == true) {if (e.getKeyCode() == KeyEvent.VK_RIGHT) { right = true; px = px + 32; lastX = lastX + 1; }}

if (down == true) {if (e.getKeyCode() == KeyEvent.VK_DOWN) { down = true; py = py + 32; lastY = lastY + 1; }}

, если (до == TRUE) {

 if (e.getKeyCode() == 

KeyEvent.VK_UP) { вверх = истина; py = py - 32; lastY = lastY - 1; }}

String txtLastX = Integer.toString (px); lbl1.setText (txtLastX);

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

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

String txtLastX2 = Integer.toString (lastY); p2.SetText (txtLastX2); перекрасить();

} общественного недействительными keyReleased (KeyEvent е) {

} // игнорировать общественное аннулируются keyTyped (KeyEvent е) {} // игнорировать

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

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 (player, 0,0, this);
System.out.println («Respawned!»);
respawn = false; } } // конец метода краска

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

общественного логический заблокирован (INT ТХ, внутр TY) {возвращение BLOCKED_TILES.contains (доска [во партий] [ТХ]); }

общественного логический isInBound (INT R, Int с) { возврата (г> = 0) & & (г < 8) & & (с> = 12) & & (с < 1); }

} // конец все дело

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

Спасибо, Dan

+2

1. Укажите стопку исключения. 2. Дайте только соответствующие части кода - т. Е. Рядом с строками, в которых происходит исключение. – Bozho

+0

В любое время я добавляю .printStackTrace Я получаю сообщение об ошибке «void is not allowed» или что-то liek, которое ... – nn2

+0

Букет каблементов стиля программирования: 'if ... inBound() ...« Вы ушли с сетки! » '- это звучит как обратная логика. Если вы находитесь в пределах, вы НЕ с сетки, по обычным определениям. Кроме того, все '== true' не нужны.Вы можете заменить 'if (right == true)' на 'if (right)' и 'if (respawn == false)' с 'if (! Respawn)'. –

ответ

1

Цитирую:

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!

EDIT: Более подробно:

Вот ваш чек на ладится:

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; 

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

+0

Мне жаль, что это не имело смысла для меня. Извините, английский не мой первый язык ... :( – nn2

+0

Но что вы предлагаете? – nn2

+0

@ Dan - попробуйте еще раз. Это имеет смысл для меня. * «Но что вы предлагаете мне делать?» *. второе предложение объясняет это. –