2012-04-10 2 views
0

Ich versuche, die Maus auszuwählen und die Kachel, auf die ich klicke, ändert sich, was auch immer die gegenüberliegende Kachel ist. Gras zu Erde, aber jede Grasfliese hat die gleiche "ID", so dass jede Grasfliese auf dem Bildschirm zu Dreck wird. Wie kann ich diese Fliesen besser herstellen? Ich will es zufällig generiert und nicht aus einem Array Karte wie 000001100.Java - Wie man jeder Kachel, die aus einem Array generiert wird, eine eindeutige "ID" gibt

Block-Klasse

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; 
    } 
} 

Tile-Generation Klasse

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); 
} 

ich gezogen werden verwende Slick2d Bibliothek. Ich bin mir nicht sicher, ob ID das richtige Wort ist, aber ich hoffe, Sie können verstehen, was ich zu fragen versuche.

Antwort

1

Es sieht so aus, als ob Ihre bestehende Struktur in Ordnung ist, aber es sieht nicht so aus, als ob Sie verstehen, was es tut. Das Array int[][] index enthält ein Gitter mit Kacheln, die den Koordinaten x und y entsprechen. Um den Kacheltyp an einer bestimmten Koordinate zu ändern, müssen Sie nur das Array index auf den gewünschten Typ setzen.

Insbesondere in Ihrer Funktion machen, würden Sie so etwas wie haben:

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

Ich würde versuchen, genau herauszufinden, was der Code, den Sie haben, bevor Sie tut es weiter zu modifizieren.

Hinweis: Warum ist das in der Render-Funktion sowieso? Sie sollten es wahrscheinlich in seiner eigenen Funktion oder zumindest in Ihrer update Funktion haben.

+0

Ohh okay, das macht vollkommen Sinn. Dachte nie so darüber nach. Danke, ich war völlig ratlos und es endete mit einer einfachen Lösung. Ich denke, ich hatte es so, denn bevor ich es neu zeichnete, anstatt die Textur zu ändern, war ich verwirrt darüber, wie ich es genau machen sollte. Ich werde es jetzt in das Update bringen – Corey