Рабочая программа «Разработка компьютерных игр на движке Godot Engine» Знакомство с Godot Engine и Проект «Pong»
7. Создание мяча
В этом разделе будет много спойлеров, в которых будут спрятаны скриншоты, попробуйте выполнять задачи, а после проверять себя раскрывая спойлеры с подсказкой. Этот объект будет иметь наибольшие количество кода по сравнению с другими игровыми элементами, но с точки зрение узлов мяч будет схож с игроком и противником. Будет взят узел кинематического тела, спрайта и формы столкновения, и тут вы заметите закономерность создание большинство вещей в Godot. Что же начнем. Создайте новую сцену, кликнув на плюсик выше видового экрана, после выберете другой узел в дереве сцен, найдите узел «KinematicBody2D», переименуйте его в «Ball». К этому узлу привяжите спрайт «Sprite», потом узел столкновений форм «CollisionShape2D». И вот что у вас должно получиться
Далее выберете узел «Sprite», и добавьте в текстуру «Texture» из файловой системы из папки «Assets» картинку «Ball.png»
В форме столкновения «CollisionShape2D», в опции «Shape» выберем на этот раз другую форму, форму окружности «CircleShape2D». У этой форме имеется только одна красная точка, которая отвечает за радиус окружности, настройте окружность чтобы она покрывала форму спрайта мячика, изменяя размер перетаскивая красную точку формы. Далее сохраните сцену в папке «Ball» (которую вы создадите). Сцену назовите так как она изначально подписывалась, сцена «Ball.tscn». Перейдем к нашей основной сцене, сцене уровня и привяжем нашу сцену к уровню. После того как добавили сцену с мячом на сцену уровня, возьмите мяч и перетащите его к середине экрана. Теперь если мы запустим проект, то увидим все нужные игровые элементы игры для «Pong». Теперь наша задача заставить двигаться мяч, это не самая легкая задача. Перейдите к сцене мяча. Выберете узел «Ball» и прикрепите к нему скрипт. Не перепутайте, вы должны находиться не на сцене уровня, а на сцене мяча, когда будете прикреплять новый скрипт к объекту «Ball». И да на один узел два скрипта не прикрепить. Далее Годот вам предложит места куда сохранить и как назвать скрипт, соглашаемся со всем что он предложит и прикрепляем скрипт. Стираем все лишнее со скрипта кроме первой строчки. Объявим переменную скорости и зададим примерное значение на 600 единиц. И еще одна очень важная вещь, но прежде чем я расскажу про неё давайте откроем другой скрипт. Скрипт игрока, который расположен по пути корневая папка/Player. Раскройте папку «Player», в файловой системе, и как видите там храниться наш скрипт «Player.gd» и наша сцена «Player.tscn» игрока. Дважды щелкните на скрипт «Player.gd», чтобы открыть скрипт. С левой стороны от редактора скрипта есть список открытых скриптов или справок, по которым мы можем быстро перемещаться. Кликая на них мы будем открывать ту или иную информацию (скрипт или справку). Подсвеченная область подсказывает какой открыт файл У нас есть два скрипта, скрипт мяча и скрипт игрока, у каждого скрипта есть переменная скорость «speed», но эти переменные будут видны только лишь внутри своих скриптов, так как их область применения ограничена файлом в котором они записаны. Это значит, что скорость игрока не будет влиять на скорость мяча. Таким образом на каждый объект может быть своя похожая переменная, как и на других объектах. Скрипте с мячом создадим переменную направление как у игрока. Объявите переменную на 4 строчки. Теперь поговорим о размещение переменной направлении «velocity». Когда мы размещаем переменную здесь, мы словно задаем начальное направление, пуская хоть сейчас она и не дает направления. Но в будущем мы будем запускать мяч в определенном направлении. А теперь перейдите скрипту игрока. Здесь переменная направления «velocity» размещена в функции _physics_process которая постоянно делает обновление игрового кадра. Здесь мы тоже устанавливаем нулевое направление, но мы делаем это каждый шаг. Когда мы нажимаем вверх или вниз наше направление меняется, и ракетка двигается в нужном направлении, но если бы не было обнуление направления, то скорость ракетки бы росла постоянно. Потому мы каждый кадр обнуляем скорость и после заставляем двигаться с постоянной скоростью лишь на мгновения, но так как программа считывается очень быстро мы этого не замечаем, мы видим, как ракетка плавно двигается. Вернитесь к скрипту мяча, теперь наша задача задать случайное направление мяча. Мы воспользуемся встроенной функцией «_ready». Когда Годот считывает какой-либо скрипт то сперва он ищет скрипт «_ready». Это функция запускается первой, а после передает на постоянный поток функциям «_proccess» или «_physics_process». Функция «_ready» подходить для инициализации данных, которые должны быть запущена лишь единожды. Но прежде чем я посвящу в дальнейшим случайности мяча запишите такую строчку. Давайте разбирать. Первое переменная направления «velocity» мы берем координаты Х, которые отвечают за ось Х (по горизонтали), здесь мы будем направлять наш мяч. Далее мы присваиваем массив. Что такое массив? Массив - это контейнеры, способные хранить более одного элемента одновременно. В частности, они представляют собой упорядоченный набор элементов. Словно вы объединили переменные в одном месте и у них есть порядок, числовое значение (которое называют индексацией). Как и в переменной в массиве можно хранить разные значения, будь то строка или числовые значения или даже объекты. А индексация, числовой порядок начинается с 0 и по нарастающей. К пример в массиве «arr» значение «а» будет иметь 0 индексацию, а значение «b» номер 1 (индекс 1). А в массиве «arr2» значение 30 будет иметь 2 номер индексации. К примеру, если мы захотим получить значений из массива мы должны вести сам массив и в квадратных скобках указать индекс значения. Вытаскивая значение из массива мы должны присвоить какому-то объекту. И так указывая такую конструкцию Мы можем тут же вызывать нужное значение по индексу. Теперь разберем что твориться в этой конструкции Функция «randi» генерирует псевдослучайное 32-битное целое число без знака в диапазоне от 0 до 4294967295 (включительно). Далее знак процента называется оператором по модулю «%», который возвращает остаток после деления левого операнда на правый операнд. Получается мы делим случайное число на 2, но в значение идет остаток Пример случайных чисел: 85 692 / 2 = 42 846 (без остатка) значит остаток 0 7 778 945 / 2 = 3 889 472,5 здесь есть остаток и это 0,5, но так как речь идет о целых числах, то любая дробная часть выше нуля будет считаться за единицу. При простом деление целых чисел (если у вас не значение сплывающей точкой) остаток будет игнорироваться. Иными словам конструкция [randi() % 2] – будет давать случайные числа от 0 до 1, а они в свою очередь будут индексировать массив и давать значения либо -1 либо 1. Другими словами, мы будем направлять наш мяч либо влево, либо вправо, случайным образом. Если вы не поняли, что происходит в этой конструкции просто перечитайте все выше заданное, используйте команду print для выведение значений в консоль что находится внизу в середине. Экспериментируйте! И теперь зададим случайности и по оси Y, создайте похожую конструкцию. Только на этот раз мы немного наклоним наш мяч в сторону, не будем задавать 1 и изменим на 0.8, тем самым мы наклоним наш мяч. Так что мяч полетит либо вверх, либо вниз, но немного под наклоном, при чем горизонтальная скорость будет выше. В функции «_ready» мы лишь направили наш мяч куда лететь, но теперь надо поместить и сам метод скольжения и столкновения в обновляющийся процесс. Добавьте эту строчку. Не забудьте поместить переменную направление в метод. Сохраните сцену и запустите игру. И как мы можем видеть наш мяч двигается, но очень медленно. Если вспомнили как это исправить, то попробуйте решить эту задачку. А если нет, заглядывайте под спойлер. Запустите игру и мяч бодренько будет двигаться по игровому полю. Выключите игру. Потом запустите еще раз игру, а потом еще раз и еще раз. И вы заметите что мяч начинает свой путь только в одном направление при запуски игры. В моем случаи он постоянно летит сюда. И как бы это не казалось странно, но как говорила одна старая черепаха Функция randi создает случайное число, но это случайное число всегда будет одинаковой при запуски игры. Да если использовать несколько раз функцию randi он будет постоянно выдавать случайные числа, пока вы не перезапустите игру. И при следующим запуске будет выдавать тот же набор случайных чисел что и в предыдущем запуске. И запустив еще раз игру вы будете вечно получать случайные одинаковые числа (одинаковые в пределах разных сессиях запуски игры). Таково природа рандома, компьютер не сможет создать самостоятельно по истине случайное число, ему надо как-то помощь. У любого рандома есть семя, и он работает благодаря ему, выдает случайные числа по алгоритму. Но если привязывать данные которые компьютер будет получать из вне, к примеру, в семя можно помещать дату, и рандом будет действительно разный, но он тоже будет повторяться в течение какого-то время, пока дата не измениться. И вот для таких случаях используется функция «randomize()». Подобная функция настраивает начальное значение на основе времени. Поместите эту функцию в «_ready». И теперь можете запускать игру и мяч действительно будет запускаться в случайном направлении.
Да наш мяч… не отскакивает от стены, думаю вы это заметили. Отскоком мяча мы займемся в следующем раздели.
| |
| |
Просмотров: 48 | |
Всего комментариев: 0 | |
| |