Вільне переміщення в ізометричній грі на основі плитки


9

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

В даний час я імпровізував щось близьке до цього: http://jsfiddle.net/KwW5b/4/ (рух WASD). Ідея руху полягала в тому, щоб використовувати карту миші, щоб виявити, коли гравець перемістився на іншу плитку, а потім перевернути зміщення, і здебільшого він працює правильно (кожен кут змушує гравця рухатися в неправильне місце: див. Http: //www.youtube.com/watch?v=0xr15IaOhrI , що, мабуть, тому, що я не міг змусити повноцінну роботу миші працювати належним чином), але я не маю ілюзій, що це навіть близько до хорошого / розумного рішення. І все одно, це здебільшого просто продемонструвати, яку саме річ я хотів би реалізувати.


Цей код виглядає чудово, в чому саме проблема? Ви досить скромні (хорошим чином) ваш код здається досить хорошим, якої функції у демонстрації не вистачає?
AturSams

Що я мав на увазі під кутовими проблемами, це така поведінка: youtube.com/watch?v=0xr15IaOhrI . Мені не вдалося придумати будь-яке інше рішення, окрім того, як зробити чимало випадків перевірки на предмет проблемних компенсацій, і навіть тоді є деякі особливі випадки, коли плеєр перекочується в неправильне місце. Але, як я вже говорив, мені було цікаво, як зазвичай здійснюється такий рух, оскільки я ще не бачив методу, який я придумав.
xtr486

Відповіді:


10

Перш за все, я пропоную вам змінити напрямки: W - вліво-вліво S - вниз-вправо A - вниз-вліво D - вгорі праворуч

на більш інтуїтивно зрозумілий: W - вгору S - вниз A - вліво D - праворуч

Що стосується вашого занепокоєння, я пропоную вам зробити дві функції, одну переклавши ізометричні координати плитки в координатні сітки, а другу - навпаки. Таким чином, ви можете просто розділити MVC, і це полегшить ваше життя при обчисленні активних плиток: введіть тут опис зображення


1
Ваша відповідь виглядає дійсно багатообіцяючою, але я визнаю, що це дуже багато чого проходить через мою голову. Однак я спробую продовжувати переварювати ваше рішення протягом наступних кількох днів. Це десь близько до того, що ви були після? jsfiddle.net/Sd4ZP/18 У неї є деякі логічні помилки (відключені однією тощо) та такі, але, наскільки я знаю, карти зверху вниз та ізометричні карти мають однаковий рух. Те, чого я навіть не
обійшов,

Це добре виглядає поки що! Я розгляну це ввечері. Річ у тому, щоб застосувати перетворення методу ізометричного нанесення плитки на функцію трансляції positionToUser (), а обернути її методом positionFromUser ().
Маркус фон Броаді

Я бачу проблему: ви малюєте ізометричний вигляд, розміщуючи зображення, а не використовуючи API малювання полотна. Це цілком логічно, оскільки врешті-решт ваша плитка ізо буде набагато більше, ніж суцільний колір. Однак для налагодження слід також провести лінії між плитками, що полегшило б ваше життя. У будь-якому випадку, я роздрібнив ваш код і створив функцію перекладу positionToUser (x, y). Перевірте це, центрируючи чорний квадрат на плитці (тому що в ізо-зорі це завжди в центрі) та переміщуючи мишу по нижньому полотну - перекладена точка буде показана на ізо-полотні: jsfiddle.net/tZTXS/1
Маркус фон Броаді

Дякую! Мені реально вдалося вивести (ну, щось на зразок) щось саме, а саме ізометричне зміщення в функції малювання ізометрії. Зараз це виглядає приблизно так : jsfiddle.net/P2eKF/4 , який, здається, робить саме те, про що я задав в оригінальному запитанні, тому я позначу вашу відповідь. :)
xtr486

Я радий, що ти це зробив! Мені подобається, як комбінації ключів WA, WD, AS, SD вирівнюють рух до ізометричних осей замість кутів 45 градусів. Гарна робота.
Маркус фон Броаді

0

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

1- Почніть з плитки t0 і змістіть 0

2- Коли гравець переходить на плитку t1, встановити зміщення = - (t1 - t0)

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

amount = deltatime * playerSpeed
deltaoff = sqrt(offsetX*offsetX + offsetY*offsetY)
total = min( amount, deltaoff )
offsetX = offsetX - (total * offsetX / deltaoff)
offsetY = offsetY - (total * offsetY / deltaoff)

4- Yo може використовувати зсув == 0 перевірити, щоб знати, коли гравець на плитці.

Завдяки цьому ви отримуєте гравця, який вільно рухається на карті, але прилипає до плиток.

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