【发布时间】:2011-03-14 04:17:24
【问题描述】:
好的,所以我有这个小程序,它可以让玩家在图块之间移动他的 32x32 角色......并且任何时候他在地图边缘然后移动到其他任何地方......我得到一个 ArrayIndexOutOfBounds 异常。此外,当这种情况发生时,角色可以穿过被阻挡的瓷砖!然而,这只发生在东边和南边,但在南边,角色在离开边缘时不能穿过阻塞的瓷砖。
我不知道如何解决这个问题,也许你可以帮助我?
这是我解释我的问题的图片:
代码如下:
/** Tile Generator 程序员:Dan J. 感谢:g00se、pbl、曼尼。开始 2010 年 5 月 23 日 **/
导入 java.awt.;进口 java.awt.event.;进口 java.applet.小程序;导入 java.io.; 导入 java.util.;
公共类 tileGen 扩展 Applet 实现 KeyListener {
图像[] 瓦片; // 平铺数组图像 播放器; // 玩家图像 int x, y, px, py,tx,ty; // x 瓦片 - y 瓦片 // 玩家 x - 玩家 y // 瓷砖 x - 瓷砖 y 布尔左、右、下、上、 可以移动,重生; // 是真的?整数[][] 木板; // 最终的行图块 测绘体验!最终整数 NUM_TILES = 33; // 有多少个瓦片 我们实施?标签 lx, ly; // 到 看看我们在哪里!整数 r1, r2, u1,u2,l1,l2,d1,d2;
int lastX, lastY, row, col;标签 lbl1, lbl2, p1, p2;
公共无效初始化(){
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(this); 可以移动=真; int spawnX = 4; int spawnY = 4; 像素=0; py = 0; 最后X = 0; 最后一个 = 0; lbl1 = new 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 = newHashSet();静态{
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("\n你走了 网格。\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= 最后一个 Y + 1; }否则{ d2 = 0; }
right = true; left = true; up =真;向下=真;
尝试 { if (blocked(r1,r2) == true) 对=假; // 我们不能正确 如果(阻塞(u1,u2)==真)向上= 错误的; // 如果我们不能上升 (阻塞(l1,l2)==真)左=假; // 如果我们不能向左走 (阻塞(d1,d2)==真)向下=假; // 我们不能下去
}catch(ArrayIndexOutOfBoundsExceptiondap) { System.out.println("数组索引 超出范围...:(\n" + dap.getCause()); }
如果(左==真){如果 (e.getKeyCode() == KeyEvent.VK_LEFT) { 左=真; 像素 = 像素 - 32; 最后X = 最后X - 1; } }
如果(对 == 真){ 如果 (e.getKeyCode() == KeyEvent.VK_RIGHT) { 对=真; 像素 = 像素 + 32; 最后X = 最后X + 1; } }
if (down == true) { 如果 (e.getKeyCode() == KeyEvent.VK_DOWN) { 向下=真; py = py + 32; 最后一个 = 最后一个 + 1; } }
如果(向上 == 真){
if (e.getKeyCode() ==KeyEvent.VK_UP) { 向上=真; py = py - 32; 最后一个 = 最后一个 - 1; } }
字符串 txtLastX = 整数.toString(px); lbl1.setText(txtLastX);
字符串 txtLastY = 整数.toString(py); lbl2.setText(txtLastY);
字符串 txtLastX1 = Integer.toString(lastX); p1.setText(txtLastX1);
字符串 txtLastX2 = Integer.toString(lastY); p2.setText(txtLastX2);重绘();
} public void keyReleased(KeyEvent e){
} // 忽略公共 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* 行,这个);
} } if (respawn == false) { g.drawImage(player, px, py, this); } if (respawn == true) {g.drawImage(播放器, 0,0, this);
System.out.println("重生!");
重生=假; } } // 结束绘制方法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.contains(board[ty][tx]); }
public boolean isInBound(int r, int C) { 返回 (r >= 0) && (r = 12) && (c
} // 结束整个事情
如果解决了,这会让我非常不伤心。 :-D 我确定问题出在地图板上... :\ 我的猜测...
谢谢, 丹
【问题讨论】:
-
1.给出异常的堆栈跟踪。 2. 只给出代码的相关部分——即在发生异常的行附近。
-
每当我添加 .printStackTrace 时,我都会收到错误“不允许使用 void”或类似...
-
一堆编程风格的小问题:
if ... inBound()... "You went off the grid!"- 这听起来像是倒退逻辑。如果你在界限之内,按照通常的定义,你就不会脱离网格。此外,所有== true都是不必要的。您可以将if (right == true)替换为if (right),将if (respawn == false)替换为if (!respawn)。 -
@Dan - 弄清楚导致编译错误的原因!
-
我的意思是斯蒂芬... printStackTrace 错误发生在 java 小程序骨架上...@Carl...我知道...但我仍然不明白您可能的答案。