Как сделать стрельбу в game maker

Добавил пользователь Morpheus
Обновлено: 04.10.2024

Управление для персонажа + анимация (game maker)

автор ZiP Чт Сен 16, 2010 8:05 pm

Здесь я опишу как сделать управление персонажем с помощью кода.

И так для начала опишу обьекты:
Для первого метода управления и анимирования персонажа.

plr - основной обьект игрока.
no_animation - основной спарайт игрока(одним файлом).

Для второго метода управления и анимирования персонажа.

plr - основной обьект игрока.
s00 - основной спрайт игрока
с s01 по s08 - анимированные спрайты движения игрока.

И так метод первый:
1. Создаем спрайт с анимацией(no_animation) где делаем 9 кадров:
1 кадр 4 стрелки указывающих в 4 напрвления
2 кадр рисуем стрелку указывающую направление вверх
3 кадр стрелка вниз
4 кадр вправо
5 кадр влево
6 кадр стрелки вверх и вправо
7 кадр вверх и влево
8 кадр вниз и влево
9 кадр вниз и вправо
2. Создаем обьект игрока(plr) задаем ему анимированный спрайт(no_animation)
3. В обьете игрока(plr) создаем событие Step(Шаг) в него добавляем Execute code(Исполняемы код) в нем пишем:
Код: if keyboard_check(vk_up) // Если нажата кнопка Стрелка вверх
y-=5 // Перемещаем обьект на 5 пикселей вверх
image_index=1 // Задаем индекс спрайта
>
if keyboard_check(vk_down) //Если нажата кнопка Стрелка вниз
y+=5 // Перемещаем обьект на 5 пикселей вниз
image_index=2 // Задаем индекс спрайта
>
if keyboard_check(vk_right)
x+=5
image_index=3
>
if keyboard_check(vk_left)
x-=5
image_index=4
>
if keyboard_check(vk_up) and keyboard_check(vk_right)
image_index=5
>
if keyboard_check(vk_left) and keyboard_check(vk_up)
image_index=6
>
if keyboard_check(vk_left) and keyboard_check(vk_down)
image_index=7
>
if keyboard_check(vk_right) and keyboard_check(vk_down)
image_index=8
>
if keyboard_check(vk_nokey) // Если не нажата ни одна кнопка
image_index=0 // Задаем индекс спрайта
image_speed=0 // Задаем скорость изображения
> 4. Теперь создаем комнату, добавляем обьект игрока(plr) в комнату, запускаем и смотрим как сменяется спрайт при нажатии той или иной кнопи.

Метод второй:
1. Создаем 9 спрайтов с анимацией(s00. s08)
s00 - анимация персонажа стоящего на месте
s01 - анимированный спрайт движения вправо
s02 - анимированный спрайт движения влево
s03 - движение вверх
s04 - движение вниз
s05 - движение юго-восток
s06 - движение юго-запад
s07 - движение северо-запад
s08 - движение северо-восток
2. Создаем обьект игрока(plr) задаем ему спрайт s00
3. В обьекте игрока (plr) создаем событие Step(Шаг) в него добавляем действие Execute Code(Исполняемый код) в нем пишем:
Код: if keyboard_check(vk_right) // Если нажата кнопка Стрелка вправо
x+=5 // Перемещаем обьект на 5 пикселей вправо
sprite_index=s01 // Задаем спрайт движения вправо
>
if keyboard_check(vk_left)
x-=5
sprite_index=s02
>
if keyboard_check(vk_up)
y-=5
sprite_index=s03
>
if keyboard_check(vk_down)
y+=5
sprite_index=s04
>
if keyboard_check(vk_down) and keyboard_check(vk_right)
sprite_index=s05
>
if keyboard_check(vk_down) and keyboard_check(vk_left)
sprite_index=s06
>
if keyboard_check(vk_up) and keyboard_check(vk_left)
sprite_index=s07
>
if keyboard_check(vk_up) and keyboard_check(vk_right)
sprite_index=s08
>
if keyboard_check(vk_nokey) // Если не нажата ни одна клавиша
sprite_index=s00 // Задаем спрайт стандартной анимации(игрок в ожидании)
> 4. Создаем комнату, добавляем в неё обьект игрока(plr), запускаем и проверяем.)

Вот пример. Жду комментариев.

Последний раз редактировалось: ZiP (Сб Ноя 20, 2010 11:14 am), всего редактировалось 1 раз(а)

ZiP новичек

Рекомендации, которые покажут, как надо или не надо делать.

Прежде чем гуглить или спрашивать кого-то о проблеме, обязательно проверьте соответствующую секцию в документации — она может содержать информацию, которая может помочь решить вашу проблему.

Иногда, чтобы просто заставить что-то работать, вы копируете код и какого-то руководства, даже не понимая, что он делает. Кажется что всё в порядке, но на самом деле это только усугубляет проблему. Вы не сможете полностью контролировать свой проект, если вы не понимаете, как в нём работает какая-либо часть кода.

Прежде чем копировать код в своей проект, попробуйте хотя бы понять, как он устроен. Прочитайте. Погуглите. Спросите кого-то. Поймите.

Предположим, вам нужно сделать пару врагов: первый с 4 HP и второй с 10 HP. Как новичок, вы подумаете, что нужно создать ещё один объект и изменять HP внутри него. Но этот вопрос можно решить проще.

Через тоже самое окно можно изменить размер и поворот экземпляра, и установить уникальный ID, для того чтобы получить доступ к экземпляру через код.

Функция place_meeting() может использоваться для проверки столкновений между объектами. Лучше использовать эту функцию в условии, чем использовать событие столкновения, так как вы сможете больше контролировать работу столкновений.

Первый и второй аргументы — это X и Y координаты, в которых будет проверятся столкновение. Третий аргумент — это объект, с которым будет проверятся столкновение.

Первый и второй аргументы функции обычно устанавливается X и Y соответственно. Предположим, что игрок находится в комнате, когда выполняется проверка на столкновение. Это полезно, потому что вы можете проверить, будет ли игрок сталкиваться с объектом, проверив его такими аргументами.

Многие новички используют условия для установки переменных ввода. Например

Но есть более простой способ. Вот этот.

Вы знаете что keyboard_check() возвращает true если нажата определённая клавиша, или возвращает false если она не нажата. Но в GameMaker'е true становится — 1, а false — 0, это просто числа. Поэтому их можно использовать в таком уравнении.

Если нажата правая клавиша, то hsp будет равен 1.

Если нажата левая клавиша, то hsp будет равен -1.

И если ни одна клавиша не нажата, то hsp будет равен 0.

Тоже самое можно применить к вертикальному положению.

Для отрисовки HUD некоторые люди используют объекты или отрисовывают их через событие Draw — добавляют их относительные позиции в координаты камеры/вьюпорта.

Внутри события Draw GUI вам не требуется добавлять позиции камеры для того, чтобы HUD следовал за ней. Это событие использует координаты окна игры, вместо координат комнаты. Поэтому, если вы рисуете что-то в (0, 0), то это будет рисоваться в верхнем левом углу игрового окна, а не комнаты. Так что, всё что вы рисуете там, остаётся там: на его позицию не влияет камера в игре. Это как ещё один слой над вашей игрой.

В этом совете я обращусь к тому, что создает путаницу среди начинающих разработчиков.

Я говорю о функциях _create. Это функции, которые для создания чего-либо (поверхности, буфферов, структур данных и так далее) и сохраняет результат в переменную.

Давайте возьмём список структуры данных, как пример. Эта функция создаёт список и хранит его в переменной, верно?

Если я создам список в локальной переменной, он исчезнет в конце события, потому что переменная является локальной. Ведь так?

Даже если переменная является локальной — список не существует. Помните, что переменная — это просто указатель. Чтобы уничтожить список, вам надо использовать.

Кроме того, когда вы делаете так.

Это работает так же по отношению к другим вещам, таким как поверхности, системы частиц и буферы. Переменная — это только указатель на то, что существует внутри памяти, пока оно не будет уничтожено.

Когда вы создаете поверхность, она должна быть пустой, ведь так?

Ну, это не всегда так. Смотрите: когда вы уничтожаете поверхность, она освобождает память, но не очищает её. Если вы создаёте поверхность и она создаётся в том же блоке памяти, где когда-то существовала поверхность, которая была уничтожена, то содержимое уничтоженной поверхности может перенестись в новую.

Поэтому, когда вы создаете поверхность, убедитесь, что вы ее очистили.

При этом с объектами и инстансами можно работать совершенно одинаково, так что первое время можно обращаться к инстансу по имени породившего его объекта, и игра даже будет работать.
А когда инстансов станет несколько - начнутся проблемы. Потому что GMS в такой ситуации под капотом перебирает все инстансы, и выполняет с ними указанную операцию.

Звучит только как минусы. Или у GML есть свои плюсы? Вообще, велосипеды всегда не хорошо, как по мне.

Плюс GML в том, что это чисто игровая логика без лишних букв. Очень чистый, простой, понятный, легкий в освоении скриптовый язык, похожий на псевдокод.

Например, поворот спрайта по курсору мыши в Unity:
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.rotation = Quaternion.LookRotation(Vector3.forward, mousePos - transform.position);

Поворот в GML:
image_angle = point_direction(x, y, mouse_x, mouse_y);

Game Maker божественно простой для своих возможностей. Позволяет сделать абсолютно любую 2D игру.

Существенным минусом для меня стал абсолютно дерьмовый редактор сцены. Он тормозит, он дает очень мало информации, он не позволяет просматривать список объектов на сцене и организовывать их. Для игры, которую я сейчас делаю, мне пришлось делать свой редактор уровней на том же Game Maker.

Не так давно появился Game Maker 2, в котором эти проблемы вроде как полностью пофикшены, но мне тяжело на него переходить с первой версии.

10 советов и трюков GameMaker Studio 2. Часть 1.

Функции создания экземпляров, такие как instance_create_layer и instance_create_depth - одни из самых основных функций, которые разработчики используют в Game Maker. Но не все знают, что они возвращают идентификатор созданного экземпляра, который можно сохранить в переменную для дальнейшего его использования.

Macros и Enums не нуждаются в вызове для инициализации - достаточно скрипта, в котором хранятся ваши макросы и энумераторы, и они будут загружены в ваш проект.

Для экономии времени вы можете щёлкать средней кнопкой мыши на ресурс или функцию в редакторе кода. GMS2 откроет соответствующий объект или, если это функция, то страницу со справкой.

GMS2 поддерживает тернарные операторы, которые предоставляют элегантный подход к условным выражениям: ? :

Вместо использования оператора if вы можете заносить результат выражения сразу в переменную.

Дельта-синхронизация - это количество микросекунд, прошедших с последнего кадра. К примеру, вы можете связать перемещение с delta_time для обеспечения постоянной скорости движения на всех устройствах, независимо от частоты кадров.

Простой пример, как постепенно поворачивать объект к курсору

Вместо использования операторов if для ограничения значения переменной, вы можете использовать Clamp, что гораздо удобней и умещается в одну строку.

Простой способ для мигания спрайта или текста с заданным интервалом:

В меню Preferences -> Objects вы можете создать шаблон, который будет использоваться по умолчанию для всех новых сценариев и событий. Это может сэкономить вам очень много времени.

Как сделать плавное вращение с помощью WASD или клавиш со стрелками? Я видел несколько примеров, но все они используют мышь. Я обязательно хочу использовать WASD или клавиши со стрелками. Я очень надеюсь, что кто-нибудь сможет мне с этим помочь.

Это мой код до сих пор.

2 ответа

Не надейтесь на поворотную функцию GM, лучше рисуйте рамки самостоятельно, поверьте мне.

Это то, что вы ищете?

Изменить: извините, я неправильно прочитал. Похоже, вы после ускорения и замедления скорости поворота. Я бы сделал следующее:

Читайте также: