在java中正确表示2d世界

时间:2014-03-09 15:18:35

标签: java 2d-games

我正在用Java制作滚动游戏,我想澄清一点。 我不保存游戏级别的任何结构java,我只是读取一个文件(.gif) 我改编的方式是:

  • 我使用颜色解密来解析每个像素到像素并放置在哪里 对象符合我已建立的要求。

例如:

  .
  .
  .


int w = image.getWidth();   //store the dimensions of the level image. 
int h = image.getHeight();
for(int x = 0; x < w; x++){
        for(int y = 0; y < h; y++){  //check every single pixel with this nested loop
            int pixel = image.getRGB(x, y);   //get the pixel's rgb value
TYPE_INT_ARGB formatint red = (pixel >> 16) & 0xff;  
            int green = (pixel >> 8) & 0xff;   
            int blue = (pixel) & 0xff;

            if(red == 255 && green == 255 && blue == 0)
                controller.addPlayer((float)x, (float)y);
            else if(red == 255 && green == 255 && blue == 255)  
                controller.addTerrain(x, y);
}

你可以看到我没有在任何结构中保存关卡,但我只扫描代表它的图像文件。

  • 这样做是个好主意吗?

当然我用控制器类存储所有对象,其中我创建一个包含所有游戏对象的arrayList。

1 个答案:

答案 0 :(得分:1)

您可以制作.txt文件并创建如下地图:

20
10
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 

0表示空气,1表示可步行的瓷砖。第一个值是地图宽度,第二个值是地图高度。 我还建议您使用二维数组来存储地图信息。现在,您可以使用BufferedReader读取txt文件。希望下面的代码有帮助

private final int TILE_SIZE = 30;
private int[][] blocks;

private void loadMap(File file) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            mapWidth = Integer.parseInt(reader.readLine());
            mapHeight = Integer.parseInt(reader.readLine());
            blocks = new int[mapHeight][mapWidth];

            for(int col = 0; col < mapHeight; col ++) {
                String line = reader.readLine();
                String[] tokens = line.split(" ");
                for(int row = 0; row < numBlocksRow; row++) {
                    blocks[col][row] = Integer.parseInt(tokens[row]);
                }
            }
            reader.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

private void render(Graphics2D g) {
    for(int col = 0; col < mapHeight; col ++) {
        for(int row = 0; row < numBlocksRow; row++) {
            int block = blocks[col][row];
            Color color;
            if(block == 1) {
                color = Color.white;
            } else {
                color = Color.black;
            }
            g.fillRect(row * TILE_SIZE, col * TILE_SIZE, TILE_SIZE, TILE_SIZE);
        }
    }
}