ОК, поэтому у меня есть этот апплет, который позволяет игроку перемещать свой 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
1. Укажите стопку исключения. 2. Дайте только соответствующие части кода - т. Е. Рядом с строками, в которых происходит исключение. – Bozho
В любое время я добавляю .printStackTrace Я получаю сообщение об ошибке «void is not allowed» или что-то liek, которое ... – nn2
Букет каблементов стиля программирования: 'if ... inBound() ...« Вы ушли с сетки! » '- это звучит как обратная логика. Если вы находитесь в пределах, вы НЕ с сетки, по обычным определениям. Кроме того, все '== true' не нужны.Вы можете заменить 'if (right == true)' на 'if (right)' и 'if (respawn == false)' с 'if (! Respawn)'. –