Я работаю над игрой, в которой спрайт игрока окружен кругом столкновения известного радиуса. Спрайт игрока может перемещаться по игровому полю, которое состоит из других спрайтов с собственными кругами столкновений и другими препятствиями, состоящими из многоугольников. Другие препятствия - это прямоугольники под углом 45 градусов.
Кроме того, я хочу, чтобы игрок настраивал свое движение при столкновении. Я хочу, чтобы игрок пытался «протолкнуть» мимо объекта, а не останавливаться им.
Например, если игрок столкнется с ограничивающим кругом другого спрайта, он будет остановлен, если его вектор будет точно перпендикулярен касательной к пересечению двух окружностей.
Однако, если бы он не был совершенно перпендикулярен, игрок сначала медленно, а затем быстрее продвигался по касательной к кругу, пока он не продолжил бы его беспрепятственно.
Это работает аналогично при встрече с одним из 45-градусных прямоугольников.
Мне нужна помощь в следующем: Я пытаюсь найти аналитическое решение, чтобы обнаружить как другие спрайты, так и препятствия, отрегулировать движение игрока и, возможно, остановить, когда он настроен на расклинивание между двумя или более объектами.
Я могу одновременно выполнять обнаружение и отклонение столкновений для одного типа объекта, но изо всех сил пытаюсь собрать все во всеобъемлющий алгоритм. В настоящее время я работаю над итеративным подходом с парным разрешением, который «пробует» разные местоположения, чтобы получить решение с наилучшим выбором, но я действительно хочу математически аналитическое решение. Я надеюсь, что у меня будет что-то похожее на то, что появляется в этом псевдокоде.
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