Inaccurate collision taking place..?

Started by
7 comments, last by leiavoia 19 years ago
Hello all, Been working on this Air Hockey game for quite a while now and as a relative newbie, i'm still not sure what's wrong with the following code. But it's basically a check to see if the puck has intersected (collided) with the paddle and performs an appropriate collision and bounce backwards. But it doesn't seem to be exactly the most accurate collision! To see what i mean, download the executable here: http://homepage.eircom.net/~basquilletj/AirHockey.rar (1.2 MB) Any comments on where exactly the accuracy suffers? Any others comments on the game welcome! Many thanks. Squiller EDIT: Can't seem to run the executable without the RawMouse componant so i've updated the link to the actual project in a RAR file.
[source lang=c#]
private int Min(float A, float B)
		{
			if(A < B)
			{
				int newA = Convert.ToInt32(A + 0.5);
				return newA;
			}
			else
			{
				int newB = Convert.ToInt32(B + 0.5);
				return newB;
			}
		}

		private float Distance2D(float X, float Y)
		{
			X = Math.Abs(X);
			Y = Math.Abs(Y);
			int Distance = Min(X, Y);
			return (X + Y - (Distance >> 1) - (Distance >> 2) + (Distance >> 4));
		}
	
		private void Player1Collision(float paddleForceP1)
		{
			float p1NormalX = puck_x - paddle1_x;
			float p1NormalY = puck_y - paddle1_y;

			float p1Distance = Distance2D(p1NormalX, p1NormalY);
			if(p1Distance <= 2.0f * (paddleWidth / 2))
			{
				p1NormalX /= p1Distance;
				p1NormalY /= p1Distance;

				x_vel = (p1NormalX - -p1NormalY) * paddleForceP1;
				y_vel = (p1NormalY - p1NormalX) * paddleForceP1;
			}   
		}

		private void CheckPlayer1HitPuck()
		{
			if(rgnPaddle1.IsVisible(puckRect))
			{
				player1PuckHit = true;
			}
			
			if(player1PuckHit == true)
			{
				Player1Collision(10);
			}

			player1PuckHit = false;
		}


Advertisement
It seems to me that the problem is that you're only using one step per frame. Try subdividing the timestep and making more tests per frame, perhaps 30 or so, maybe that will help.
--m_nPostCount++
Quote:Original post by DirectXFreak
It seems to me that the problem is that you're only using one step per frame. Try subdividing the timestep and making more tests per frame, perhaps 30 or so, maybe that will help.

Thanks for the responsem DirectXFreak.

Not too sure what you mean.. can you clarify it a bit more please?

[Edited by - squiller on March 27, 2005 10:09:23 PM]
He means that your timeslices are too thick. basically, you're not checking for collisions often enough, which can cause weirdness. You can try "subdiving" the time or you can try a swept volume test. For airhockey, i would definately go with swept volume tests because they are as precise as your data types are. Time steps and frame rates are not an issue. Google for "swept spheres" or "swept volumes"
Ah right!

Yeah, i presumed that was why it was inaccurate alright.

Any chance someone has a link to an example with using these Sphere Volumes tests?

Cos all i can find when i google it is an endless numbers of long documents / theories based on it.

I really need to see an example to see it's effect.

Thanks again!
You need to register (for free) for this one, but it has code and diagrams:

http://www.gamasutra.com/features/19991018/Gomez_2.htm

Oliii's code might be of some use. He has examples:

http://www.gamedev.net/community/forums/topic.asp?topic_id=192562
Quote:Original post by leiavoia
You need to register (for free) for this one, but it has code and diagrams:

http://www.gamasutra.com/features/19991018/Gomez_2.htm

Oliii's code might be of some use. He has examples:

http://www.gamedev.net/community/forums/topic.asp?topic_id=192562


Thanks for that.. will register for the first one!

Oliii's seems to be offline.
Have no clue how to do this sweep-test.

C++ seems like such a pain in the a$$ compared to C#!
Well, no one said you couldn't do it in C# !

This topic is closed to new replies.

Advertisement