Collision detection problem in XNA
Posted
by
Fantasy
on Game Development
See other posts from Game Development
or by Fantasy
Published on 2014-08-22T12:19:16Z
Indexed on
2014/08/22
16:37 UTC
Read the original article
Hit count: 162
XNA
I'm having two problems with my collision detection in XNA. There are two boxes, the red box represents a player and the blue box represents a wall.
The first problem is when the player moves to the upper side or bottom side of the wall and collides with it, and then try to go to the left or right, the player will just jump in the opposite direction as seen in the video.
However if I go to the right side or the left side of the wall and try to go up or down the player will smoothly go up or down without jumping.
The second problem is that when I collide with the box and my key is still pressed down the blue box goes half way through red box and and goes back out and it keeps doing that until I stop pressing the keyboard. its not very clear on the video but the keeps going in and out really fast until I stop pressing the key.
Here is a video example:- http://www.youtube.com/watch?v=mKLJsrPviYo
and Here is my code
Vector2 Position;
Rectangle PlayerRectangle, BoxRectangle;
float Speed = 0.25f;
enum Direction { Up, Right, Down, Left };
Direction direction;
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
KeyboardState keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.Up))
{
Position.Y -= (float)(Speed * gameTime.ElapsedGameTime.TotalMilliseconds);
direction = Direction.Up;
}
if (keyboardState.IsKeyDown(Keys.Down))
{
Position.Y += (float)(Speed * gameTime.ElapsedGameTime.TotalMilliseconds);
direction = Direction.Down;
}
if (keyboardState.IsKeyDown(Keys.Right))
{
Position.X += (float)(Speed * gameTime.ElapsedGameTime.TotalMilliseconds);
direction = Direction.Right;
}
if (keyboardState.IsKeyDown(Keys.Left))
{
Position.X -= (float)(Speed * gameTime.ElapsedGameTime.TotalMilliseconds);
direction = Direction.Left;
}
if (PlayerRectangle.Intersects(BoxRectangle))
{
if (direction == Direction.Right)
Position.X = BoxRectangle.Left - PlayerRectangle.Width;
else if (direction == Direction.Left)
Position.X = BoxRectangle.Right;
if (direction == Direction.Down)
Position.Y = BoxRectangle.Top - PlayerRectangle.Height;
else if (direction == Direction.Up)
Position.Y = BoxRectangle.Bottom;
}
PlayerRectangle = new Rectangle((int)Position.X, (int)Position.Y, (int)32, (int)32);
base.Update(gameTime);
}
© Game Development or respective owner