2010-07-10 3 views
0

그래, 플레이어가 타일 사이에서 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 나는 문제가지도 보드 타일 ... 내에있는 확신 ...

감사합니다 \ 내 생각 엔, 댄

+2

1. 예외의 스택 추적을 제공하십시오. 2. 코드의 관련 부분, 즉 예외가 발생한 행 근처에만 코드를 제공하십시오. – Bozho

+0

언제든지 .printStackTrace를 추가하면 "void is not allowed"또는 뭔가 거짓말을하게됩니다. – 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; 
    } 

에만 증가 이미 0보다 큰 경우 X? 나는 이것이 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; 

두 경우 모두 똑같이! 그것은 논리적으로 잘못된 것입니다. 첫 번째 확인은 실제로 예외가 발생하는 이유입니다. 왼쪽으로가는 것이 안전한지 물으면 올바르게 진행됩니다.

+0

나에게 이해가되지 않아서 미안합니다. 죄송합니다, 영어가 제 첫 번째 언어가 아닙니다. : ( – nn2

+0

하지만 내가 무엇을 제안합니까? – nn2

+0

@ Dan - 다시 시도하십시오. 나에게 의미가 있습니다. * "하지만 내가 무엇을 제안합니까?" –

관련 문제