заставляя моего игрока спрайт приземлиться поверх моего спрайта платформы - PullRequest
1 голос
/ 08 марта 2011

в моей игре XNA (кстати, я довольно новичок в XNA), я хотел бы, чтобы мой спрайт-земля игрока была на вершине платформы. у меня есть класс спрайта плеера, который унаследован от моего обычного класса спрайта, и обычный класс спрайта для основные неиграбельные спрайты, такие как коробки, фоновые вещи и платформы. Тем не менее, я не уверен, как реализовать способ заставить моего игрока спрайт приземлиться на платформе.

Мой игрок Sprite может прыгать и передвигаться, но я не знаю, где и как проверить, находится ли он поверх моего спрайта платформы.

Мой метод прыжка спрайтов игрока здесь

 private void Jump()
    {

        if (mCurrentState != State.Jumping)
        {

            mCurrentState = State.Jumping;


            mStartingPosition = Position;

            mDirection.Y = MOVE_UP;

            mSpeed = new Vector2(jumpSpeed, jumpSpeed);

        }

    }

mStartingPosition - спрайт игрока, начальная позиция прыжка, а Position - спрайт игрока, текущая позиция. Я думаю, что мой код для проверки, находится ли мой спрайт игрока поверх моего спрайта платформы. Я не уверен, как ссылаться на мой спрайт платформы внутри класса Playersprite и внутри метода jump.

я думаю, что это должно быть что-то вроде этого

   //platformSprite.CollisonBox would be the rectangle around the platform, but im not 
    //sure how to check to see if player.Position is touching any point     
    //on platformSprite.CollisionBox
if(player.Position == platformSprite.CollisionBox)
    {
        player.mDirection = 0;

    }

Опять же, я довольно новичок в программировании и XNA, и некоторые из этой логики я не совсем понимаю, поэтому любая помощь по любому из них будет принята с благодарностью: D

Спасибо

Ответы [ 4 ]

1 голос
/ 08 марта 2011

Я играл с чем-то вроде этого всего несколько дней назад.То, что вы называете CollisionBox, я назвал BoundingBox.BoundingBox - это Rectangle, представляющий область, занимаемую спрайтом.

Возможно, вам будет полезно определить BoundingBox для ваших спрайтов, а не просто использовать их положение.

Выможно легко проверить столкновение прямоугольников с помощью следующего кода:

if (player.BoundingBox.Intersects(platform.BoundingBox)
{
    // handle collision here...
}

Чтобы это работало, убедитесь, что координаты X и Y вашего BoundingBox правильно отражают положение вашего спрайта.

1 голос
/ 08 марта 2011

Если player.Position - это точка, а CollisionBox - прямоугольник, вы можете использовать

if (platformSprite.CollisionBox.Contains (player.Position))
0 голосов
/ 14 марта 2011

Ответ о BoundingBox правильный, но, имхо, проще использовать Rectangle, если вы создаете 2D-игру, а не BoundingBox, предназначенную для 3D-игры.

В любом случае оба объекта имеют методы проверки на пересечение / столкновение, которые принимают Vector2 или Point в качестве параметра.

Теперь у вас должен быть ящик для вашего игрока и ящик для вашей платформы. Если одно сталкивается с другим, вам нужно проверить откуда (игрок может ударить по платформе сверху, снизу, слева, справа или, может быть, вверх и влево в левом верхнем углу).

Если игрок находится на вершине платформы, просто остановите его падение, возможно, установив для его компонента Y-speed значение 0.

Возможно, вам понадобится игрок, чтобы пройти через платформу при прыжке (удар игрока снизу), но не при падении (удар игрока сверху).

0 голосов
/ 09 марта 2011

Возможно, вы захотите взглянуть на стартовый комплект Platformer . Это включает в себя и обнаружение, когда игрок касается врага, сбор драгоценных камней и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...