В те времена (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-ресурсы.
Пинболы обладают очень богатым набором физики, не только отверстиями или стенами, но также реагирующими элементами (удар сзади) или неровной поверхностью, где шар замедляется, а затем возвращает скорость.
Если вы хотите создать хороший пинбол, то лучше всего использовать трехмерное обнаружение столкновений или систему с индивидуальной настройкой, где каждый сталкивающийся объект имеет метод с параметрами расстояния и скоростей, возвращающий измененные скорости.
источник
Я сделал игру в пинбол некоторое время назад; это было на основе пикселей, а также. У меня была карта столкновений, которая просто содержала данные о столкновениях. Приблизительную нормаль столкновения было легко найти:
Возьмите карту области столкновения, перекрывающую шар, найдите центр, сформируйте вектор из этой точки к центру шара, затем нормализуйте.
Надеюсь, что это дает вам некоторые идеи :)
источник
Во-первых, если вы сделаете игру в пинбол, вам, скорее всего, понадобится больше обнаружения столкновений с ограничением CIRCLE, чем с ограничением BOX :-)
Учитывая сложность физики, связанной с полноценным пинболом, я бы посоветовал взглянуть на существующий 2D физический движок. Box2D имеет хорошую репутацию в javascript, могут быть и другие, но я не встретил ни одного хорошего (и бесплатного).
Rq1: Вы, конечно, используете (как и я) классический разрыв в игре между обновлением и ничьей. И вы используете таймер (setInterval / setTimeout) и / или RequestAnimationFrame, чтобы вызывать обновление, а затем рисовать, как обычно. Пинбол может быть тем типом игры, в котором вы хотите иметь одно обновление вождения по таймеру, а другое - вождение вничью, чтобы вы могли независимо регулировать скорость каждого из них для работы на широком диапазоне устройств. Потому что вы не можете просто сбросить (update + draw), если устройство работает слишком медленно: если время между двумя обновлениями (dt) становится слишком большим, физический движок может пропустить столкновение.
источник
Вы можете взглянуть на визуальный пинбол против будущего пинбола для 2d против 3d объекта. Если вы играете в визуальный пинбол (все сделано в 2d), то играете в будущий пинбол или что-то вроде Zen Pinball, вы чувствуете разницу в том, как они играют. Я лично предпочитаю 3d, но ваш проект может быть лучше подходит для 2d, только вы сможете решить, что
источник