Як я можу виявити, як гравець роздавлений у 2D-платформі?


19

Я перевіряю зіткнення щодо персонажа платформера, як показано на №1. Червоні точки - це пікселі, які перевіряються, а сірі лінії вказують на осі, до яких вони відносяться. Мені подобаються результати, отримані від перевірки зіткнення таким чином (проти, скажімо, обмежувального поля). Все працює саме так, як мені б хотілося, за винятком однієї проблеми: виявлення розчавлення.

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

Просте рішення для виявлення, коли гравця розбито, - це побачити, чи спрацьовують точки зіткнення на протилежних сторонах. Якщо вони є, гравця розчавлюють. У №2 ви можете побачити звичайний сценарій розчавлення. Гравець заземлений, а верхні точки зіткнення перетинаються з падаючим об'єктом. Це запускає розчавлення.

№3, 4 та 5 представляють проблемні сценарії. У №3 гравець рухається до об'єкта, який рухається вгору. Точка зіткнення правою стороною вдаряється об об’єкт, спричиняючи зіткнення та зупиняючи гравця.

Тепер, якщо об’єкт продовжує рухатися вгору, а гравець продовжує рухатись праворуч (як показано на №4), об'єкт очищає точку зіткнення правої сторони гравців, а гравець рухається праворуч. Але тепер, зробивши це, об’єкт перетинає верхню точку зіткнення, викликаючи небажане вертикальне розбиття.

Аналогічний сценарій показаний у №5. Два об'єкта достатньо далеко, щоб знизити точки зіткнення в нижній частині, що дозволяє гравцеві впасти, але ні до того, щоб дозволити очищення бокових точок зіткнення, що спричинило небажане горизонтальне розбиття.

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

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

Щоб усунути деяку плутанину, червоні точки зіткнення були б у спрайті, а сірі лінії використовувались лише для позначення відповідної осі для кожної точки зіткнення. Наприклад, якби спрайт символу був простим зеленим квадратом, точки зору виглядали б приблизно так:

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

Відповіді:


34

Я думаю, вам доведеться враховувати рух коробки . Тобто розчавити лише, якщо коробка рухається до гравця.

Це схоже на інші проблеми платформерів, де важливий рух. Наприклад, для платформ, на які ви можете стрибати через і знизу, не перевіряйте зіткнення, якщо гравець рухається вгору.

Таким чином, блок може розчавити гравця зверху, лише якщо блок рухається вниз; знизу, лише якщо блок рухається вгору; зліва, лише якщо блок рухається праворуч тощо.


13
+1 Врахуйте, що тут діє блок, а не гравець. Тож якщо ви перевіряєте, чи не грає гравець гравець, а не перевіряється, чи гравець роздавлений, проблему слід легше вирішити
Niels

А як бути, коли блоки не рухаються? Я усвідомлюю, що зараз я кладу стрілки на блоки в №5, але це було призначено для двох нерухомих блоків.
IanLarson

Якщо ви вирішили, що стаціонарні блоки не повинні руйнуватися, просто переконайтеся, що плеєр не застряг і не може рухатися з шляху.
congusbongus

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

9

Нехай бали "тесту на розчавлення" знаходяться всередині сірого поля, показаного на вашому зображенні №1 - тобто вбивайте програвача, лише якщо ви виявите потрапляння на один із пікселів.


1
Ви маєте на увазі контрольно-пропускні пункти розбиття "всередині" меж точок зіткнення? Проблема, яку я бачу в цьому, полягає в тому, що роздільна здатність зіткнення відбуватиметься на кожній осі, коли одна з її точок зіткнення буде "спрацьована", перш ніж об'єкт навіть матиме шанс досягти внутрішніх контрольних точок розбиття.
IanLarson

6

Як хтось, хто виріс з платформерами 80-х років, мій перший коментар полягає в тому, що точки контактів повинні знаходитися саме на спрайті, а не де-небудь поза ним. Було мало переживань, які страшніше, ніж смерть, коли зброя / дробарка / ворог явно знаходилася в декількох пікселях від твого персонажа - і такий досвід перешкоджає людям грати.

Зважаючи на це, ідея мати окремі точки для горизонтального та вертикального зіткнення просто не летить. Отже, ваші випадки 3 та 5 не існують.

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

Дробарка, що рухається вгору, додає додаткової складності. Якщо це так швидко, що у гравця немає шансів втекти, тоді добре. Але якщо це буде повільніше, гравець сподівається, що зможе перебігти піднімається платформу та стрибнути з іншого боку. Спрайт гравця піднімається вгору на дробарку, і виявлення тиску відбувається на стелі .


3
Незначна точка - ви не знаєте, як виглядає його спрайт. Наскільки ми знаємо, це може бути саме так, як показано на зображеннях вище, тому випадки 3 та 5 можуть бути цілком дійсними.
Алекс

1
Алекс правий. Я зробив правки, щоб уточнити. Я погоджуюся, що немає нічого гіршого, ніж непостійні коробки зіткнення. Думаю, я розумію вашу думку щодо не використання окремих точок для різних осей. Якби я це зробив, це перетворило б наведений вище приклад з восьми балів до чотирьох, по одному в кожному куті, правильно? Я насправді робив тестування з цим на увазі (з менш бажаними результатами), але я дуже вагаюся з цим, оскільки, якщо кути "відокремлені", досягаю поведінки, яку я шукаю майже ідеально. Це справді єдині проблемні сценарії, на які я зіткнувся.
IanLarson

0

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

Це передбачає, що гравець не в змозі підштовхнути себе "до" ні до об'єктів, ні до землі.


0

Якщо ви можете виявити накладення об'єктів, не чекаючи їх відображення, простий підхід полягає в тому, щоб обробляти рух гравця та інших об'єктів самостійно, один піксель, за допомогою окремої перевірки зіткнення. Якщо гравець рухається вільно і в результаті такого руху зіткнеться з його об'єктом, відключіть його. Якщо в результаті руху об’єкта відбувається зіткнення з об’єктом, перевірте, чи може гравець рухатися в тому ж напрямку, що і цей об’єкт. Якщо так, перемістіть програвач. Якщо ні, то вирішуйте ситуацію "розчавлення" належним чином (пошкодження гравця та вбивство та / або переміщення предмета, що стикається назад, залежно від контакту).

BTW, якщо може стикатися лише обмежена кількість комбінацій фігур, може бути корисним попередньо обчислити растрові карти "виявлення зіткнення", якщо піксель встановлений у першому спрайті при зміщенні (x1, y1) та у другому при зміщенні (x2, y2) секунди піксель при зміщенні (x1-x2, y1-y2) буде встановлений в карті зіткнення. Така попередньо розрахована карта зіткнення дозволить виявити зіткнення між двома спрайтами, перевіривши стан одного пікселя в карті зіткнення.


0

Щоб розчавити гравця, потрібно два об'єкти. Ваша система розпізнавання повинна перевіряти наявність гравця між двома об'єктами, причому простір між ними дорівнює розміру програвача, а відстань зменшується.


0

Я вважаю, що зараз працюю. Він не потребує "зовнішньої" інформації про рух дробарок і вирішує помилкові проблеми. При виявленні помилкового позитиву це трактується як зіткнення (а це саме є):

Ідея така: навіщо перевіряти, чи рухається дробарка, коли насправді хвилює, чи рухається персонаж. Обидва можуть відповісти, якщо розчавлення є хибним позитивом, викликаним власним рухом персонажа або справжнім руйнуванням рухом об'єкта дробарки.

Якщо персонаж переміщується і стискається (зіткнення протилежних сторін для вхідного кадру), тоді ще раз перевірте, чи не розчавлюється останні координати кадру / ітерації:

  1. Якщо це ще раз не підтверджено, це пов'язано з власним рухом персонажа, і персонаж повинен бути повернутий до останніх координат кадру / ітерації так само, як зіткнення

  2. Якщо роздавлення підтверджено вдруге, тоді приступайте до роздавлення.

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