Столкновение ответ 2d - PullRequest
2 голосов
/ 29 июля 2011

Проблема: Проблема http://img684.imageshack.us/img684/5486/prob1b.png Проблема http://img810.imageshack.us/img810/3157/prob3.png Зеленый блок - игрок, а серый блок - статический кирпич

При прыжке на плитку игрок отталкивается влево / вправо, когда он стоит возле края сталкивающейся плитки. Это, вероятно, происходит потому, что скорость прыжка вверх больше, чем движение x (которое может даже быть 0), и, таким образом, игрок корректируется по оси x ...

Псевдокод выглядит так:

  • 1: получить сталкивающиеся плитки вокруг игрока
  • 2: плитка столкновения foreach:

{

  • 2a: получить глубину пересечения
  • 2b: правильное местоположение игрока с наименьшей осью коррекции (пример: if (Math.Abs ​​(X)> Math.Abs ​​(Y) Тогда исправьте значение Y. Иначе правильное значение X)

// Ниже приведен другой псевдокод, который не должен быть частью проблемы:

  • 2c: если столкновение с верхней стороной игрока: отменить любые прыжки
  • 2d: если столкновение с нижней стороной игрока: IsStandingOnGround = true;

}

Код:

  foreach (Stone stone in collidingStones)
            {
                #region Collision Response
                if (DrawRect.Intersects(stone.CollisionRect)) // DrawRect is the players collision rectangle
                {
  //warning bug is in this if-statement. causes the player to be adjusted and go trough neighboar tiles and such
                    Vector2 correction = Collision.CalculateMinimumTranslationDistance(DrawRect, stone.CollisionRect);
                    if (Math.Abs(correction.X) > Math.Abs(correction.Y))
                    {
                        Location += new Vector2(correction.X, 0);
                    }
                    else
                    {
                        Location += new Vector2(0, correction.Y);
                    }

1 Ответ

0 голосов
/ 29 июля 2011

Интересный вопрос, я разрабатывал игру в Delphi несколько лет назад и столкнулся с теми же проблемами.Пара баллов:

  • Вы должны исправить X и Y при столкновении.Исправление только X или Y будет выглядеть неестественно с высокими скоростями (более ~ 3px / обновление).
  • Тип обнаружения столкновений, который вы делаете, будет работать с прямоугольными плитками, но если у вас были неправильные плитки (как треугольник для наклонного участка), тогда было бы невозможно вычислить значения коррекции для столкновения.

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

При перемещении игрока вы вычисляете следующую точку на основе скорости игрока, а затем вы проверяете каждую точку вдоль линии между текущей позицией и вычисленной следующей позицией.Если на этой линии вы столкнетесь с препятствием, вы остановите игрока в этой точке.

...