Java - Как присвоить каждой плитке, сгенерированной из массива, уникальный идентификатор

Я пытаюсь выбрать мышью, и плитка, на которую я нажимаю, изменяется на любую противоположную плитку, т.е. трава превращается в грязь, но каждая плитка травы имеет один и тот же «ID», поэтому каждая плитка травы на экране превращается в грязь. Как я могу лучше генерировать эти тайлы? Я хочу, чтобы он генерировался случайным образом, а не рисовался из карты массива, например 000001100.

Заблокировать класс

public class Block {

public enum BlockType {
    Dirt,
    Grass,
    Selection
}

BlockType Type;
Vector2f Position;
Image texture;
boolean breakable;

public Block(BlockType Type, Vector2f Position, Image texture, boolean breakable) {
    this.Type = Type;
    this.Position = Position;
    this.texture = texture;
    this.breakable = breakable;
}

    public BlockType getType() { 
        return Type; 
    }
    public void setType(BlockType value) {
        Type = value;
    }

    public Vector2f getPosition() { 
        return Position; 
    }
    public void setPosition(Vector2f value) { 
        Position = value; 
    }

    public Image gettexture() { 
        return texture; 
    }
    public void settexture(Image value) { 
        texture = value; 
    }

    public boolean getbreakable() { 
        return breakable; 
    }
    public void setbreakable(boolean value) { 
        breakable = value; 
    }
}

Класс генерации фрагментов

public class TileGen {

Block block;
public Block[] tiles = new Block[2];
public int width, height;
public int[][] index;
boolean selected;
int mouseX, mouseY;
int tileX, tileY;

Image dirt, grass, selection;
SpriteSheet tileSheet;

public void init() throws SlickException {
    tileSheet = new SpriteSheet("assets/tiles/tileSheet.png", 64, 64);

    grass = tileSheet.getSprite(0,0);
    dirt = tileSheet.getSprite(1,0);
    selection = tileSheet.getSprite(2,0);

    tiles[0] = new Block(BlockType.Grass, new Vector2f(tileX,tileY), grass, true);
    tiles[1] = new Block(BlockType.Dirt, new Vector2f(tileX,tileY), dirt, true);

    width = 50;
    height = 50;

    index = new int[width][height];

    Random rand = new Random();
    for (int x = 0; x < width; x++)
    {
        for (int y = 0; y < height; y++)
        {
            index[x][y] = rand.nextInt(2);
        }
    }
}

public void update(GameContainer gc) {
    Input input = gc.getInput();
    mouseX = input.getMouseX();
    mouseY = input.getMouseY();
    tileX = mouseX / width;
    tileY = mouseY / height;

    if(input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) {
        selected = true;
    }
    else{
        selected = false;
    }
    System.out.println(tiles[index[tileX][tileY]]);
}

public void render() {
    for (int x = 0; x < width; x++)
    {
        for (int y = 0; y < height; y++)
        {
            tiles[index[x][y]].texture.draw(x * 64, y *64);

            if(IsMouseInsideTile(x, y))
                selection.draw(x * 64, y * 64);
            if(selected && tiles[index[x][y]].breakable) {
                if(tiles[index[tileX][tileY]].Type == BlockType.Grass)
                    tiles[index[tileX][tileY]].texture = dirt;
            }
        }
    }
}

public boolean IsMouseInsideTile(int x, int y)
{
    return (mouseX >= x * 64 && mouseX <= (x + 1) * 64 &&
            mouseY >= y * 64 && mouseY <= (y + 1) * 64);
}

Я использую библиотеку slick2d. Я не уверен, что ID — правильное слово, но надеюсь, вы понимаете, о чем я пытаюсь спросить.


person Corey    schedule 10.04.2012    source источник


Ответы (1)


Похоже, ваша существующая структура в порядке, но не похоже, что вы понимаете, что она делает. Массив int[][] index содержит сетку типов тайлов, соответствующих координатам x и y. Чтобы изменить тип плитки в определенной координате, все, что вам нужно сделать, это установить массив index на нужный вам тип.

В частности, в вашей функции рендеринга у вас будет что-то вроде:

if(IsMouseInsideTile(x, y) && selected && tiles[index[x][y]].breakable)
    if(tiles[index[tileX][tileY]].Type == BlockType.Grass)
        tiles[index[tileX][tileY]].texture = dirt;

Я бы попытался выяснить, что именно делает ваш код, прежде чем изменять его дальше.

Примечание: почему это в функции рендеринга? Вероятно, вы должны иметь его в своей собственной функции или, по крайней мере, внутри вашей функции update.

person jli    schedule 10.04.2012
comment
О, хорошо, это имеет смысл. Никогда не думал об этом в таком ключе почему-то. Спасибо, я был в полном тупике, и это оказалось простым решением. Я думаю, что у меня было так, потому что раньше я перерисовывал вместо того, чтобы менять текстуру, и я не знал, как именно это сделать. сейчас вставлю в обновление - person Corey; 11.04.2012