그래, 플레이어가 타일 사이에서 32x32 캐릭터를 움직일 수있게 해주는이 애플릿을 가지고 ... 그리고지도의 가장자리에있을 때마다 다른 곳으로 이동합니다 ... ArrayIndexOutOfBounds 예외가 발생합니다. 또한, 이런 일이 생기면 캐릭터는 막힌 타일을 걸을 수 있습니다! 그러나 이것은 동쪽과 남쪽 가장자리에서만 발생하지만 남쪽 가장자리에서는 캐릭터가 가장자리에서 멀어지면 막혀있는 타일을 걸을 수 없습니다.Java Applet - ArrayIndexOutOfBoundsException
이 문제를 해결하는 방법을 모르겠지만 도움을 드릴 수 있습니까?
여기 내 문제를 설명 날의 이미지입니다 :
다음applet http://i26.tinypic.com/64qujt.jpg
코드입니다 :
/** 타일 발전기 프로그래머 : 댄 J. 덕분에 : g00se, pbl, 매니. 시작 2010 년 5 월 23 일 **/
import java.awt. ; import java.awt.event.; import java.applet.Applet; java.io. ; 가져 오기 java.util.;
Public 클래스 tileGen 애플릿 는 {
이미지 [] 타일 KeyListener이 구현 연장; // 타일 배열 이미지 플레이어; // 플레이어 이미지 int x, y, px, py, tx, ty; // x 타일 - y 타일 // 플레이어 x - 플레이어 y // 타일 x - 타일 y 부울 left, right, down, up, canMove, respawn; // 사실이다? int [] [] 보드; // 궁극적으로 행 타일을 매핑 매핑 경험! 최종 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",
i)); }
player = getImage(getClass().getResource("player.png"));
// 우리 플레이어 addKeyListener (this); 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.추가 (0);
BLOCKED_TILES.add (6);
BLOCKED_TILES.add (25);
BLOCKED_TILES.add (3); (사실 isInBound (lastX, lastY) ==가) { 에서 System.out.println이 ("\ n 삭제가 OFF 가면 // 여기에 더 타일}공공 무효의 keyPressed (KeyEvent를 전자) {
를 추가 그리드. \ 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; 아래로 = 사실;
{시도하는 경우 (블록 (R1, R2) == TRUE) 오른쪽 = 거짓; // 우리는 바로 갈 수없는 경우 (참 차단 (U1, U2) ==) 거짓 최대 = ; // (blocked (l1, l2) == true) left = false; 가 // 우리가 왼쪽으로 갈 수없는 경우 (차단 (D1, D2) == true)가 아래로 = 거짓; // 우리는 아래로 갈 수
}catch(ArrayIndexOutOfBoundsException
DAP) {에서 System.out.println이 ("배열 인덱스 가 범위 외에있는 ... (\ n을"+ dap.getCause());}
경우 (왼쪽 == TRUE) { (e.getKeyCode() == KeyEvent.VK_LEFT 있으면) {= 참 왼쪽; PX PX = - 32; lastX lastX = - 1;}}
if (right == true) { (e.getKeyCode() == KeyEvent.VK_RIGHT) { right = true; px = px + 32; lastX = lastX + 1; }}
if (down == true) { (e.getKeyCode() == KeyEvent.VK_DOWN) { down = true; py = py + 32; lastY = lastY + 1; }}
(최대 == TRUE) {if (e.getKeyCode() ==
KeyEvent.VK_UP) {경우 최대 = TRUE; py = py-32; lastY = lastY - 1; }}
문자열 txtLastX = 가지는 Integer.toString (PX); lbl1.setText (txtLastX);문자열 txtLastY = 가지는 Integer.toString (평); lbl2.setText (txtLastY);
문자열 txtLastX1 = Integer.toString (lastX); p1.setText (txtLastX1);
문자열 txtLastX2 = Integer.toString (lastY); p2.setText (txtLastX2); repaint();
공개 무효 페인트 (그래픽 g)을 무시 //} 공공 무효의 keyReleased (KeyEvent를 E) {
} 공개 무효 의 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
* 행, this);
g.drawImage (player, 0,0, this);
System.out.println ("Respawned!");
respawn = false; }} 공개 부울 { BLOCKED_TILES.contains (보드 [타이를 [TX])를 호출 (INT의 TX, TY의 INT)을 차단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; }
// 최종 페인트 방법; }
공개 부울 isInBound (INT의 R, INT c) { 창 (R> = 0) & & (R < 8) & & (c> = 12) & & (1 < c); 이 해결 된 경우}
} // 끝 전부
,이 날 매우 슬픈 만들 것입니다. - D 나는 문제가지도 보드 타일 ... 내에있는 확신 ...
감사합니다 \ 내 생각 엔, 댄
1. 예외의 스택 추적을 제공하십시오. 2. 코드의 관련 부분, 즉 예외가 발생한 행 근처에만 코드를 제공하십시오. – Bozho
언제든지 .printStackTrace를 추가하면 "void is not allowed"또는 뭔가 거짓말을하게됩니다. – nn2
프로그래밍 스타일을 한 마디로 요약하면 다음과 같습니다. if ... inBound() ... "그리드를 벗어났습니다!" '- 거꾸로 논리처럼 들린다. 너가 범위 안에 있으면, 너는 평상시 정의에 의해 그리드에서 벗어나지 않는다. 또한 모든'== true'는 불필요합니다.'if (right == true)'를'if (right)'와'if (respawn == false)'를'if (! respawn)'로 바꿀 수 있습니다. –