graphics - Libgdx: how to draw a rounded border around a TiledMap with dynamic dimensions? -


in libgdx have tiledmap fill different cells:

cell.settile(new statictiledmaptile(reg1)); cell.settile(new statictiledmaptile(reg2)); cell.settile(new statictiledmaptile(reg...)); 

where reg texture region.

i render with:

render = new orthogonaltiledmaprenderer(map); render.setview(cam); render.render(); 

throughout game, number of columns, number of rows , size of cells vary, must remain dynamic.

now, around tiledmap, want add rounded border. below showing examples in png of how planning : left right, first top border, top-right corner, right border. each of these png files has square dimensions.

top border top-right corner right border

what want achieve below, here zoom top right corner of tiledmap:

enter image description here

i planning use these pngs textureregions can set cells in tiledmap, that:

    (int x = 0; x < numcol+2; x++) {             (int y = 0; y < numrow+2; y++) {                 cell cell = new cell();                                   if (y==numrow+1) {                     cell.settile(new statictiledmaptile(b_mid_top));                 }                  if (y==0) {                     cell.settile(new statictiledmaptile(b_mid_bottom));                 } etc. 

i having multiple issues dimension of pngs: mentioned, size of cells may vary throughout game. knowledge there no way resize cell or textureregion png need. use image, resize them dynamically, add them actors stage , draw stage, fear might loose benefit of using tiledmap. also, have deal stage coordinates on 1 hand , tiledmap coordinates on other , doesn't sound best approach.

so bit lost! best approach draw border around tiledmap? ready abandon of current ideas better one. not experienced libgdx sorry if have done silly mistake.

i think idea good. in case tilesize changes bordersize changes too. can't create different sized tile frame around it. in case want create same frame, can use simple ninepatch size of map.

create this:

ninepatch p = new ninepatch(texture, 5, 5, 5, 5); // edge sizes 5px here. 

inside of render method draw @ size of tilemap. can optain sizes map object:

p.draw(batch, 0, 0, tilesize*tilecountx, tilesize*tilecounty); 

if not liket idea can go second version. create new tiledmap boarder tiles need copy whole tilemap offset of 1 tile (since need have 1 tile space) , create new tilemap 2 rows , cols more.

should example this:

map = new tiledmap(); // map bordercells maplayers layers = map.getlayers(); (int l = 0; l < map1.getlayers().getcount(); l++) {     // create new layer bigger     tiledmaptilelayer newlayer = new tiledmaptilelayer(             ((tiledmaptilelayer) map1.getlayers().get(0)).getwidth() + 2,             ((tiledmaptilelayer) map1.getlayers().get(0)).getheight() + 2,             (int) ((tiledmaptilelayer) map1.getlayers().get(0))                     .gettilewidth(), (int) ((tiledmaptilelayer) map1                     .getlayers().get(0)).gettileheight());      // add cells here     (int x = 0; x < newlayer.getwidth(); x++) {         (int y = 0; y < newlayer.getheight(); y++) {             //add right tile regions here!             if(x == 0 && y == 0){                 cell cell = new cell();                 cell.settile(new statictiledmaptile(first edge));                 newlayer.setcell(x, y, cell);                 continue;             }              if(x == newlayer.getwidth()-1 && y == 0){                 cell cell = new cell();                 cell.settile(new statictiledmaptile(second edge));                 newlayer.setcell(x, y, cell);                 continue;             }             if(x == 0 && y == newlayer.getheight()-1){                 cell cell = new cell();                 cell.settile(new statictiledmaptile(third edge));                 newlayer.setcell(x, y, cell);                 continue;             }              if(x == newlayer.getwidth()-1 && y == newlayer.getheight()-1){                 cell cell = new cell();                 cell.settile(new statictiledmaptile(fourth edge));                 newlayer.setcell(x, y, cell);                 continue;             }              if(x == 0){                  cell cell = new cell();                 cell.settile(new statictiledmaptile(textureregion bottom here));                 newlayer.setcell(x, y, cell);                 continue;             }              if(y == 0){                 cell cell = new cell();                 cell.settile(new statictiledmaptile(textureregion first col));                 newlayer.setcell(x, y, cell);                 continue;             }              if(x == newlayer.getwidth()-1){                 cell cell = new cell();                 cell.settile(new statictiledmaptile(textureregion toprow));                 newlayer.setcell(x, y, cell);                 continue;             }              if(y == newlayer.getheight()-1){                 cell cell = new cell();                 cell.settile(new statictiledmaptile(textureregion last col));                 newlayer.setcell(x, y, cell);                 continue;             }             //last not least if none of fit add tile old map             //dont forget offsett             newlayer.setcell(x, y, ((tiledmaptilelayer)map1.getlayers().get(l)).getcell(x-1, y-1)); //map1 original map without borders         }     }     layers.add(newlayer); } 

if have different tilesizes add bordertexture every tilesize have in case using tiledmap version. if resize texture take sprite it. sprite offers .setsize(w,h) , extends textureregion. create static tiledmaptile can add sprite texture. so if take idea use sprite , size tile size before create statictiledmaptile.


Comments

Popular posts from this blog

java - WrongTypeOfReturnValue exception thrown when unit testing using mockito -

php - Magento - Deleted Base url key -

android - How to disable Button if EditText is empty ? -