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