好的,所以我有这个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我确定问题出在地图板上...:\我猜...
谢谢, 丹
答案 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;
在这两种情况下,你都在检查同样的事情!这在逻辑上是错误的。事实上,第一次检查是你得到异常的原因:你问左边是否安全,然后你走对了!