12. Первая 3Д игра. Часть 2 – устранение багов
…Надоело играть… слишком сырая получилась… хотелось бы её переделать. Вот и давайте её доработаем…
Первым, что бросается в глаза – во-первых, (во всяком случае на более медленных машинах это заметно) это то, что когда мы прикасаемся к цилиндру, он меняет своё положение, причём 2 раза, во-вторых очки тоже прибавляются на 2, хотя мы белым по синему написали “Score=Score+1” то бишь на 1, а не на 2, ну, и кроме того в общем скорость тоже увеличивается в 2 раза быстрее чем надо… Когда я это заметил (а заметил я это сразу), моё подсознание сразу так выдала мне способ решения этой баги (интуиция, блин, хорошая вещь J), затем через некоторое время сознание дало подробное объяснение, почему это происходит, ну, а память, блин, посчитала эту информацию ненужной и не запомнила J… короче не помню я почему, но решается это всего одной единственной строкой:
Что вы уже эту команду знаете? И она уже у нас стоит? Правильно, а вы добавьте ещё одну! Да не рядом с предыдущей! Добавьте её в условие соприкосновения шара и Типа Цилиндра после установки цилиндра на новое место… кому здесь не понятно? Объясняю подробнее, кто не хочет осмысливать мою предыдущую фразу: поставьте эту команду после строчки PositionEntity Target,Rnd(-40,40),0,Rnd(-40,40) … Как где она? В программе! J!
Почему так происходит? Вспоминать не охота, попробуйте догадаться сами, помню только, что это связано с коллизион детекшном и, кажется после первого UpdateWorld как бы коллизия остаётся, хотя цилиндр перемещается, поэтому надо ставить ещё один… муть какая-то… не помню, в общем и всё тут J… (программист называется J)
Вторая бага:
Вы наверное уже заметили, что иногда, когда вы запускаете игру, она сразу выходит? Вот здесь всё наоборот: объяснение простое, а попариться придётся дольше! Так вот, если вы ещё не поняли, в таких случаях получается так, что кубик создаётся слишком близко к шарику, так что шарик уже «влезает» в него при своём создании, дольше срабатывает условие… и игра выходит… так что нам нужно будет сделать так, что бы кубики не создавались слишком близко к центру…
Сделать это можно в начале… Алгоритм таков: когда кубики случайным образом расставляются по местам, нужно проверять их положение, и, если они будут находиться на расстоянии меньше чем 3 от центра, задавать их положение заново… т.е. циклом с условием.
Так нам просто строчку в цикле создания кубиков:
Нужно заменить на:
Так, новые слова: Abs(число) – это не команда, а функция. Она возвращает нам модуль числа в скобках (т.е. если в скобках было –4, то она возвращает 4, если 5 – то число так и остаётся положительным: 5).
Эти строчки расшифровываются так: Сначала в случайное место ставится кубик, затем идёт проверка, если X координата или Z координата меньше 4 по модулю (т.е. в диапазоне от –4 до 4), то цикл повторяется (так пока кубик не встанет в нужное место J)… короче, получается такой квадрат размером 4*4 вокруг центра, в который кубики уже никогда не попадут… (можно кстати сделать ограничение не квадратом, а кругом – заменив на Until Sqr(Abs(EntityX(Walls(i)))^2 + Abs(EntityZ(Walls(i)))^2)>10 , по обычной теории Пифагора, но это ни к чему…)
Третья бага:
Особенно некрасиво смотрится, когда цилиндр оказывается внутри какого-либо кубика, и его невозможно достать… сейчас мы с ней справимся.
Опять же исправлять это надо в тот момент, когда цилиндр куда-то ставится случайным образом… Алгоритм будет примерно такой же как в прошлый раз – т.е. в цикле с условием, только на этот раз предметом проверки будет пересечение цилиндра с кубиками…
Так, строчку в главном цикле:
…нам нужно заменить, вот только каким образом это лучше сделать? В прошлый раз у нас было 29 квадратов, и на каждый была одна проверка… здесь у нас один цилиндр, только кубиков – 30… поэтому и цилиндр будет проверяться на пересечение 30 раз – таким образом:
Объясняю как это происходит:
Для начала новая команда – MeshesIntersect(объект1,объект2) возвращает True, если объект1 пересекается с объектом2… так как здесь применяется метод проверки полигон к полигону, она довольно медленная, (зато точная J) но для нашей игры как раз…
Дальше – как идёт цикл…
Сначала мы задаём переменной inter значение False, затем ставим в случайное место цилиндр, и затем идёт цикл из 29 проверок, и если цилиндр пересекается хотя бы с одним из кубиков, значение переменной inter становится равным True. Ну и дальше проверяем – если inter так и осталась False идём дальше, если нет – возвращаемся и проводим все операции заново…
Ну, вот вроде все самые бросающиеся в глаза баги убрали – теперь это довольно играбельный движок J… А вот всё что у нас есть на данный момент:
| Оглавление:
0. Введение 5. 2Д в 3Д 7. Родительская зависимость или Привязки 9. Коллизион Детекшн или как устроен мир… 10. Первая 3Д игра. Часть 0 – основы движка 11. Первая 3Д игра. Часть 1 – разработка движка 12. Первая 3Д игра. Часть 2 – устранение багов 13. Первая 3Д игра. Часть 3 – внешний вид 14. Первая 3Д игра. Часть 4 – от массива к спискам 15. Первая 3Д игра. Часть 5 – оптимизация кода 16. Первая 3Д игра. Часть 6 – завершение 17. Выведение
|