Обнаружение и разрешение столкновений: круг в игровом поле из других кругов и полигонов - PullRequest
0 голосов
/ 30 октября 2018

Я работаю над игрой, в которой спрайт игрока окружен кругом столкновения известного радиуса. Спрайт игрока может перемещаться по игровому полю, которое состоит из других спрайтов с собственными кругами столкновений и другими препятствиями, состоящими из многоугольников. Другие препятствия - это прямоугольники под углом 45 градусов.

Playfield example

Кроме того, я хочу, чтобы игрок настраивал свое движение при столкновении. Я хочу, чтобы игрок пытался «протолкнуть» мимо объекта, а не останавливаться им.

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

Perpendicular tangent example

Однако, если бы он не был совершенно перпендикулярен, игрок сначала медленно, а затем быстрее продвигался по касательной к кругу, пока он не продолжил бы его беспрепятственно.

Edging around a circle example

Это работает аналогично при встрече с одним из 45-градусных прямоугольников.

Edging around a rectangle example

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

Trapped by a circle and a rectangle example

Я могу одновременно выполнять обнаружение и отклонение столкновений для одного типа объекта, но изо всех сил пытаюсь собрать все во всеобъемлющий алгоритм. В настоящее время я работаю над итеративным подходом с парным разрешением, который «пробует» разные местоположения, чтобы получить решение с наилучшим выбором, но я действительно хочу математически аналитическое решение. Я надеюсь, что у меня будет что-то похожее на то, что появляется в этом псевдокоде.

x = [player's x location]
y = [player's y location]
r = [player's collision radius]

// Array of other sprites on the playfield,
spr = [other sprites array]
// which contains 3 parameters, x, y, r.  E.g., spr[3].x or spr[3].r,
// for the x position or collision radius for the fourth sprite in the
// array.

// Array of 45 degree rectangles on the playfield,
rect = [array of rectangles]
// which contain 4 parameters, x1, y1, x2, y2, the two opposite points
// of the rectangle.  E.g., rect[0].x1, for the x position of the first
// point of the first rectangle.

// For simplicity, assume the above variables are all directly accessable
// in the function below.

// requestX and requestY is the position to which the player would
// like to move the player sprite.
definefunction collisionAdjustor(requestX, requestY) {

  // Here I'd like to adjust the requested position if needed because
  // of an intersection with one or more other sprites or rectangles.

  // Finally return the location at which the player will actually be
  // arriving.
  return destinationX, destinationY
}

Буду очень признателен за любые советы или предложения.

- Richard

...