Jump to content

Change bounding box of tiles?


iffy
 Share

Recommended Posts

I have a tilemap with several layers (I made it with Tiled).  For some of the tiles, I want the bounding box to enclose only a portion of the tile (e.g. the bottom half).  How do I achieve this?

 

For my sprites I use body.setSize:

  game.physics.arcade.enable(p);  p.body.collideWorldBounds = true;  p.body.setSize(16, 10, 0, 12);

And right now for my map, I have this:

  layer3 = map.createLayer('blocked');  map.setCollisionBetween(1, 1025, true, 'blocked');
Link to comment
Share on other sites

not sure about arcade. i use P2 and this is slightly more complicated if you are optimizing the tiles as it groups connected tiles into 1 body  (eg my platform is a left, middle and end tile but optimizing will just create one single rectangle for the platform)

 

however if you are not optimizing you can do this

 

 (TypeScript)

//tiles are 32x32map.setCollisionBetween(1,300, true, 'Layer2')var tileObjects:Phaser.Physics.P2.Body[] = this.game.physics.p2.convertTilemap(map, this.layer2 ,true,false) // <= optimize=falsetileObjects.forEach(function(tile:Phaser.Physics.P2.Body) {    tile.clearShapes(); // get rid of the original collision     tile.addRectangle(32,16,16,6) // create a new 32x16 physics body (half height of tile) and set relevant offsets to position properly    tile.debug=true;    tile.setCollisionGroup(tileCollisionGroup)    tile.collides(playerCollisionGroup)}, this)

I'll have a look into arcade version but I'm assuming it just uses coordinate checks, so you might be stuck there

post-16536-0-91257500-1446413458.jpg

post-16536-0-02527700-1446413501.jpg

Link to comment
Share on other sites

for arcade it appears you can do this.. however the debug view does not update and i'm not sure changing tile.centerX, tile.centerY makes any difference.. but for platforms you can achieve similar to above it seems

this.layer2 = map.createLayer('Layer2')var tiles = this.layer2.getTiles(0,0,this.map.width*32, this.map.height*32)tiles.forEach(function(tile) {    if(tile.index!=-1)    {         console.log("tile", tile)        tile.height=12 // you could change this based on tile.index    } })this.layer2.debug=true // does not show new collision heights 

I can't guarantee it won't break anything though..

post-16536-0-06741300-1446414984.jpg

Link to comment
Share on other sites

these are all trial and error experiments, but I've also found you can set eg 

tile.worldY = tile.worldY+8 

to shift the collision body down (again doesn't show in debug) without shifting the tile image itself

 

but again beware it might likely break calculations like map.getTileWorldXY.. you'd have to check those sort of things yourself

post-16536-0-77617300-1446415601.jpg

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...