Collision Detection For My Game

Hey guys, so I have a game I am developing which is a 2d sidescroller. I have an arraylist of all elements in the world and they have a location object attatched to each of them.

Each tile is 24 x 24 pixels, the character is 24 x 48 characters.

I have developed an object called “Location” which keeps track of all objects x and y’s.

For instance, I can say player.getLocation().getX() to get where it is on the X axis, same for Y.

I want the player to be able to move left, right, and jump. I have the jumping physics worked out, but collision detection is just being a pain.

Currently, in my Location class I have a class called overlaps(Location otherLoc), so I can say like

if(player.overlaps(elements.get(i).getLocation())

And loop through, brute force checking every single object on the screen and seeing if it overlaps.

My overlaps method is as follows, I beleive it is written wrong but I have written it about 4 times to I am a little fed up with it, maybe you can figure it out.

Note: Datastore.TILE_SIZE = 24.


	public boolean overlaps(Location _toCompare)
	{
		if((((this.getX() >= _toCompare.getX()) &&
			(this.getX() <= (_toCompare.getX() + Datastore.TILE_SIZE)) &&
			(this.getY() <= (_toCompare.getY())) &&  
			(this.getY() >= (_toCompare.getY() + Datastore.TILE_SIZE)))) ||
			
		  (((this.getX() + Datastore.TILE_SIZE) >= (_toCompare.getX()) &&		
		   (this.getX() + Datastore.TILE_SIZE) <= (_toCompare.getX() + Datastore.TILE_SIZE) &&
			this.getY() <= (_toCompare.getY()) &&  
			this.getY() >= (_toCompare.getY() + Datastore.TILE_SIZE))) ||
			
		   ((this.getX() >= _toCompare.getX() &&		
			this.getX() <= (_toCompare.getX() + Datastore.TILE_SIZE) &&
		   (this.getY() + Datastore.TILE_SIZE) >= (_toCompare.getY()) &&  
		   (this.getY() + Datastore.TILE_SIZE) <= (_toCompare.getY() + Datastore.TILE_SIZE))) ||		   
			
		  (((this.getX() + Datastore.TILE_SIZE) >= _toCompare.getX() &&		
		   (this.getX() + Datastore.TILE_SIZE) <= (_toCompare.getX() + Datastore.TILE_SIZE) &&
		   (this.getY() + Datastore.TILE_SIZE) >= (_toCompare.getY()) &&  
		   (this.getY() + Datastore.TILE_SIZE) <= (_toCompare.getY() + Datastore.TILE_SIZE))))
		{
			return true;
		} else {
			return false;
		}
	}
/code]


	public boolean overlaps(Location toCompare)
	{
		if( contains(toCompare) ) // Top left corner
			return true;
		if( contains(toCompare.getMaxX(), toCompare.getY()) ) // Top right corner
			return true;
		if( contains(toCompare.getX(), toCompare.getMaxY()) ) // Bottom left corner
			return true;
		if( contains(toCompare.getMaxX(), toCompare.getMaxY()) ) // Bottom right corner
			return true;
		return false;
	}

	public boolean contains(Location toCompare){
		return contains(toCompare.getX(), toCompare.getY());
	}
	
	public boolean contains(int x, int y){
		return (x >= getX() && x <= getMaxX() &&
				y >= getY() && y <= getMaxY());
	}

The getMaxX is just x + Datastore.TILE_SIZE, same for the y except for the player its y + Datastore.TILE_SIZE * 2.

This code will not work properly if you use blocks that are bigger than the player but I’m guessing that’s not a possibility.

Also, I think “intersects” is a better method name than “overlap” :wink: