【问题标题】:Two Dimensional ArrayList of tiles瓷砖的二维数组列表
【发布时间】:2012-11-10 00:30:19
【问题描述】:

我现在有一个数组,

    static int[][] map = new int[WIDTH][HEIGHT];

此代码在地图上放置图块:

for (int y = 18; y < HEIGHT; y++) {
        for (int x = 0; x < WIDTH; x++) {
            map[x][y] = STONE;
        }

    }

    for (int y = 18; y < 19; y++) {
        for (int x = 0; x < WIDTH; x++) {
            map[x][y] = GRASS;
        }

    }

    for (int y = 19; y < 20; y++) {
        for (int x = 0; x < WIDTH; x++) {
            map[x][y] = DIRT;
        }

    }

这是我渲染它们的方式:

for (int x = 0; x < WIDTH; x++) {
        for (int y = 0; y < HEIGHT; y++) {
            switch (map[x][y]) {
            case CLEAR:
                air.draw(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
                break;
            case STONE:
                stone.draw(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
                break;
            case GRASS:
                grass.draw(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
                break;
            case DIRT:
                dirt.draw(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
                break;
            }
        }
    }

如何转换此代码以将数组映射替换为二维数组列表,以便像我的世界一样移除这些图块?

【问题讨论】:

  • 是的,所以我可以添加和删除图块。我不必这样做吗?或者我应该使用数组进行渲染,然后使用数组列表来访问它们?老实说,我很困惑......
  • 为什么这些是循环,如果只运行一次:for (int y = 18; y &lt; 19; y++) {for (int y = 19; y &lt; 20; y++) {您可以直接使用索引。 例如只有一个循环为:for (int x = 0; x &lt; WIDTH; x++) { map[x][18] = GRASS; }
  • @YogendraSingh 哦,是的,我想我可以,感谢您指出这一点!

标签: java tile


【解决方案1】:

试试

ArrayList<ArrayList<Integer>> map = new ArrayList<ArrayList<Integer>>();

基本上你是创建一个数组列表的数组列表,而这些数组列表又是整数列表。

【讨论】:

  • 但是我如何访问这两个变量列表,以便我可以放下瓷砖?现在我使用map[x][y] 来放置瓷砖。我将如何处理数组列表?
  • 你可以使用map.get(x).get(y)。
  • @user1724140 这不行,它只是说左边需要是一个变量....
  • 将其替换为 map.get(x).set(y, STONE);哎呀对不起,深夜;/ 另请注意,这通常用于修改该索引处的元素。如果您使用 for 循环以正确的顺序插入元素(如上面的代码),只需使用 add方法。 map.get(x).add(STONE);
  • @user1724140 好的,谢谢,帮了大忙,现在如何获取图块的坐标,以便使用 switch 语句绘制图块?
【解决方案2】:

就我个人而言,我会使用单个 List 来执行此操作,并使用数学来确定我正在查看的图块。

List<Integer> map = new ArrayList<Integer>(WIDTH * HEIGHT);

要找到您感兴趣的索引,您可以这样做:

//note that this is 0 based

//find (0,0)
map.get(0 * WIDTH  + 0);

//find (0,1)
map.get(0 * WIDTH  + 1);

//find (1,0)
map.get(1 * WIDTH  + 0);

//In general
//find (x,y)
map.get(x * WIDTH  + y);

然后您可以利用相同的数学运算将值设置到 List

map.set(x * WIDTH + y, STONE);

【讨论】:

  • 哇,这很有道理,所以我会在我的 for 循环中使用map.set(x * WIDTH + y, STONE);?编辑:那么 STONE 现在会设置成什么?现在它是一个 int 设置为 1,我现在需要将它设为 arraylist 吗?
  • 现在我的 switch 语句不起作用,它会抛出这个错误:Cannot switch on a value of type ArrayList&lt;Integer&gt;. Only convertible int values, strings or enum variables are permitted
  • switch 语句不能接受任意对象,如编译器警告所述。你需要做这样的事情:switch(map.get(x * WIDTH + y).intValue())
  • 谢谢,但是.intValue() 并不能解决问题。感谢所有的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多