Advertisement

Collision Overlay or Object->Object Collision?

Started by July 07, 2014 01:49 PM
-1 comments, last by Cataract 10 years, 7 months ago

I just started making a Game with Java and i got stuck at the collision.

Because i want to make a strategie game and not a platformer i thought about creating a collisionlayer, which is nothing else than a 2D int-array representing the information if there's something "occupying" the point x,y.

So everytime an object gets successfully moved i erase its collisioninfo at the old point and write it at the new point.

The Obstracle-class has a rectangle-shaped collision and the Moveable-class has a circular-shaped collision.


	final double  COL_SCALE = 1.0;
	
	public void calculateCollision(int newx , int newy ,Widget w){
		double x = newx / COL_SCALE;
		double y = newy / COL_SCALE;
		double cord_x = w.cord_x / COL_SCALE;
		double cord_y = w.cord_y / COL_SCALE;
		
		if (w instanceof Obstracle){
			Obstracle o = (Obstracle) w;
			double col_x = o.col_x / COL_SCALE;
			double col_y = o.col_y / COL_SCALE;
			
			double cos = Math.cos(Math.toRadians(o.angle));
			double sin = Math.sin(Math.toRadians(o.angle));
			
			for (int i = 0 ; i <= col_x; i++){
				for (int k = 0 ; k <= col_y; k++){
					double temp_i = i*cos - k*sin;
					double temp_k = i*sin + k*cos;
					collision_layer[(int) (cord_x+temp_i)][(int) (cord_y+temp_k )] -= o.col_height;
					collision_layer[(int) (cord_x+temp_k)][(int) (cord_y-temp_i )] -= o.col_height;
					collision_layer[(int) (cord_x-temp_k)][(int) (cord_y+temp_i )] -= o.col_height;
					collision_layer[(int) (cord_x-temp_i)][(int) (cord_y-temp_k )] -= o.col_height;
				}
			}
			
			for (int i = 0 ; i <= col_x; i++){
				for (int k = 0 ; k <= col_y; k++){
					double temp_i = i*cos - k*sin;
					double temp_k = i*sin + k*cos;
					
					collision_layer[(int) (x+temp_i)][(int) (y+temp_k )] += o.col_height;
					collision_layer[(int) (x+temp_k)][(int) (y-temp_i )] += o.col_height;
					collision_layer[(int) (x-temp_k)][(int) (y+temp_i )] += o.col_height;
					collision_layer[(int) (x-temp_i)][(int) (y-temp_k )] += o.col_height;
				}
			}				
		}
		
		
		
		if (w instanceof Moveable){		
			Moveable m = (Moveable) w;
			double col = m.col / COL_SCALE;	
			
			for (int i = 0 ; i<=col; i++){
				for (int k = 0 ; k <= col; k++){
					if( Math.pow(i, 2) +  Math.pow(k, 2) <= col*col){
						collision_layer[(int) (cord_x+i)][(int) (cord_y+k)] -= m.col_height;
						collision_layer[(int) (cord_x+i)][(int) (cord_y-k)] -= m.col_height;
						collision_layer[(int) (cord_x-i)][(int) (cord_y+k)] -= m.col_height;
						collision_layer[(int) (cord_x-i)][(int) (cord_y-k)] -= m.col_height;
					}
				}
			}
			
			for (int i = 0 ; i<=col; i++){
				for (int k = 0 ; k <= col; k++){
					if( Math.pow(i, 2) +  Math.pow(k, 2) <= col*col){
						collision_layer[(int) (x+i)][(int) (y+k)] += m.col_height;
						collision_layer[(int) (x+i)][(int) (y-k)] += m.col_height;
						collision_layer[(int) (x-i)][(int) (y+k)] += m.col_height;
						collision_layer[(int) (x-i)][(int) (y-k)] += m.col_height;
					}
				}
			}
		}
	}

This is working (more or less).
So now i can ask with "collision_layer[(int) (x/COL_SCALE)][(int) (y/COL_SCALE)]" if there's something "occupying" the point.

Now to my problem:

I want a function with which i can "teleport" an object to a point and if this point is "occupied" by something it should find the nearest point where the object can be teleported to (regarding the collisionsize of the object).

Because i can't think of a solution which isn't a lot of calculations with a lot of loops and rounding-errors i have doubts that the whole collisionoverlay idea is a good solution. But how can i write the "teleport" function with "normal" collisionsystems like AABB?

Thanks for your help

Cataract

This topic is closed to new replies.

Advertisement