Jump to content
  • Advertisement
Sign in to follow this  
squiller

What exactly does this code do?

This topic is 4945 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello all. Got this code here a couple of weeks back. It's extremely useful code for causing a basic collision between two ellipses in C#. But i'm having trouble understanding it. puck_x = x_position of an ellipse (a puck) puck_y = y_position of an ellipse (a puck) paddleForce = speed you wish to perform the collision at x_vel and y_vel is the x and y velocities of the puck Can anyone explain exactly how it does this from the code?
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 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));
}



[Edited by - squiller on April 1, 2005 8:26:39 PM]

Share this post


Link to post
Share on other sites
Advertisement
Seems perfectly clear to me... At a glance, at least. Just basic C# syntax...
Maybe it would be better if you'd asked a direct question. What line are you having problems with?

Share this post


Link to post
Share on other sites
I'm just not too sure how it works out the and and y velocities of the ellipse by simply recieving the force.

I'm puzzled my most of it but the lines i'm most puzzled by are:


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

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


What is 2.0f? Why are you dividing by p1NormalX by p1Distance? And how does it get the x_vel and y_vel?

And also:


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));
}


What does the Abs function do? Why do we need to check if distance > 1, 2 or 4?

Thanks in advance!

Share this post


Link to post
Share on other sites
Quote:
Original post by squiller
Why do we need to check if distance > 1, 2 or 4?
>> and << are the bit-shift right and bit-shift left operators, not comparision operators. In this case, they're shifting the distance right 1 bit, then right 2 bits, then right 4 bits.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
To answer a few of your questions... In order to get the normal of a vector you must divide each component of the vector by the vector length. If you then calculate the length of the normal it will have the same direction as before but now it will have a length of 1. This is meant to save time calculating things like angles if I remember correctly.

2nd the >> and << operators are bitshifts in this case and not less than and greater than operators like you seemed to imply. It operates like a division by 2 so you could rewrite it like:

(X + Y - (Distance / 2) - (Distance / 4) + (Distance / 16)

and it would likely work the same. I don't really know how it works to be honest, my math is a bit rusty. If I had to guess I'd say it's some type of expansion using calculus to quickly approximate the distance of the points.

And abs almost certainly takes the absolute value of the variable. Hope this helps.

Share this post


Link to post
Share on other sites
Thanks everyone!!

You've made it a whole lot clearer. I'm a complete newbie to game programming, and decided to undertake a 3D Air Hockey game in C#. Probably wasn't the best idea ever but i'm getting there!

Anyways, thanks again - it's much appreciated!

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!