好的,所以我有这个applet,可以让玩家在瓷砖之间移动他的32x32角色...,只要他在地图边缘,然后将其移动到其他位置...,我会得到ArrayIndexOutOfBounds异常。另外,发生这种情况时,角色可以穿过被阻塞的砖块!但是,这仅发生在东边和南边,而在南边,角色从边缘移开时不能穿过被遮挡的砖块。

我不知道该如何解决,也许您可​​以帮助我?

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

java - Java Applet-ArrayIndexOutOfBoundsException-LMLPHP


这是代码:


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

导入java.awt .;进口
java.awt.event .;进口
java.applet.Applet;导入java.io .;
导入java.util .;

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

图片[]个图块; //拼贴数组Image
球员//玩家图片int x,y,px,
py,tx,ty; // x tile-y tile //
玩家x-玩家y // //瓷砖x-瓷砖y
布尔左,右,下,上,
canMove,重生; // 是真的? int [] []
板; //最终排行
制图经验!最终诠释
NUM_TILES = 33; //多少个图块
我们执行?标签lx,ly; // 至
看看我们在哪里!整数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",


一世))); }

    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 =新Label(“ LastX”,Label.LEFT);
lbl2 = new Label(“ 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); //添加更多
瓷砖在这里}

公共无效keyPressed(KeyEvent e){

如果(isInBound(lastX,lastY)== 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 =


真正; down = true;

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

  }catch(ArrayIndexOutOfBoundsException


dap){System.out.println(“ Array Index
超出范围...:(\ n“ +
dap.getCause()); }

如果(left == true){如果
(e.getKeyCode()== KeyEvent.VK_LEFT){
左=真;
px = px-32;
lastX = lastX-1; }}

if(right == true){如果
(e.getKeyCode()== KeyEvent.VK_RIGHT)
{
正确=真;
px = px + 32;
lastX = lastX +1; }}

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

如果(up == true){

      if (e.getKeyCode() ==


KeyEvent.VK_UP){
up = true;
py = py-32;
lastY = lastY-1; }}

字符串txtLastX =
Integer.toString(px);
lbl1.setText(txtLastX);

字符串txtLastY =
Integer.toString(py);
lbl2.setText(txtLastY);

字符串txtLastX1 =
Integer.toString(lastX);
p1.setText(txtLastX1);

字符串txtLastX2 =
Integer.toString(lastY);
p2.setText(txtLastX2); repaint();

} public void keyReleased(KeyEvent
e){

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

公共无效涂料(图形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


*行,此);

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


公共布尔被阻止(int tx,int ty)
{返回
BLOCKED_TILES。包含(board [ty] [tx]);
}

公共布尔isInBound(int r,int
C) {
return(r> = 0)&&(r = 12)&&(c
} //结束整个事情


如果解决了这个问题,这会让我非常难过。 :-D我确定问题在于地图板砖中...:\我的猜测...

谢谢,

最佳答案

我引用:

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的最大允许值!

编辑:更详细:

这是您的右转支票:

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;


在两种情况下,您正在检查同一件事!从逻辑上讲,这一定是错误的。实际上,第一个检查是您使异常正确进行的原因:您问是否可以安全离开,然后就正确了!

10-05 19:44