Search code examples
c#xnacollision

Can't get my collision to work (platformer) XNA


I'm learning XNA right now and i'm pretty new to programming in general. I'm making a platformer now but when I walk into a platform from left or right I get teleported to the top of the platform. The collision is only working with the last platform added to the platform list.

This is in Game class:

LoadContent:

for (int i = 0; i < 3; i++)
        {
            platform0List.Add(new Platform0(new Vector2(70 + (i * 300), 400), platform0Texture));
        }

Update:

protected override void Update(GameTime gameTime)
    {
        keyboard = Keyboard.GetState();

        player.Update(keyboard, keyboardPrev, platform0List);
        foreach (Platform0 platform in platform0List)
        {
            if (!Move_Free(player.position.X, player.position.Y + player.gravity, player.texture.Width, player.texture.Height, platform.rectangle) && player.gravity >= 0)
            {
                player.ground = true;
                if (player.position.Y + player.texture.Height + player.gravity > platform.position.Y)
                {
                    player.position.Y = platform.position.Y - player.texture.Height;
                }
                else if (player.position.Y + player.texture.Height + player.gravity < platform.position.Y)
                {
                    player.gravity = platform.position.Y - player.texture.Height;
                }
                break;
            }
            else
            {
                player.ground = false;
            }
        }

        if (keyboard.IsKeyDown(Keys.Escape)) this.Exit();

        keyboardPrev = keyboard;
        base.Update(gameTime);
    }

This is my Move_Free method

public static bool Move_Free(float x, float y, int width, int height, Rectangle rectangle)
    {
        Rectangle rect = new Rectangle((int)x,(int)y,width,height);
        if(rect.Intersects(rectangle))
        {
            return false;
        }
        else
        {
            return true;
        }
    }

This is in Player class

foreach (Platform0 platform in platform0List)
        {
            if (keyboard.IsKeyDown(Keys.Right) && Game1.Move_Free(position.X + 5, position.Y, texture.Width, texture.Height, platform.rectangle))
            {
                moveRight = true;
            }
            else if (keyboard.IsKeyDown(Keys.Right) && ((position.X + texture.Width - platform.position.X) * -1) > 0)
            {
                position.X += (position.X + texture.Width - platform.position.X) * -1;
            }
            else
            {
                moveRight = false;
            }
            if (keyboard.IsKeyDown(Keys.Left) && Game1.Move_Free(position.X - 5, position.Y, texture.Width, texture.Height, platform.rectangle))
            {
                moveLeft = true;
            }
            else if (keyboard.IsKeyDown(Keys.Left) && position.X - (platform.position.X + platform.texture.Width) > 0)
            {
                position.X -= position.X - (platform.position.X + platform.texture.Width);
            }
            else
            {
                moveLeft = false;
            }
        }
        if (moveRight) position.X += 5;
        if (moveLeft) position.X -= 5;
        if (keyboard.IsKeyDown(Keys.Up) && ground)
        {
            gravity = -10;
            ground = false;
        }
        if(ground)
        {
            gravity = 0;
        }
        else
        {
            gravity += 9.8f / 60f;
            position.Y += gravity;
        }

Solution

  • Each iteration of your forloop overwrites your moveLeft and moveRight variables.
    Therefore, only the last platform values will remain.