0

我正在尝试在java中制作一个roguelike来练习。这是我生成地板的代码(现在只是一个边缘有墙砖的大房间)。我正在尝试将我的瓷砖阵列中的某些瓷砖设置为墙砖或地砖。虽然当他们离开 setTile 方法时,他们会恢复到进入方法之前的值。我要疯了。这是我的代码:

public Floor(int width, int height) {
        this.tiles = new Tile[(width+1)*(height+1)];
        this.width = width;
        this.height = height;
        generateTiles();    
        boolean test = false;
    }
    public Tile getTile(int x, int y)
    {
        return tiles[y * width + x];
    }

    public void setTile(int x, int y, Tile tile)
    {
        Tile tileToSet = getTile(x,y);
        tileToSet = tile;
    }
    private void generateTiles() {
        for (int i = 0; i < tiles.length; i++)
        {
            tiles[i] = new Tile();
        }
        //make the top wall
        for (int i = 0; i<width;i++)
        {
            setTile(i,0,new WallTile());
        }
    }
}
4

4 回答 4

1

这段代码两次设置相同的变量并且什么都不做。

 public void setTile(int x, int y, Tile tile)
    {
        Tile tileToSet = getTile(x,y);
        tileToSet = tile;
    }

我想你想要这样的东西:

 public void setTile(int x, int y, Tile tile)
    {
        tiles[y * width + x] = tile;
    }

这会将存储在 tile 数组中的值更改为提供的 Tile 对象。

于 2013-02-06T21:14:20.660 回答
1

看你的setTile方法:

public void setTile(int x, int y, Tile tile)
{
    Tile tileToSet = getTile(x,y);
    tileToSet = tile;
}

您在 x,y 处获取 tile 值并将其设置为局部变量 ( tileToSet),然后将tile值设置为变量tileToSet。当然,它不会改变 x,y 处的图块。tileToSet只是对值的引用,绝不是对数组元素的引用

替换为:

public void setTile(int x, int y, Tile tile)
{
    tiles[y * width + x] = tile;
}

如果您想要一个返回 tile index的方法,就像您在命令中所说的那样,您可以像这样重写 get/set 对:

public void setTile(int x, int y, Tile tile)
{
    tiles[getTileIndex(x, y)] = tile;
}

public Tile getTile(int x, int y)
{
    tiles[getTileIndex(x, y)] = tile;
}

public int getTileIndex(int x, int y)
{
    return y * width + x;
}
于 2013-02-06T21:15:01.480 回答
1

在Java中,当您将对象传递给函数时,对该对象的引用将按值复制。这意味着您不能交换磁贴参考。

你需要做的是这样的:

public Floor(int width, int height) {
        this.tiles = new Tile[(width+1)*(height+1)];
        this.width = width;
        this.height = height;
        generateTiles();    
        boolean test = false;
    }
    public Tile getTile(int x, int y)
    {
        return tiles[y * width + x];
    }

    public void setTile(int x, int y, Tile tile)
    {

        tiles[y * width + x] = tile;//this works cuz it takes the ref from the array and assigns it the copy of the reference passed in

    }
    private void generateTiles() {
        for (int i = 0; i < tiles.length; i++)
        {
            tiles[i] = new Tile();
        }
        //make the top wall
        for (int i = 0; i<width;i++)
        {
            setTile(i,0,new WallTile());
        }
    }
}

查看这篇文章以获得解释:http ://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

于 2013-02-06T21:15:45.460 回答
1

你的setTile没有意义。您正在检索当前位于该位置的图块,将其存储在局部变量 tileToSet中,然后覆盖该变量的值。

要做的是将给定的图块存储在tiles数组中。与实现方式类似getTile,您可以通过以下方式执行此操作:

public void setTile(int x, int y, Tile tile)
{
    tiles[y * width + x] = tile;
}

请注意,这等同于(但您似乎认为是):

public void setTile(int x, int y, Tile tile)
{
    Tile tileToSet = tiles[y * width + x];
    tileToSet = tile;
}
于 2013-02-06T21:15:54.993 回答