好的,所以我有这个applet,可以让玩家在瓷砖之间移动他的32x32角色...,只要他在地图边缘,然后将其移动到其他位置...,我会得到ArrayIndexOutOfBounds异常。另外,发生这种情况时,角色可以穿过被阻塞的砖块!但是,这仅发生在东边和南边,而在南边,角色从边缘移开时不能穿过被遮挡的砖块。
我不知道该如何解决,也许您可以帮助我?
这是我的图片,解释了我的问题:
这是代码:
/ ** 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;
在两种情况下,您正在检查同一件事!从逻辑上讲,这一定是错误的。实际上,第一个检查是您使异常正确进行的原因:您问是否可以安全离开,然后就正确了!