0

練習のためにJavaでローグライクを作ろうとしています。これは、床を生成するための私のコードです (現在は、端に壁のタイルがある大きな部屋です)。タイル配列の特定のタイルを壁タイルまたは床タイルに設定しようとしています。ただし、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

このコードは、同じ変数を 2 回設定していますが、何もしていません。

 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 オブジェクトに変更されます。

于 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 でタイルの値を取得し、それをローカル変数 ( 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 に答える