2D обнаружение столкновений для игры в пинбол

9

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

Если вы играете в пинбол практически во многих кадрах, мяч будет соприкасаться со стеной или другой поверхностью, так есть ли другой подход?

Джон
источник

Ответы:

19

В те времена (1990) старые игры в пинбол создавались так:

Для игрового поля есть несколько слоев (что вы видите, играя в игру):

введите описание изображения здесь

и несколько слоев для столкновений:

введите описание изображения здесь введите описание изображения здесь

Левое изображение в градациях серого - карта столкновений для основной игры, правое изображение - карта столкновений для специальной области: рампы для пинбола.

White = свободное место для мяча, индекс цвета 255.

Gray= мяч будет «отталкиваться» от этой зоны. индекс цвета = угол вектора, который нужно добавить в положение шара. светло-серый = 0 град. темно-серый = 360 град.

Какой-то псевдокод:

void do_ball_physics()
{
    while(1)
    {
         byte color = read_pixel_under_ball(ballx, bally); //one pixel read
         if(color == 255) //see remark below
            break;
         float vectorx = sin(color/255.0f * 2.0f * PI);
         float vectory = cos(color/255.0f * 2.0f * PI); 
         ballx += vectorx; //push ball away from one unit
         bally += vectory; //

    }
}

Некоторые специальные цветовые индексы также могут быть использованы для чего - то другого , чем столкновения, диапазон пользовательских цветов (например: 240 - 255) могут быть зарезервированы для обнаружения специальных зон , как spinners, triggers, bumpers, holes, ...

Как видите, это очень просто. На каждый кадр «читается» всего несколько пикселей. Из-за этого вы можете заставить физическое моделирование работать на реальной высокой частоте кадров, например: 200 кадров в секунду. Использование высокой частоты кадров сгладит симуляцию и уменьшит "туннелирование" (это происходит, когда мяч движется слишком быстро и проходит через элементы без столкновения). Эта простота также делает возможным плавные игры в пинбол 386 computers(и даже быстрые 286) в те времена (среди прочих трюков, таких как циклическое изменение цвета, прокрутка VGA и маскировка спрайтов ...).

Сегодня большинство игр с пинболом больше не сделаны такими. Вместо этого игровое поле представляет собой 2d / 3d сцену с использованием полигонов или спрайтов, и возникают столкновения с некоторыми упрощенными линиями, кривыми Безье или сферами, представляющими упрощенную форму визуального игрового поля.

пример (из визуального пинбола ):

введите описание изображения здесь

Некоторые игровые компании используют собственный физический движок, но другой, более простой способ - использовать физический движок, такой как Box2Dили Bullet. Большинство игр для пинбола для iPhone, которые я видел, использовали уже существующий физический движок + некоторые 3D-ресурсы.

tigrou
источник
... мы говорим здесь о javascript и canvas, поэтому самая медленная операция в этой среде - это ... рисование и чтение пикселей ... особенно на самых медленных устройствах. Таким образом, 4/5 этого ответа просто история / не имеет значения. Но рациональность не может конкурировать с картинами.
GameAlchemist
1
Карты столкновений могут храниться в массиве, зачем вам их хранить на каком-то холсте? Как вы сказали, первая часть ответа в основном для истории, но если вам нужно реализовать пинбол на очень низком процессоре (например, старый gsm), это все еще применимо. В наше время я бы предпочел использовать физический движок, такой как jbox2d, или делать физику самостоятельно, сталкиваясь с отрезками или кривыми Безье (если вы думаете, что способны написать такую ​​вещь).
Tigrou
Чтение пикселей на изображениях также очень быстро в современных браузерах. Некоторые из первых примеров «omg JS быстрее C» были ядрами обработки изображений.
Шон Мидлдич
Как вы узнали о столкновениях карт Tigrou?
Бемму
1
Из-за этого римейка мечты о пинболе: pouet.net/prod.php?which=24499 (не мной). Посмотрите в источниках, есть карта столкновений, о которой я говорю.
Tigrou
1

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

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

Маркус фон Броади
источник
Почему вы говорите, что обнаружение столкновений в 3D имеет смысл в сравнении с 2D?
Джон
@ Джон Я представляю хороший пинбол как 3D-игру с пандусами и т. Д. Вы можете запрограммировать эти пандусы в 2D и масштабировать шар вверх, когда он пересекает рампу, и вниз, когда он падает обратно, но в этом случае это все еще 3D игра, вы просто добавляете Z измерение самостоятельно.
Маркус фон Броади
1

Я сделал игру в пинбол некоторое время назад; это было на основе пикселей, а также. У меня была карта столкновений, которая просто содержала данные о столкновениях. Приблизительную нормаль столкновения было легко найти:

Возьмите карту области столкновения, перекрывающую шар, найдите центр, сформируйте вектор из этой точки к центру шара, затем нормализуйте.

Надеюсь, что это дает вам некоторые идеи :)

wildbunny
источник
1

Во-первых, если вы сделаете игру в пинбол, вам, скорее всего, понадобится больше обнаружения столкновений с ограничением CIRCLE, чем с ограничением BOX :-)
Учитывая сложность физики, связанной с полноценным пинболом, я бы посоветовал взглянуть на существующий 2D физический движок. Box2D имеет хорошую репутацию в javascript, могут быть и другие, но я не встретил ни одного хорошего (и бесплатного).
Rq1: Вы, конечно, используете (как и я) классический разрыв в игре между обновлением и ничьей. И вы используете таймер (setInterval / setTimeout) и / или RequestAnimationFrame, чтобы вызывать обновление, а затем рисовать, как обычно. Пинбол может быть тем типом игры, в котором вы хотите иметь одно обновление вождения по таймеру, а другое - вождение вничью, чтобы вы могли независимо регулировать скорость каждого из них для работы на широком диапазоне устройств. Потому что вы не можете просто сбросить (update + draw), если устройство работает слишком медленно: если время между двумя обновлениями (dt) становится слишком большим, физический движок может пропустить столкновение.

GameAlchemist
источник
0

Вы можете взглянуть на визуальный пинбол против будущего пинбола для 2d против 3d объекта. Если вы играете в визуальный пинбол (все сделано в 2d), то играете в будущий пинбол или что-то вроде Zen Pinball, вы чувствуете разницу в том, как они играют. Я лично предпочитаю 3d, но ваш проект может быть лучше подходит для 2d, только вы сможете решить, что

ProtoJazz
источник