Per Tile Collision

SGDK only sub forum

Moderator: Stef

Post Reply
orlanrod
Very interested
Posts: 99
Joined: Fri Sep 25, 2015 7:46 pm

Per Tile Collision

Post by orlanrod » Wed Sep 30, 2015 8:36 pm

How do i go about having collision for certain parts of a tilemap? Say the player can't pass in a direction, if a wall tile is there.

Thanks.

djcouchycouch
Very interested
Posts: 710
Joined: Sat Feb 18, 2012 2:44 am

Re: Per Tile Collision

Post by djcouchycouch » Thu Oct 01, 2015 12:05 am

Simplest way is to take the tile map you've used to fill the background plane and check the position of your character against it.

To find the corresponding tile of a pixel XY position, divide the x and y by the width and height of the tile. The tiles are most likely 8x8 so to check an object position like the player against the tile map, do this:

Code: Select all

int tilepositionx = playerx / 8;
int tilepositiony = playery / 8;
That will give you the position of the tile in the tilemap that the player is landing on.

You'll need a way to know if the tile the player lands on is solid or not. You'd need to look at each of the tiles of the tileset and have a table containing their "solidness" property.

Code: Select all

tileset_properties[0] = 0; // this tile the player can walk through
tileset_properties[1] = 1; // this tile is solid and the player can't walk through
tileset_properties[n] = 0; // and so on and so forth
To put those things together.

Code: Select all

int playerx = 10; // x position of the player
int playery = 20; // y position of the player
extern tile tileset[2]; // some tileset stored somewhere. has 2 tiles.
int tileset_properties[2]; // solidness properties of the two tiles

#define TILEMAP_WIDTH 2
#define TILEMAP_HEIGHT 2
int tilemap[TILEMAP_WIDTH * TILEMAP_HEIGHT]; // a 2x2 tilemap

#define TILEPROP_NOTSOLID 0
#define TILEPROP_SOLID 1

int main(void)
{
	tileset_properties[0] = TILEPROP_NOTSOLID; // this tile the player can walk through
	tileset_properties[1] = TILEPROP_SOLID; // this tile is solid and the player can't walk through

	// get the position of the tile that the player is on.
	int tilepositionx = playerx / 8;
	int tilepositiony = playery / 8;

	int tile = tilemap[tilepositionx  + (TILEMAP_WIDTH * tilepositiony)];
	int tileproperty = tileset_properties[tile];

	if (tileproperty == TILEPROP_NOTSOLID)
	{
	  // non-solid tile and can walk through
	}
	else if (tile property == TILEPROP_SOLID)
	{
	   // solid tile and can't move  through
	}
}
That's one way to do it. There are many ways.

orlanrod
Very interested
Posts: 99
Joined: Fri Sep 25, 2015 7:46 pm

Re: Per Tile Collision

Post by orlanrod » Thu Oct 01, 2015 7:14 pm

djcouchycouch wrote:Simplest way is to take the tile map you've used to fill the background plane and check the position of your character against it.

To find the corresponding tile of a pixel XY position, divide the x and y by the width and height of the tile. The tiles are most likely 8x8 so to check an object position like the player against the tile map, do this:

Code: Select all

int tilepositionx = playerx / 8;
int tilepositiony = playery / 8;
That will give you the position of the tile in the tilemap that the player is landing on.

You'll need a way to know if the tile the player lands on is solid or not. You'd need to look at each of the tiles of the tileset and have a table containing their "solidness" property.

Code: Select all

tileset_properties[0] = 0; // this tile the player can walk through
tileset_properties[1] = 1; // this tile is solid and the player can't walk through
tileset_properties[n] = 0; // and so on and so forth
To put those things together.

Code: Select all

int playerx = 10; // x position of the player
int playery = 20; // y position of the player
extern tile tileset[2]; // some tileset stored somewhere. has 2 tiles.
int tileset_properties[2]; // solidness properties of the two tiles

#define TILEMAP_WIDTH 2
#define TILEMAP_HEIGHT 2
int tilemap[TILEMAP_WIDTH * TILEMAP_HEIGHT]; // a 2x2 tilemap

#define TILEPROP_NOTSOLID 0
#define TILEPROP_SOLID 1

int main(void)
{
	tileset_properties[0] = TILEPROP_NOTSOLID; // this tile the player can walk through
	tileset_properties[1] = TILEPROP_SOLID; // this tile is solid and the player can't walk through

	// get the position of the tile that the player is on.
	int tilepositionx = playerx / 8;
	int tilepositiony = playery / 8;

	int tile = tilemap[tilepositionx  + (TILEMAP_WIDTH * tilepositiony)];
	int tileproperty = tileset_properties[tile];

	if (tileproperty == TILEPROP_NOTSOLID)
	{
	  // non-solid tile and can walk through
	}
	else if (tile property == TILEPROP_SOLID)
	{
	   // solid tile and can't move  through
	}
}
That's one way to do it. There are many ways.
Hmm, trying to get this to work with the way i did the tilemap drawing, by using VDP_SetMapEX() to draw part of the map on screen.

Post Reply