Java Applet

好吧,我有这个小程序可以让玩家在瓦片之间移动他的32x32字符......并且任何时候他在地图的边缘,然后在其他地方移动......我得到一个ArrayIndexOutOfBounds异常。 而且,当发生这种情况时,角色可以穿过阻塞的瓦片! 然而,这只发生在东部和南部的边缘,但在南部的边缘,角色不能在从边缘移开时穿过阻塞的瓷砖。

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

这是我解释我的问题的一个形象:

小程序http://i26.tinypic.com/64qujt.jpg

代码如下:

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

import java.awt .; import java.awt.event .; import java.applet.Applet; import java.io .; import java.util .;

公共类tileGen扩展Applet实现KeyListener {

Image []瓷砖; //瓦片阵列图像播放器; //播放器图像int x,y,px,py,tx,ty; // x tile - y tile // player x - player y // tile x - tile y boolean left,right,down,up,canMove,respawn; // 是真的? int [] []板; //为终极地图体验排列拼贴图! final 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",

一世))); }

    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.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)right = false; //如果(阻塞(u1,u2)== true),我们不能进入正确的状态up = false; //我们不能上去if(blocked(l1,l2)== true)left = false; 如果(阻塞(d1,d2)== true),我们不能离开; down = false; //我们不能下去

  }catch(ArrayIndexOutOfBoundsException

dap){System.out.println(“Array Index is Out Bounds ...::( 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){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; }}

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){} //忽略

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){return BLOCKED_TILES.contains(board [ty] [tx]); }

public boolean isInBound(int r,int c){return(r> = 0)&&(r <8)&&(c> = 12)&&(c <1); }

} //结束整件事情

如果这解决了,这会让我非常难过。 :-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;

你在两种情况下都检查相同的东西! 这在逻辑上是错误的。 事实上,第一个检查就是你让异常正确的原因:你问左边是否安全,然后你走对了!

链接地址: http://www.djcxy.com/p/66565.html

上一篇: Java Applet

下一篇: AI for a Final fantasy tactics