GameMaker: восемь советов для начинающих
Только начали изучать GameMaker? Вот восемь советов для уверенности, что вы делаете всё правильно.
Пользуйтесь официальной документацией
Прежде чем гуглить или спрашивать кого-то о проблеме, обязательно проверьте документацию - она может содержать информацию, которая может помочь решить проблему. Звучит банально, но это действительно работает!
Не используйте чужой код без его понимания
Ещё один стандартный, и относящийся не только к GameMaker'у совет, но новички действительно им пренебрегают.
Когда вы бездумно берёте и копируете-вставляете чужой код (или код из документации) в свой проект, то на самом деле вы только усугубляете проблему. Вы не можете полностью контролировать свою работу, если не понимаете, как работает та или иная часть кода.
То же относится к учебникам и видео урокам по созданию игр - стоит их воспринимать исключительно как руководство, с помощью которого вы должны сами понять как всё работает. В противном случае, вы столкнётесь с трудностями, когда вам понадобится этот самый код расширять или модифицировать.
Разные значения переменных для разных экземпляров объектов
Скажем, вы хотите иметь двух врагов: одного с 4 HP и другого с 10. Казалось решение простое - создадим новый объект и изменим нужную переменную на нужное значение. Придержите коней.
Когда вы размещаете экземпляр объекта внутри комнаты, то можно щёлкнуть по нему правой кнопкой мыши (в GMS2 дважды щелкните по объекту) , открыть окно Creation Code и ввести нужный код. Таким образом вы можете назначать разные HP различным экземплярам, внутри их кода создания.
Здесь вы можете изменять масштаб, поворот, а также установить уникальный ID, чтобы получить доступ к этому конкретному экземпляру с помощью кода.
Используйте place_meeting()
Функция place_meeting() используется для проверки столкновения с другим объектом. Предпочтительней использовать именно эту функцию, чем событие столкновения (Collision Event), так как у вас будет больше контроля над коллизиями.
// проверяем, находится ли игрок на расстоянии 5 пикселей от стены с правой стороны wall_on_right_side = false; if (place_meeting (x + 5, y, obj_solid)) { wall_on_right_side = true; }
Простой способ управления передвижением
Большинство начинающих используют условия If-Else для управления движением:
var hsp; if (keyboard_check (vk_right)) hsp = 1; else if (keyboard_check (vk_left)) hsp = -1; else hsp = 0;
Однако есть более простой способ:
var hsp = keyboard_check(vk_right) - keyboard_check(vk_left);
keyboard_check () возвращает true (равное в GM единице), если указанная клавиша нажата, и false ( равное нулю), если нет. Таким образом:
// если нажата стрелка вправо, то hsp становится 1 var hsp = 1 - 0; // если стрелка влево, то hsp равен -1 var hsp = 0 - 1; // и если ничего не нажимается, оно становится 0 var hsp = 0 - 0;
Используйте Draw GUI для интерфейса
Интерфейс часто рисуют через событие Draw - добавляя относительные координаты, чтобы он следовал за камерой/видом. Но есть более простое решение - событие Draw GUI .
Внутри этого события не нужно добавлять положения камеры - оно использует координаты игрового окна вместо координат комнаты. Так что, если рисовать что-то в позиции (0,0), оно всегда будет выводиться в левом верхнем углу игрового окна, без влияния положения камеры. Это можно представить как ещё один слой поверх основной игры.
Работа функций Create
Эти функции используются для создания чего-либо (сурфейса, буфера, структуры данных и т.д.), и занесения в переменную:
surface = surface_create(args); list = ds_list_create(); buff = buffer_create(args);
Давайте возьмем ds_list в качестве примера. Функция его создаст и сохранит в переменной, верно?
А что если создать ds_list в локальной переменной - он исчезнет в конце события, потому что переменная является локальной. Правильно?
var list = ds_list_create ();
На самом деле это не так. Всякий раз, когда вы создаете ds_list, он заносится в память. А переменная "list", является просто указателем, который позволяет вам получить доступ к фактическому списку в памяти.
Таким образом, даже если переменная является локальной, список таковым не является. Помните, что переменная является просто указателем.
Чтобы уничтожить список окончательно (удалить его из памяти), используйте:
ds_list_destroy (list)
Очищайте сурфейсы
Когда вы создаете сурфейс, он не всегда может создаться пустым.
Когда вы удаляете сурфейс, он освобождает память, но не очищает её. Таким образом, если вы создадите сурфейс, и он создастся в том же блоке памяти, где когда-то существовал ранее удалённый сурфейс, его содержимое перенесётся.
Чтобы этого избежать всегда очищайте сурфейсы:
//create surf = surface_create(32, 32); //clear surface_set_target(surf); draw_clear_alpha(0, 0); surface_reset_target();
Статья является переводом. Ссылка на оригинал
Смотрите также:
Комментарии
Всегда было интересно, как реализованы в GMS механизмы управления и в т.ч. GUI для других платформ?
Например, как получать инпуты из свича или телефона? Как рисуется стик, если это телефон?
Jusper, так наверное точно также как и на юнити, каждый реализует свой стик ну или подключается при необходимости из стандартной библиотеки. Но я не шарю, нам нужен гуру гейм мейкера. Надо как то его присумонить 😁
Но я не шарю, нам нужен гуру гейм мейкера. Надо как то его присумонить
Мы уже все обкашляли.
У юнити есть либы. А гамак это делает через костыли :)
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]