2016-09-28 34 views
0

我正在尝试为游戏绘制基于图块的地板。绘制正方形,附加到相邻的方块libgdx

基本上每个瓷砖都有一个高度值,我试图让每个短号以平滑的方式连接到相邻的瓷砖。所以,如果瓦片高度为2,并且瓦片旁边的瓦片高度为3,那么它们将顺利地连接到斜坡上。

这里是我得到这个截至目前代码:

--see下面的更新的代码 -

瓷砖的高度由Tile.getCenter()获得; 我不知道从哪里去,我正在使用libGDX。

px和py只是加载点的中心,floor是楼层的LibGDX模型批次,希望最终包含每个楼层时间。

在此先感谢!

-Bc

- 编辑 -

只是一点点更多的信息,顶点类基本上只是存储两个整数。

tl,tr,bl,br,让瓦片知道左上角高度,右上角高度(等)。 - 我改名一切是一个更加清楚一点

此类只是为了找到我需要的,基本上每个角落呈现,一旦我有我可以找出如何呈现它在我自己的角度。

关于tl,tr等的说明,我应该找到角落吗?或双方的中心?我以前从未做过3d gfx。

- 编辑3--

我的工作多一点自己出去了,希望这是更接近:

private Map<Vertex, Tile> tiles = new HashMap<Vertex, Tile>(); 
public float getMode(float[] data) 
{ 
    int total = 0; 
    for (int i = 1; i < data.length; i++){ 
     total += data[i]; 
    } 
return total/data.length; 
} 
protected void loadTiles(int px, int py){ 
    //load tile from file 
    int FIXTHISTOSIZE = 10; 
    for (int x = px - (FIXTHISTOSIZE/2); x <= FIXTHISTOSIZE; x++){ 
     for (int y = (py - FIXTHISTOSIZE/2); y <= FIXTHISTOSIZE; y++){ 
      int aY = py - y; 
      int aX = px - x; 
      Tile tile = new Tile(aX, aY); 
      tiles.put(new Vertex(aX, aY) , tile); 
     } 
    } 
    for (int x = px - (FIXTHISTOSIZE/2); x <= FIXTHISTOSIZE; x++){ 
     for (int y = py - (FIXTHISTOSIZE/2); y <= FIXTHISTOSIZE; y++){ 
      int aY = py + y; 
      int aX = px + x; 
      Vertex pos = new Vertex(aX, aY); 

      float TOP_LEFT = -65536, TOP_RIGHT = -65536, BOTTOM_LEFT = -65536, BOTTOM_RIGHT = -65536; //TODO these should be 0, they are this number to demonstrate unloaded tiles for now 
      Tile TILE_CENTER = tiles.get(pos); 
      Tile TILE_TOP_RIGHT = tiles.get(new Vertex(aX + 1, aY + 1)); 
      Tile TILE_TOP = tiles.get(new Vertex(aX, aY + 1)); 
      Tile TILE_RIGHT = tiles.get(new Vertex(aX + 1, aY)); 
      Tile TILE_BOTTOM_RIGHT = tiles.get(new Vertex(aX + 1, aY - 1)); 
      Tile TILE_BOTTOM = tiles.get(new Vertex(aX, aY - 1)); 
      Tile TILE_BOTTOM_LEFT = tiles.get(new Vertex(aX - 1, aY - 1)); 
      Tile TILE_LEFT = tiles.get(new Vertex(aX - 1, aY)); 
      Tile TILE_TOP_LEFT = tiles.get(new Vertex(aX - 1, aY + 1)); 
      //TOP_RIGHT 
      if (TILE_TOP != null && TILE_TOP_RIGHT != null && TILE_RIGHT != null){ 
       float[] dub = {TILE_TOP.getCenter(), TILE_TOP_RIGHT.getCenter(),TILE_RIGHT.getCenter(),TILE_CENTER.getCenter()}; 
       TOP_RIGHT = getMode(dub); 
      } 
      //TOP_LEFT 
      if (TILE_TOP != null && TILE_TOP_LEFT != null && TILE_LEFT != null){ 
       float[] dub = {TILE_TOP.getCenter(), TILE_TOP_LEFT.getCenter(),TILE_LEFT.getCenter(),TILE_CENTER.getCenter()}; 
       TOP_LEFT = getMode(dub); 
      } 
      //TODO BOTTOM_RIGHT 
      //TODO BOTTOM_LEFT 
      TILE_CENTER.setConditions(TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT); 
     } 
    } 
+0

按照身高,你的意思是在Z方向,走向屏幕? Minicraft的源代码可能是一个简单的例子。 http://ludumdare.com/compo/ludum-dare-22/comment-page-1/?行动=预览&uid = 398 – Tenfour04

+0

@ Tenfour04不完全,认为更像是在runescape瓷砖的基础。我可能会误认为你的例子有用,但我设计的游戏是3d,而不是2D。 – Bc1151

回答

0

FINALLY想通了!

初始化:

int FIXTHISTOSIZE = 10; 
    for (int x = px - (FIXTHISTOSIZE/2); x <= FIXTHISTOSIZE; x++){ 
     for (int y = py -(FIXTHISTOSIZE/2); y <= FIXTHISTOSIZE; y++){ 
      int aY = py + y; 
      int aX = px + x; 
      Tile tile = new Tile(aX, aY); 
      tiles.put("" + aX + "." + aY, tile); 
     } 
    } 
    this.loadTiles(px, py); 

主回路(loadTiles):

int FIXTHISTOSIZE = 10; 
    for (int x = px - (FIXTHISTOSIZE/2); x <= FIXTHISTOSIZE; x++){ 
     for (int y = py - (FIXTHISTOSIZE/2); y <= FIXTHISTOSIZE; y++){ 
      int aY = py + y; 
      int aX = px + x; 

      float TOP_LEFT = 0, TOP_RIGHT = 0, BOTTOM_LEFT = 0, BOTTOM_RIGHT = 0; 
      Tile TILE_CENTER = tiles.get("" + aX + "." + aY); 
      if (TILE_CENTER.isLoaded()) { 
       continue; 
      } 
      Tile TILE_TOP_RIGHT  = tiles.get("" + (aX + 1) + "." + (aY + 1)); 
      Tile TILE_TOP   = tiles.get("" + aX  + "." + (aY + 1)); 
      Tile TILE_RIGHT   = tiles.get("" + (aX + 1) + "." + aY); 
      Tile TILE_BOTTOM_RIGHT = tiles.get("" + (aX + 1) + "." + (aY - 1)); 
      Tile TILE_BOTTOM   = tiles.get("" + aX  + "." + (aY - 1)); 
      Tile TILE_BOTTOM_LEFT = tiles.get("" + (aX - 1) + "." + (aY - 1)); 
      Tile TILE_LEFT   = tiles.get("" + (aX - 1) + "." + aY); 
      Tile TILE_TOP_LEFT  = tiles.get("" + (aX - 1) + "." + (aY + 1)); 
      //TOP_RIGHT 
      if (TILE_TOP != null && TILE_TOP_RIGHT != null && TILE_RIGHT != null){ 
       float[] dub = {TILE_TOP.getCenter(), TILE_TOP_RIGHT.getCenter(),TILE_RIGHT.getCenter(),TILE_CENTER.getCenter()}; 
       TOP_RIGHT = getMedian(dub); 
      } 
      //TOP_LEFT 
      if (TILE_TOP != null && TILE_TOP_LEFT != null && TILE_LEFT != null){ 
       float[] dub = {TILE_TOP.getCenter(), TILE_TOP_LEFT.getCenter(),TILE_LEFT.getCenter(),TILE_CENTER.getCenter()}; 
       TOP_LEFT = getMedian(dub); 
      } 
      //BOTTOM_LEFT 
      if (TILE_BOTTOM != null && TILE_BOTTOM_LEFT != null && TILE_LEFT != null){ 
       float[] dub = {TILE_BOTTOM.getCenter(), TILE_BOTTOM_LEFT.getCenter(),TILE_LEFT.getCenter(),TILE_CENTER.getCenter()}; 
       BOTTOM_LEFT = getMedian(dub); 
      } 
      //BOTTOM_RIGHT 
      if (TILE_BOTTOM != null && TILE_BOTTOM_RIGHT != null && TILE_RIGHT != null){ 
       float[] dub = {TILE_BOTTOM.getCenter(), TILE_BOTTOM_RIGHT.getCenter(),TILE_RIGHT.getCenter(),TILE_CENTER.getCenter()}; 
       BOTTOM_RIGHT = getMedian(dub); 
      } 

      TILE_CENTER.setConditions(TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT); 

位数:

public static float getMedian(float[] data) { 
    float[] copy = Arrays.copyOf(data, data.length); 
    Arrays.sort(copy); 
    return (copy.length % 2 != 0) ? copy[copy.length/2] : (copy[copy.length/2] + copy[(copy.length/2) - 1])/2; 
} 

希望这将有助于人在未来

结果:

http://i.imgur.com/X66vDxT.png