2D виявлення зіткнень для гри в пінбол


9

Поки що в попередніх іграх я використовував просте 2D зіткнення з коробками, потім перевіряв на рівні пікселів на предмет зіткнення.

Якщо проводити гру в пінбол майже у багатьох кадрах, м'яч буде контактувати зі стіною чи іншою поверхнею, тож чи є інший підхід?

Відповіді:


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-активи.


... ми говоримо тут про JavaScript та полотно, тож найповільніша операція, можлива в цьому рамках, - це ... малювання та читання пікселів ... особливо на повільних пристроях. Отже 4/5 цієї відповіді просто історія / не має значення. Але раціональність не може конкурувати з картинками.
— ГраАльхімік

1
Карти зіткнень можуть зберігатися в масиві, чому б ви хотіли зберігати їх у якомусь полотні? Як ви сказали, перша частина відповіді здебільшого стосується історії, але якщо вам потрібно реалізувати пінбол на дуже низькому кінцевому процесорі (наприклад: старий gsm), це все ще застосовується. У сучасний час я б скоріше запропонував використовувати такий фізичний двигун, як jbox2d, або зробити фізику самостійно зіткненнями відрізків ліній або кривих Безьє (якщо ви думаєте, що можете написати таке).
— tigrou

Читання пікселів на зображеннях також дуже швидко в сучасних браузерах. Деякі з перших демонстрацій "omg JS швидше, ніж C" - це всі ядра для обробки зображень.
— Шон Міддлічч

Як ви дізналися про карти зіткнення tigrou?
— Бемму

1
Через це переробляється мрія пінболу: pouet.net/prod.php?which=24499 (не я). Подивіться у джерела, карта зіткнень, про які я говорю, є.
— tigrou

1

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

Якщо ви хочете створити хороший пінбол, шлях - це використовувати 3D-виявлення зіткнень або самостійну систему з кожним об'єктом, що стикається, що має метод з параметрами відстані та швидкості, повертаючи змінені швидкості.


Чому ви кажете, що за допомогою 3D-виявлення зіткнень має місце більше 2D?
— Іван

@John Я уявляю собі хороший пінбол як 3D-гру з пандусами і т. Д. Ви можете запрограмувати ці рампи на 2D і набудувати кулю, коли вона перейде через рампу і вниз, коли вона сама відкинеться назад, але в цьому випадку це все-таки 3D грі, ви просто додаєте розмірність Z самостійно.
— Маркус фон Броаді

1

Я зробив гру в пінбол деякий час тому; на основі пікселів. У мене була карта зіткнення, яка щойно містила дані зіткнення. Орієнтовне нормальне зіткнення було легко знайти:

Візьміть карту зіткнення, що перекриває кулю, знайдіть центр, сформуйте вектор від цієї точки до центру кулі, а потім нормалізуйте.

Сподіваюся, що дає кілька ідей :)


1

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


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.