2012-04-10 68 views
0

我試圖做鼠標採摘和瓷磚我點擊變化,無論是相反的瓷磚即是。草地上的污垢,但每塊草地磚都有相同的「ID」,因此屏幕上的每塊草坪都會變髒。我怎樣才能更好地生成這些瓷磚?我希望它是隨機生成的,而不是從像000001100.爪哇 - 如何給陣列產生一個獨特的「ID」

Block類

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是否合適,但我希望你能理解我想問的問題。

回答

1

它看起來像你現有的結構很好,但它看起來並不像你明白它的作用。 int[][] index數組擁有一個瓦片類型的網格,對應於xy座標。要在特定座標處更改圖塊類型,您只需將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; 

我會嘗試找出到底是什麼你的代碼被進一步修改之前做的事情。

注意:爲什麼在渲染函數中呢?你應該有自己的功能,或者至少在你的功能裏面。

+0

哦,好吧,這是非常有意義的。從來沒有這樣想過。謝謝,我完全被難住了,它最終只是一個簡單的修復。我認爲我是這麼想的,因爲在重繪它之前我沒有改變紋理,而是對如何完全做到這一點感到困惑。我現在將把它放在更新中 – Corey 2012-04-10 23:26:14