【问题标题】:I am getting an Error when trying to load a map bigger than 4尝试加载大于 4 的地图时出现错误
【发布时间】:2015-02-15 22:23:14
【问题描述】:

错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4
    at stockman.mapping.Map.loadMap(Map.java:67)
    at stockman.mapping.Map.<init>(Map.java:23)
    at stockman.gamestate.Level1State.init(Level1State.java:21)
    at stockman.gamestate.GameState.<init>(GameState.java:18)
    at stockman.gamestate.Level1State.<init>(Level1State.java:15)
    at stockman.gamestate.MenuState.keyPressed(MenuState.java:83)
    at stockman.gamestate.GameStateManager.keyPressed(GameStateManager.java:25)
    at stockman.main.GamePanel.keyPressed(GamePanel.java:95)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
    at java.awt.Component.processKeyEvent(Unknown Source)
    at javax.swing.JComponent.processKeyEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

我的地图代码:

public class Map {

    private String path;
    private int height, width;

    private Block[][] blocks;

    public Map(String loadPath)
    {

        path = loadPath;

        loadMap();

    }


    public void draw(Graphics g){

        for(int i = 0; i < blocks.length; i++){

            for(int j = 0; j < blocks[0].length; j++){

                blocks[j][i].draw(g);

            }
        }

    }

    public Block[][] getBlocks(){

        return blocks;

    }

    public void loadMap(){

        InputStream is = this.getClass().getResourceAsStream(path);
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        try{

            width = Integer.parseInt(br.readLine());
            height = Integer.parseInt(br.readLine());

            blocks = new Block[height][width];

            for(int y = 0; y < height; y++){

            String line = br.readLine();

            String[] tokens = line.split("\\s+");

                for(int x = 0; x < width; x++){

                    blocks[x][y]= new Block(x * Block.blockSize ,y * Block.blockSize, Integer.parseInt(tokens[x]));

                }

            }


        }catch(NumberFormatException | IOException e){

            e.printStackTrace();

        }

    }
}

我的 map1.map 代码:

4
4
1 1 1 1 
1 1 1 1 
1 1 1 1 
1 1 1 1 

我无法让地图变得大于 4,当我尝试让地图变得更大时,我得到了那个错误

这是我的块类:

公共类块扩展矩形{

private static final long serialVersionUID = 1L;

public static final int blockSize = 64;
private int id;

public Block(int x, int y, int id) {
    setBounds(x, y, blockSize, blockSize);
    this.id = id;
}

public void tick() {

}

public void draw(Graphics g) {
    g.setColor(Color.BLACK);

    if(id != 0){

    g.fillRect(x - (int)GameState.xOffset, y - (int)GameState.yOffset, width, height);
    }
}

//getters and setters

public void setID(int id){

    this.id = id;

}

public int getID(){

    return id;
}

}

如果有人可以帮助我,我将不胜感激,我非常擅长编程,但这个让我完全难住了!

【问题讨论】:

    标签: java dictionary


    【解决方案1】:
         blocks = new Block[height][width];
    
        for(int y = 0; y < height; y++){
    
        String line = br.readLine();
    
        String[] tokens = line.split("\\s+");
    
            for(int x = 0; x < width; x++){
    
                blocks[x][y]= new Block(x * Block.blockSize ,y * Block.blockSize, Integer.parseInt(tokens[x]));
    
            }
    
        }
    

    查看您如何使用 blocks[height][width] 设置数组,然后为它们分配 blocks[x][y](其中 x 可预测地循环直到宽度和 y 高度),反之亦然。这就是你吹数组索引的原因。

    出于同样的原因,您的绘图函数看起来也很可疑。

    【讨论】:

    • 我将 x 更改为宽度,将 y 更改为高度,但没有运气
    • 你能给我看看它爆炸的地图吗?你说它在 4 点起作用
    • 我采用了不同的方式,在代码中而不是地图中设置高度和宽度。不过感谢您的帮助!
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2014-07-28
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多