Відповіді:
Ще в часи (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-активи.
Пінболи мають дуже багатий набір фізики, не тільки отвори або стіни, але й реагуючі елементи (удари в спину) або нерівну поверхню, де м'яч сповільнюється, а потім отримує швидкість назад.
Якщо ви хочете створити хороший пінбол, шлях - це використовувати 3D-виявлення зіткнень або самостійну систему з кожним об'єктом, що стикається, що має метод з параметрами відстані та швидкості, повертаючи змінені швидкості.
Я зробив гру в пінбол деякий час тому; на основі пікселів. У мене була карта зіткнення, яка щойно містила дані зіткнення. Орієнтовне нормальне зіткнення було легко знайти:
Візьміть карту зіткнення, що перекриває кулю, знайдіть центр, сформуйте вектор від цієї точки до центру кулі, а потім нормалізуйте.
Сподіваюся, що дає кілька ідей :)
По-перше, якщо ви зробите гру в пінбол, вам, швидше за все, знадобиться більше обмежувального виявлення зіткнення CIRCLE, ніж обмежувальний ящик :-)
Враховуючи складність фізики, що бере участь у повноцінному пінболі, я б запропонував поглянути на існуючий 2D фізичний двигун. Box2D має досить репутацію javascript, там можуть бути й інші, але я не зустрічав жодного хорошого (і безкоштовного).
Rq1: Ви, звичайно, використовуєте (як і я) класичний розкол у грі між оновленням та нічиєю. І ви використовуєте таймер (setInterval / setTimeout) та / або RequestAnimationFrame, щоб викликати оновлення, а потім малювати регулярно. Пінбол може бути типом гри, в якій потрібно мати оновлення водіння за таймером, а інше - нічия, щоб ви могли самостійно регулювати швидкість кожного, щоб працювати на широкому діапазоні пристроїв. Тому що ви не можете просто скинути (оновити + намалювати), якщо пристрій занадто повільний: якщо час між двома оновленнями (dt) стане занадто довгим, фізичний двигун може пропустити зіткнення.
Ви можете поглянути на візуальний пінбол проти майбутнього пінболу для теми 2d проти 3d. Якщо ви граєте в візуальний пінбол (все зроблено в 2d), то грайте в майбутній пінбол, або щось на зразок дзен пінболу, ви відчуваєте різницю в тому, як вони грають. Я особисто віддаю перевагу 3d, але ваш проект, можливо, краще підходить для 2d, тільки ви могли б це вирішити