Обнаружение столкновения проблема подпрыгивая c # - PullRequest
0 голосов
/ 14 января 2011

Итак, у меня работает обнаружение столкновений, но по какой-то причине игрок, кажется, входит в первый кадр, затем выпрыгивает из него в следующем кадре, а затем падает, как и положено.

Код, который я использую для обнаружения столкновений

        void DoCollisions()
    {
        onGround = false;
        Position.Y += Velocity.Y;
        Vector2 tileCollision = GetTileCollision();
        if (tileCollision.X != -1 || tileCollision.Y != -1)
        {
            onGround = true;
            Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
                new Rectangle(
                    tileCollision.X * World.tileEngine.TileWidth,
                    tileCollision.Y * World.tileEngine.TileHeight,
                    World.tileEngine.TileWidth,
                    World.tileEngine.TileHeight
                )
            );
            Position.Y -= Velocity.Y;
            Velocity.Y = 0;
            Position.Y += collisionDepth.Y;

        }

        Position.X += Velocity.X;
        tileCollision = GetTileCollision();
        if (tileCollision.X != -1 || tileCollision.Y != -1)
        {
            Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
                new Rectangle(
                    tileCollision.X * World.tileEngine.TileWidth,
                    tileCollision.Y * World.tileEngine.TileHeight,
                    World.tileEngine.TileWidth,
                    World.tileEngine.TileHeight
                )
            );
            Position.X -= Velocity.X;
            Velocity.X = 0;
            Position.X += collisionDepth.X;

        }
    }

    Vector2 GetTileCollision()
    {
        int topLeftTileX = (int)(CollisionRectangle.TopLeft.X / World.tileEngine.TileWidth);
        int topLeftTileY = (int)(CollisionRectangle.TopLeft.Y / World.tileEngine.TileHeight);
        int BottomRightTileX = (int)(CollisionRectangle.DownRight.X / World.tileEngine.TileWidth);
        int BottomRightTileY = (int)(CollisionRectangle.DownRight.Y / World.tileEngine.TileHeight);

        for (int i = topLeftTileX; i <= BottomRightTileX; i++)
        {
            for (int j = topLeftTileY; j <= BottomRightTileY; j++)
            {
                if (World.tileEngine.TileIsSolid(i, j))
                {
                    return new Vector2(i,j);
                }
            }
        }

        return new Vector2(-1,-1);
    }

1 Ответ

2 голосов
/ 14 января 2011

Используя только направление Y в качестве примера, на первый взгляд кажется, что вы настраиваете Y дважды, один раз перед проверкой столкновения, затем, когда вы получаете столкновение, вы возвращаете Y и толкаете объект на collisionDepth

Вы, вероятно, не должны возвращать Y, если collisionDepth.Y указывает, что вы пересекаете землю, вы должны просто оттолкнуть ваш объект обратно на величину глубины, которая бы выровняла вас с землей.

        if (tileCollision.X != -1 || tileCollision.Y != -1)
        {
            onGround = true;
            Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
                new Rectangle(
                    tileCollision.X * World.tileEngine.TileWidth,
                    tileCollision.Y * World.tileEngine.TileHeight,
                    World.tileEngine.TileWidth,
                    World.tileEngine.TileHeight
                )
            );
            Velocity.Y = 0;
            // Depending on your coordinate system this should
            // be either + or - collisionDepth.Y
            Position.Y += collisionDepth.Y;
        }
...