Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Tile Map Collision


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 krrice   Members   -  Reputation: 120

Like
0Likes
Like

Posted 06 January 2013 - 05:22 PM

Hi everyone , I have this collision code and it gets updated at 60FPS. When I run the game it only has collision with the last 2 in the tile map.

i can't seem to figure out what is wrong.Any info will be appriciated.

 

 

Update Code

 

for(int i = 0; i < map.size(); i++)
	{
		for(int j = 0; j < map[i].size(); j++)
		{
			if(map[i][j] == 2)
			{
				
				if(x + 24 > j * 24 && x < (j * 24) + 24 &&
					y + 24 > i * 24 && y < (i * 24) + 24 )
				{
					collided = true;
				}
				else
				{
					collided = false;
				}
			}
		}
	}

Tile Map

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 



Sponsor:

#2 Aeramor   Members   -  Reputation: 1179

Like
1Likes
Like

Posted 06 January 2013 - 08:51 PM

On collision you need to exit the loop. It only works on the last one because it will always run through the entire tree and always overwrite your 'collided' variable with the last "2" that was found.

 

I would give you some advice on how to restructure this but I don't know how you are trying to use it.

 

The simplest fix would be instead of collided = true; to simply do "return true;" remove the else and at the end of the loop do return false;

 

But I would say you need to rewrite this completely since you can obviously index into your array. (you're already doing it) and only test against the tile that you need to know if it had a collision on, instead of running a loop testing all possible points.


-Aeramor

CTO at Conjecture, Inc.


#3 KnolanCross   Members   -  Reputation: 1335

Like
0Likes
Like

Posted 07 January 2013 - 06:09 AM

Just wondering, if you have the x and the y position of the object you want to check collision to, wouldn't it be easier to calculate the index of the x and y position (and the limits of the object) and check the map only at the those points?

 

For instance, if your char is on x = 13, y = 25, and its size is 24, you need to check the coords:

x = 13, y = 25

x = 37, y = 25

x = 13, y = 49

x = 37, y = 49

 

So, you convert those coords to map indexes (say, each tile is 24 x 24):

i = 0, j = 1

i = 1, i = 1

i = 0, j = 2

i = 1, j = 2

 

Finally you check if any of those indexes in the map is a 2. Wouldn't that work?


Currently working on a scene editor for ORX (http://orx-project.org), using kivy (http://kivy.org).


#4 krrice   Members   -  Reputation: 120

Like
0Likes
Like

Posted 07 January 2013 - 04:32 PM

On collision you need to exit the loop. It only works on the last one because it will always run through the entire tree and always overwrite your 'collided' variable with the last "2" that was found.

 

I would give you some advice on how to restructure this but I don't know how you are trying to use it.

 

The simplest fix would be instead of collided = true; to simply do "return true;" remove the else and at the end of the loop do return false;

 

But I would say you need to rewrite this completely since you can obviously index into your array. (you're already doing it) and only test against the tile that you need to know if it had a collision on, instead of running a loop testing all possible points.

 

This is how i am using it for the moment. I have a MapLoader class that sends the Collision map, which is a vector of vectors to the Player class. In the Players Update that is where the for statement is.

I am just using the collided variable for testing right now. In main.cpp I have a text function displaying the collided varible and its value.So when ever I move over the tiles that are twos it will show 1 and if not 0. 

 

Here is Player.cpp

 

#include "Player.h"

Player::Player()
{}

void Player::Destroy()
{
	GameObject::Destroy();
}

void Player::Init(MapLoader *colMap,ALLEGRO_BITMAP *image = NULL)
{
	GameObject::Init(672, 554, 6, 6, 0, 0, 19, 15 );

	SetID(PLAYER);
	SetAlive(true);

	collided = false;

	map = colMap->GetColMap();

	lives = 3;
	score = 0;

	maxFrame = 4;
	curFrame = 0;
	frameDelay = 3;
	frameWidth = 36;
	frameHeight = 72;
	animationColumns = 4;
	animationDirection = 1;

	animationRow = 2;

	if(image != NULL)
		Player::image = image;
}

void Player::Update()
{
	GameObject::Update();

	if(x - boundX < 0)
		x  =  boundX;
	else if(x + boundX > WIDTH)
		x = WIDTH - boundX;

	if(y < 0)
		y = 0;
	else if(y > HEIGHT)
		y = HEIGHT;

	//Collision

	for(int i = 0; i < map.size(); i++)
	{
		for(int j = 0; j < map[i].size(); j++)
		{
			if(map[i][j] == 2)
			{
				if(x + 24 > j * 24 && x < (j * 24) + 24 &&
					y + 24 > i * 24 && y < (i * 24) + 24 )
				{
					collided = true;
				}
				else
					collided = false;
			}
		}
	}

	if(++frameCount >= frameDelay)
	{
		if(curFrame > 4)
			curFrame = 0;

		fx = (curFrame % animationColumns) * frameWidth;
		fy = animationRow * frameHeight;

		frameCount = 0;
	}
}
void Player::Render()
{
	GameObject::Render();

	//al_draw_rectangle(x + boundX,y + boundY,x - boundX,y - boundY,al_map_rgb(0,255,0),5);
	al_draw_bitmap_region(image, fx, fy, frameWidth, frameHeight,
		x - frameWidth / 2, y - frameHeight / 2, 0);
}

void Player::MoveUp()
{
	animationRow = 3;
	curFrame++;
	dirY = -1;
}
void Player::MoveDown()
{
	animationRow = 0;
	curFrame++;
	dirY = 1;
}
void Player::MoveLeft()
{
	animationRow = 1;
	curFrame++;
	dirX = -1;
}
void Player::MoveRight()
{
	animationRow = 2;
	curFrame++;
	dirX = 1;
}

void Player::ResetAnimation(int position)
{
	if(position == 1)
	{
		dirY = 0;
	}
	else
	{
		dirX = 0;
	}
}

void Player::Collided(int objectID)
{
	if(objectID == ENEMY)
		al_draw_rectangle(x + boundX,y + boundY,x - boundX,y - boundY,al_map_rgb(0,255,0),5);
		//lives++;
}


Edited by krrice, 07 January 2013 - 04:37 PM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS