First things first. I am using C# with XNA. My game is top-down and the player can shoot bullets. I've managed to get the bullets to ricochet correctly off horizontal walls. Yet, despite using similar methods (e.g. https://stackoverflow.com/questions/3203952/mirroring-an-angle) and reading other answered questions about this subject I have not been able to get the bullets to ricochet off a vertical wall correctly. Any method I've tried has failed and sometimes made ricocheting off a horizontal wall buggy.
Here is the collision code that calls the ricochet method:
//Loop through returned tile rectangles from quad tree to test for wall collision. If a collision occurs perform collision logic.
for (int r = 0; r < returnObjects.Count; r++)
if (Bullets[i].BoundingRectangle.Intersects(returnObjects[r]))
Bullets[i].doCollision(returnObjects[r]);
Now here is the code for the doCollision method.
public void doCollision(Rectangle surface)
{
if (Ricochet) doRicochet(surface);
else Trash = true;
}
Finally, here is the code for the doRicochet method.
public void doRicochet(Rectangle surface)
{
if (Position.X > surface.Left && Position.X < surface.Right)
{
//Mirror the bullet's angle.
Rotation = -1 * Rotation;
//Moves the bullet in the direction of its rotation by given amount.
moveFaceDirection(Sprite.Width * BulletScale.X);
}
else if (Position.Y > surface.Top && Position.Y < surface.Bottom)
{
}
}
Since I am only dealing with vertical and horizontal walls at the moment, the if statements simply determine if the object is colliding from the right or left, or from the top or bottom. If the object's X position is within the boundaries of the tile's X boundaries (left and right sides), it must be colliding from the top, and vice verse. As you can see, the else if statement is empty and is where the correct code needs to go.