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.