Java Applet - ArrayIndexOutOfBoundsException

时间:2010-07-10 05:43:32

标签: java arrays applet

好的,所以我有这个applet,让玩家可以在瓷砖之间移动他的32x32字符......任何时候他都在地图的边缘然后移动到其他地方......我得到一个ArrayIndexOutOfBounds异常。此外,当发生这种情况时,角色可以穿过被阻挡的瓷砖!然而,这只发生在东部和南部边缘,但是在南边缘,角色在远离边缘时不能穿过被阻挡的瓷砖。

我不知道如何解决这个问题,也许你可以帮助我?

这是我解释我的问题的图片:

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

以下是代码:

  

/ ** Tile Generator程序员:Dan J.   感谢:g00se,pbl,Manny。入门   2010年5月23日   ** /

     

import java.awt。;进口   java.awt.event中。进口   java.applet.Applet中; import java.io. ;   import java.util。;

     

公共类tileGen扩展了Applet   实现KeyListener {

     

图片[]图块; // tile数组图片   玩家; // player image int x,y,px,   py,tx,ty; // x tile - y tile //   玩家x - 玩家y //平铺x - 平铺y     布尔左,右,下,上,   canMove,respawn; // 是真的? 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(本);           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   THE 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 =
     

真; down = true;

     

尝试{if(blocked(r1,r2)== true)   对=假; //我们不能走对         if(blocked(u1,u2)== true)up =   假; //如果我们不能上去   (阻塞(l1,l2)== true)left = false;   //如果我们不能离开   (阻塞(d1,d2)== true)down = false;   //我们不能下去

  }catch(ArrayIndexOutOfBoundsException
     

dap){System.out.println(“数组索引   超出界限...... :( \ n“+   dap.getCause()); }

     

if(left == true){if   (e.getKeyCode()== KeyEvent.VK_LEFT){                 left = true;                 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){                 down = true;                 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(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);重绘();

     

} public void keyReleased(KeyEvent   E){

     

} //忽略public void   keyTyped(KeyEvent e){} // ignore

     

public void paint(Graphics g){

    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
     

* row,this);

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

g.drawImage(player,0,0,this);
  的System.out.println( “重生!”);
  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;
}
     

public boolean blocked(int tx,int ty)   {返回   BLOCKED_TILES.contains(板[TY] [TX]);   }

     

public boolean isInBound(int r,int   C) {       返回(r&gt; = 0)&amp;&amp; (r&lt; 8)&amp;&amp; (c> = 12)&amp;&amp; (c <1); }

     

} //结束整个事情

如果这个问题得到解决,这将使我非常并不悲伤。 :-D我确定问题出在地图板上...:\我猜...

谢谢, 丹

1 个答案:

答案 0 :(得分: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吗?我想你要确保它低于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;

在这两种情况下,你都在检查同样的事情!这在逻辑上是错误的。事实上,第一次检查是你得到异常的原因:你问左边是否安全,然后你走对了!