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

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

private void Update()
if(Input.GetButtonDown("Fire1") && Debugger == true)
Shoot();
>
>
void Shoot()
// Shoot logic
Debugger = false;
Transform Rotation = transform.parent.parent.transform;
Rotation.Rotate(0, 0, Random.Range(-3, 3));
GameObject bullet = Instantiate(Bullet, ShootTransform.position, Rotation.localRotation);
bullet.GetComponent().AddForce(transform.right * Speed, ForceMode2D.Impulse);
Destroy(bullet, TimeToNextShoot);
Invoke("DebugFunc", 0.4f);
>
void DebugFunc()
Debugger = true;
>
>

У вас проблема в этой строке:

bullet.GetComponent().AddForce(transform.right * Speed, ForceMode2D.Impulse);

Вы прикладываете к пуле силу по вектору transform.right - где transform - это трансформа персонажа. Так вам естественно придётся поворачивать персонажа, но почему так делаете? Вращайте пулю, и используйте её вектор для приложения силы.

Попробуй задавать угол со случайным числом, можно даже привязать это ко времени нажатия клавиши, что-то вроде: 1 сек разброса нет, 2 сек разброс от 1 до 3 градусов.

Я покажу, как реализовать передвижение, коллизию, прыжки, гравитацию, ускоряющие платформы, платформы для прыжков, смерть от шипов и падения за карту, переход на следующий уровень и порталы.

Перед началом желательно иметь хоть какие-нибудь навыки работы с Game Maker Studio. Рекомендую ознакомиться с интерфейсом программы.

В событии Create объявим следующие переменные:

xDir - направление движения игрока по горизонтали. Переменная будет равна:
-1 — если игрок идет налево;
1 — если игрок идет направо;
0 — если игрок стоит на месте.

stepLength - длина шага игрока в пикселях. Пускай переменная будет равна 10.

dx - сдвиг по горизонтали. Каждое обновление комнаты (по умолчанию — 60 обновлений в секунду) игрок будет сдвигаться на dx пикселей. dx будет вычисляться перемножением xDir и stepLength.

Переменные можно объявить другим способом: в специальном разделе Variable Definitions.

В событии Step напишем следующее:

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

Первая строка вычисляет направление движения. Функция keyboard_check(key) принимает в качестве аргумента клавишу и возвращает true, если она нажата. Функция ord(string) принимает в качестве аргумента строку и преобразует ее в необходимый тип данных для аргумента функции keyboard_check(key). Таким образом, при удержании клавиши "A" переменная xDir становится равной -1, а при удержании клавиши "D" - 1.

Вторая строка вычисляет dx.

Третья строка увеличивает x на dx пикселей, то есть двигает игрока.

Создаем комнату и добавляем на слой Instances экземпляр объекта игрока.

Запускаем и убеждаемся, что все работает как надо.

Здесь никаких переменных и событий создавать не надо: код для взаимодействия с объектом напишем внутри oPlayer в событии Step. Перепишем его так, чтобы событие выглядело следующим образом:

xDir = -keyboard_check(ord("A")) + keyboard_check(ord("D")); dx = xDir * stepLength; if (!place_meeting(x + dx, y, oSolid)) //эта строчка новая x += dx;

place_meeting(x, y, obj) нужна для проверки пересечения прямоугольников коллизии двух объектов. Она принимает три аргумента:
x - позиция первого объекта по оси x;
y - позиция первого объекта по оси y;
obj - имя второго объекта или id его экземпляра.
Функция возвращает true, если объекты пересекаются и false - если нет. Важно то, что проверка осуществляется не в одной лишь точке (x; y), а сразу во всех точках прямоугольника вызывающего объекта. Для проверки коллизии в одной точке имеется функция position_meeting(x, y, obj), но она нам не понадобится. Используя place_meeting(x + dx, y, oSolid), мы проверяем пересечение игрока с твердым объектом, как если бы игрок был сдвинут на dx пикселей. И только убедившись, что пересечения нет, меняем координату игрока.

Теперь нужно создать объект oWall, установить ему родителя oSolid и привязать к нему какой-нибудь спрайт. В моем случае это черный квадрат 64x64. Позже в редакторе комнаты экземпляры этого объекта можно будет растянуть.

Создадим небольшую комнату и расставим там несколько oWall, чтобы проверить работоспособность.

Сегодня мы разберем то, каким образом можно редактировать оружие в игре S.T.A.L.K.E.R. – Тень Чернобыля – от характеристик до описания. Характеристики оружия хранятся здесь:
. S.T.A.L.K.E.Rgamedataconfigweaponsw_[. ].ltx (файл можно открыть в любом TXT – редакторе)

Разбор структуры конфига

Возьмем, для примера, конфиг w_g36.ltx. Он делится на разделы:

1 раздел структуры конфига

Здесь хранится общая информация о оружии – его класс, тип, ссылки на спавн и т.д. Нас интересуют следующие строки:
description = enc_weapons1_wpn-g36 – ссылка на string_id, из которого игра подгружает описание этого оружия.
ef_main_weapon_type = 2 – основной тип, к которому принадлежит оружие
ef_weapon_type = 6 – подтип, к которому принадлежит оружие

2 раздел структуры конфига

Содержит модификаторы, которые даются к углу зрения/дальности обзора NPC, держащего это оружие в руках:
holder_range_modifier = 1.85 – во сколько раз увеличивается eye_range
holder_fov_modifier = 0.3 – во сколько раз увеличивается eye_fov

3 раздел структуры конфига

Содержит данные о самом оружии, его некоторых характеристиках:
cost = 18000 – базовая цена (торговцы умножают её на некоторый коэффициент)
weapon_ >ammo_mag_size = 30 – размер магазина
ammo_ >grenade_ >fire_modes = 1, -1 – режимы ведения огня
hand_dependence = 1 – засивимость о рук (?) – возможно, речь идет о качании ствола
single_handed = 0 – держится ли только в одной руке
slot = 2 – слот в инвентаре
animation_slot = 2 – вид анимации (для пистолета/для винтовки)
inv_name = wpn-g36 – ссылка на имя, отображаемое в инвентаре, тоже берется из string table, как и описание
inv_name_short = wpn-g36 – короткое имя; в данном случае используется то же самое
inv_weight = 3.6 – вес
inv_gr >inv_gr >inv_gr >inv_gr >

4 раздел структуры конфига

Содержит информацию о износе/отдаче оружия. Практически все параметры там снабжены комментариями, поэтому приведу лишь самые интересные:
cam_relax_speed = 5.7 – скорость возврата в исходное положение
cam_dispersion = 0.2 – увеличения угла (в градусах) с каждым выстрелом
fire_dispersion_condition_factor = 5 – увеличение дисперсии в процентах при максимальном износе
misfire_probability = 0.003 – вероятность осечки при максимальном износе
misfire_condition_k = 0.05 – порог (в данном случае – 5%), после которого оружие может заклинивать
condition_shot_dec = 0.0002 – увеличение износа при каждом выстреле

5 раздел структуры конфига Любите Shadow Fight 2?

Здесь хранится множество параметров, из которых наиболее интересны эти:
hit_power = 0.50, 0.54, 0.57, 0.60 – сила выстрела
hit_impulse = 105 – импульс пули (сила, которую летящая пуля передает жертве, влияет на поведение ragdoll-тела)
hit_type = fire_wound – тип причиняемых повреждений, в данном случае – пулевые ранения (параметр в синглплеере ни на что не влияет)
fire_distance = 600 – максимальная дистанция для выстрела
bullet_speed = 925 – начальная скорость пули
hud = wpn_g36_hud – внешний вид оружия

6 раздел структуры конфига

position = -0.026, -0.132, 0.0 – позиция по отношению к игроку (?)
orientation = 0, 0, 0 – направление, в которое смотрит ствол (?)

7 раздел структуры конфига

Содержит описания визуальной стороны оружия и некоторые другие параметры:
startup_ammo = 90 – как нетрудно догадаться, стартовое количество патронов (в синглплеере ни на что не влияет)
visual = weaponsg36wpn_g36.ogf – модель оружия, используемая NPC, а также игроком при виде от третьего лица
ph_mass = 4 – физическая масса, используемая при расчетах
scope_status = 1 – ситуация со съемным прицелом
silencer_status = 0 – ситуация со съемным глушителем
grenade_launcher_status = 0 – ситуация с под ствольным гранатометом
Параметры:
0 – нет, новый прикрепить нельзя
1 – уже есть, несъемный
2 – можно прикрепить

После изменения конфигурации оружия необходимо перезагрузить игру (обязательно)

Heya! I just wanted to ask if you ever have any issues with hackers?

My last blog (wordpress) was hacked and I ended up losing many months of hard work due
to no back up. Do you have any methods to prevent
hackers?

cam_return= 0
cam_relax_speed = 4 ;скорость возврата в исходное положение это скоростьскоторой прицел опуститься на исходное положение выстрела. можно нетрогать короче
cam_relax_speed_ai = 360
cam_dispersion = 0.005;увеличения угла (в градусах) с каждым выстрелом если поставить 0 отдача опять же пропадёт=)
cam_dispersion_inc = 0.25 ;увеличениe cam_dispersion с каждым выстрелом
cam_dispersion_frac = 0.7 ;ствол будет подыматься на cam_dispersion*cam_dispersion_frac +- cam_dispersion*(1-cam_dispersion_frac)
cam_max_angle = 5.0 ;максимальный угол отдачи если хочеш убрать отдачу пиши 0
cam_max_angle_horz = 50.0 ;(degree) maximum shot horizontal degree
cam_step_angle_horz = 0.7;(degree) size of step camera moved in horizontal position while shooting

Вот так немудрёно можно убрать отдачу и придать точность а для того чтобы увеличить дистанцию тебе нужна строчка
fire_distance = 200 чем больше тем лучше
для того чтобы люди улетали строчка:
hit_impulse= 500
Для того чтобы изменить патроны строчка:
ammo_mag_size = 20
Эти строчки отвечают за износ:
misfire_probability = 0.005 ;вероятность осечки при максимальном износе . old – now not working
;изношенность, при которой появляется шанс осечки
misfire_start_condition= 0.00000000000000000006
;изношеность при которой шанс осечки становится константным
misfire_end_condition= 0.00000000001
;шанс осечки при изношености больше чем misfireStartCondition
misfire_start_prob= 0.0000000000004
;шанс осечки при изношености больше чем misfireEndCondition
misfire_end_prob= 0.00000000000057
;увеличение изношености при одиночном выстреле
condition_shot_dec = 0.000000000011
;увеличение изношености при выстреле очередью
condition_queue_shot_dec= 0.000000000013

Скорость пули. мало нужно но всё же
bullet_speed = 1300
Вес:
inv_weight = 1.5
Урон, чем выше число тем лучше. невздумайте ставить больше 3 оружие врагов тоже улучшаеться и тогда вам придёт ПЗДЦ))
hit_power= 1.42 – в голову, 0.92 – в шею, 0.62 – в торс, 0.42 – в ноги

Материал из S.T.A.L.K.E.R. Ins >

Содержание

Общие положения

Сегодня мы разберем то, каким образом можно редактировать оружие в игре – от характеристик до описания. Характеристики оружия хранятся здесь:

Разбор структуры конфига

Возьмем, для примера, конфиг w_g36.ltx. Он делится на разделы:

Первый раздел

Здесь хранится общая информация о оружии, ссылки на спавн и т.д. Нас интересуют следующие строки:

    description = enc1weapons1_wpn_g36 – ссылка на string_ >Второй раздел

Содержит модификаторы, которые даются к углу зрения/дальности обзора NPC, держащего это оружие в руках:

  • holder_range_modifier = 1.85 – во сколько раз увеличивается eye_range ботов. Он производит умножение дальности обзора ботов с данным оружием в руках.
  • holder_fov_modifier = 0.3 – во сколько раз увеличивается eye_fov ботов. При редактировании этого параметра случаются проблемы с обзором нпс – могут не увидеть монстра в упор.

Следующие значения могут находится в другой части файла, но относятся они к обзору.

  • min_radius = 30 – минимальное расстояние с которого боты начинают использовать данное оружие. Для всего оружия кроме снайперских винтовок, гранат и гранатомётов рекомендуется ставить 0. Используется для того, чтобы боты с гранатомётами и снайперками переключались при приближении врага на второе оружие, а также не бросали гранаты себе под ноги.
  • max_radius = 100 – максимальное расстояние на котором боты используют данное оружие. Рекомендуется делать максимально большим каким возможно, учитывая при этом точность оружия. Вы наверно часто сталкивались с ситуациями, когда отстреливаете ботов с дальней дистанции они целятся в Вас, ходят из стороны в сторону, но не стреляют. Данные баги связаны с недостаточным размером данного параметра. Ограничивать данный параметр стоит для пистолетов, дробовиков и огнемёта.

Третий раздел

Содержит данные о самом оружии, его некоторых характеристиках:

  • cost = 2200000 – базовая цена (торговцы умножают её на некоторый коэффициент)
  • weapon_ >Четвертый раздел

В четвертом разделе хранится информация о износе/отдаче оружия. Практически все параметры там снабжены комментариями, поэтому приведу лишь самые интересные:

  • cam_relax_speed = 5.7 – скорость возврата в исходное положение
  • cam_dispersion = 0.2 – увеличения угла (в градусах) при первом выстреле
  • fire_dispersion_condition_factor = 5 – увеличение дисперсии в процентах при максимальном износе. Мало кто понимает, но этот параметр указан не в градусах – это множитель. 5 – это 5000% разброса при максимальном износе. Подобный разброс IRL можно получить только рассверлив ПМ перфоратором. Все стволы в оригинальной игре имеют множитель 5, а начиная с CS маразм разработчиков начал крепчать и многие стволы получили значение 15. В CoP эта тенденция усилилась и ещё больше стволов получили значение 15. Каждый нормальный модер уменьшит это значение. Для пистолетов рекомендуется 3 – 4, автоматов 2 – 2.5, снайперок 1 – 1.5
  • misfire_probability = 0.003 – вероятность осечки при максимальном износе
  • misfire_condition_k = 0.05 – коэффициент. Проще не трогать, т.к. настроить два параметра для каждого ствола в оружейном паке гораздо легче чем три. Может понабиться только для оружия с небольшим настрелом типа ВСС.
  • condition_shot_dec = 0.0002 – увеличение износа при каждом выстреле. Если вписать -1, то оружие полностью отремонтируется после первого выстрела.

Пятый раздел

  • PDM_disp_base = 3.0 – множитель, на который умножается базовая дисперсия оружия, когда ГГ (Главный Герой) стоит на месте в полный рост;
  • PDDM_disp_vel_factor = 1.3 – множитель, на который умножается базовая дисперсия оружия, когда ГГ крутит оружием или бежит;
  • PDM_disp_accel_factor = 1.3 – множитель, на который умножается базовая дисперсия оружия, когда ГГ бежит в спринте;
  • PDM_crouch = 1.0 – множитель, на который умножается базовая дисперсия оружия, когда ГГ идет пригнувшись;
  • PDM_crouch_no_acc = 1.0 – множитель, на который умножается базовая дисперсия оружия, когда ГГ стоит на месте, пригнувшись;
  • hit_power = 0.50, 0.54, 0.57, 0.60 – сила выстрела, зависит от ранга: новичок, опытный, ветеран и мастер соответственно.
  • hit_impulse = 105 – импульс пули (сила, которую летящая пуля передает жертве, влияет на поведение ragdoll-тела. Чем больше поставишь, тем дальше улетит. Если сделать большое отрицательное значение, то жертвы будут прилетать к ГГ)
  • hit_type = fire_wound – тип причиняемых повреждений, в данном случае – пулевые ранения (параметр в синглплеере ни на что не влияет)
  • fire_distance = 600 – максимальная дистанция полета пули, затем она падает на землю и исчезает. Логично прописать значение эффективного огня(пистолеты-пулеметы 50-200м, пистолеты 50м, дробовики 30м и нож полметра), но не имеет смысла устанавливать значение больше радиуса алайфа: ведь за его пределами никого нет.)
  • bullet_speed = 925 – начальная скорость пули
  • rpm = 600 – скорострельность выстрел/минута
  • hud = wpn_g36_hud – внешний вид оружия от 1-ого лица

Шестой раздел

  • = x, y, z
  • position = -0.026, -0.132, 0.0 – позиция оружия на спине по отношению к НПС при виде от 3-его лица
  • orientation = 0, 0, 0 – вращение оружия на спине НПС при виде от 3-его лица

Примечание В ЧНЗП будет выглядеть так:

  • position = -0.026, -0.132, 0.0 – позиция оружия в руках НПС
  • orientation = 0, 0, 0 – вращение оружия в руках НПС
  • strap_position = -0.26,-0.11,0.25 – позиция оружия на спине по отношению к НПС при виде от 3-его лица
  • strap_orientation = -15,-9,110 – вращение оружия на спине НПС при виде от 3-его лица

Седьмой раздел

Содержит описания визуальной стороны оружия и некоторые другие параметры:

  • startup_ammo = 90 – как нетрудно догадаться, стартовое количество патронов (в синглплеере ни на что не влияет)
  • visual = weaponsg36wpn_g36.ogf – модель оружия, используемая NPC, а также игроком при виде от третьего лица
  • ph_mass = 4 – физическая масса, используемая при расчетах
  • scope_status = 2 – ситуация со съемным прицелом
  • silencer_status = 1 – ситуация с несъемным глушителем
  • grenade_launcher_status = 0 – ситуация с отсутствующим подствольным гранатометом
  • Параметры:
  • – нет, новый прикрепить нельзя
  • 1 – уже есть, несъемный
  • 2 – нет, но можно установить
  • zoom_enabled = true – есть ли зум (прицеливание)
  • scope_zoom_factor = 33.3 – какой зум дает прицеливание (здесь 60/33.3 = 1.8х)
  • scope_texture = wpnwpn_crosshair_g36 – текстура прицельной сетки
  • shell_point = 0.15, 0.0, -0.05 – точка вылета гильз
  • shell_dir = 0.0, 1.0, 0.0 – точка выброса пороховых газов из ствольной коробки
  • fire_point = -0.000000,0.062000,0.134000 – точка выстрела
  • fire_point2 = 0.30, 0.00, 0.05 – точка выстрела из подствольного гранатомета
  • fire_bone = wpn_body
  • orientation = 0, 0, 0 – ориентация ствола оружия в направлении точки попадания пули(это центр монитора). Некоторые мододелы ориентируют оружие по линии прицеливания- это не правильно, ибо пуля вылетает из ствола, а не из прицела.
  • position = 0, 0, 0 – позиция. Первая координата отвечает за перемещение в стороны (положительная – вправо, отрицательная – влево), вторая – перемещение по высоте (положительная – вверх, отрицательная – вниз), третья – перемещение по горизонтали (положительная – вперед, отрицательная – назад)
  • visual = weaponsg36wpn_g36_hud.ogf – модель, отображаемая у нас в руках
  • grenade_bone = grenade

Далее идут различные анимации при различных действиях ГГ с оружием (стрельба, перезарядка и т.д.). Но они нам особо не нужны. Но не в этом суть, суть в том, что уже давно, никто не замечал несколько строк, а именно, 3 строчки которые отвечают за позицию оружия при прицеливании:

  • zoom_offset = -0.123900,0.012450,-0.1377700000 – тут всё точно так же как и с позицией (которая идёт после fire_bone)
  • zoom_rotate_x = 0.024750
  • zoom_rotate_y = 0.001300

Описания оружия хранятся в файле: . S.T.A.L.K.E.Rgamedataconfig ext
usstring_table_enc_weapons.xml

В нем хранятся строки с названиями и описаниями, на которые ссылаются конфиги оружия. Например, тот же G36 ссылается сюда:

Меняя их содержимое, мы меняем описания/названия данного оружия.

Нововведения в ЗП

HUD модель была разделена на 2 части – руки и, собственно, само оружие. Это было сделано для того, чтобы добиться смены визуалов рук при смене комбинизона. Из-за этого (и не только из-за этого) большая часть конфига, находящаяся под "[wpn_xxx_hud]:hud_base" претерпела некоторые изменения – о них я и расскажу.

  • hands_position = 0.020500,-0.206999,0.261999 – положение рук и оружия
  • hands_orientation = 3.349998,2.599999,-0.050000 – направление (ориентация) рук и оружия
  • hands_position_16x9 = 0.020500, -0.165999,0.209500 – положение рук и оружия для мониторов 16×9
  • hands_orientation_16x9 = 3.649998,1.050001, -0.050000 – направление (ориентация) рук и оружия для мониторов 16×9
  • item_position = 0,0,0 – позиция оружия относительно рук
  • item_orientation = 0,0,0 – ориентация оружия относительно рук
  • aim_hud_offset_pos = -0.129000,0.017000,-0.001500 – смещение рук с оружием при прицеливании
  • aim_hud_offset_rot = -0.012500,0.040000,0.020000 – ориентация рук с оружием при прицеливании
  • aim_hud_offset_pos_16x9 = -0.129000,0.017000,-0.001500 – смещение рук с оружием при прицеливании для мониторов 16×9
  • aim_hud_offset_rot_16x9 = -0.012500,0.040000,0.020000 – ориентация рук с оружием при прицеливании для мониторов 16×9
  • gl_hud_offset_pos = 0,0,0 – смещение рук с оружием при прицеливании из подствольника
  • gl_hud_offset_rot = 0,0,0 – ориентация рук с оружием при прицеливании из подствольника
  • gl_hud_offset_pos_16x9 = 0,0,0 – смещение рук с оружием при прицеливании из подствольника для мониторов 16×9
  • gl_hud_offset_rot_16x9 = 0,0,0 – ориентация рук с оружием при прицеливании из подствольника для мониторов 16×9

Апгрейды и изнашиваемость

Как известно, в ЗП есть возможность апгрейда оружия. За выбор схем при апгрейде отвечают строки:

  • upgrades = up_gr_firstab_ak74, up_gr_seconab_ak74, up_gr_thirdab_ak74, up_gr_fourtab_ak74, up_gr_fifthab_ak74, * up_gr_fifthcd_ak74 – части апгрейд схемы
  • installed_upgrades = – установленные апгрейды
  • upgrade_scheme = upgrade_scheme_ak74 – апгрейд-схема

Так-же в ЗП была создана более продуманная схема изнашиваемости, вот строки которые за это отвечают:

В Game Maker каждый объект может иметь набор событий, которые запускают выполнение определённых действий. Всё. Вся "логика" игры строится именно по этому принципу. Если происходит определённое событие - выполняются созданные для него действия. Просто, не так ли? Эти события могут быть как персональными, так и глобальными, но в GM они никак не разделяются на типы, оно и к лучшему. Вы можете создавать для разных объектов разные события и определять какие угодно действия. Именно таким образом и будет работать вся ваша игра.
События создаются и редактируются в окне объекта, в поле-списке "Events", с помощью трёх кнопок "Add event" (Создать событие), "Destroy" (Удалить событие), "Change" (Сменить событие с сохранением списка действий), или в контекстном меню поля с аналогичными командами. В контекстном меню добавляется дополнительная команда "Duplicate event", которое лишь копирует список действий, а событие вам всё равно придётся выбрать заново.

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

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

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

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

Описание событий или "Я не придумал ничего лучше"

Давайте по порядку, как на картинке, я опишу события и их виды.

  • Create - всё просто, это событие выполняется, когда создаётся экземпляр объекта. Обычно используется, чтобы задавать "начальные" характеристики объекта, всякие там переменные и т.д., но может иметь и более широкое применение. Например, объекты, которые вы расположили в комнате через редактор, тоже создаются, когда комната запускается. Можно использовать такие объекты для объявления глобальных переменных и прочего и прочего. Однако, для таких как я, были созданы такие события, как Game Start и Room start, о которых речь ниже.
  • Destroy - ещё проще, это событие выполняется, когда экземпляр объекта удаляют. Можно применить, например, чтобы создать кровавое пятно на месте врага.
  • Alarm - а вот это уже интересней. Это событие таймера. Каждый экземпляр объекта может заиметь до 12-ти таймеров, каждый их них будет подписан в списке событий как Alarm0, Alarm1, Alarm2 и т.д. С помощью определённого действия или кода, можно запустить нужный таймер и по его истечению, выполнятся нужные действия я иногда использовал алярмы чтобы персонажи моргали глазами :3 , диапазон применения - очень широк, иногда даже 12-ти таймеров не хватает.
  • Step - событие "шага", архиважное событие, находит применение практически всегда. Вам нужно перемещать объект за курсором? Вам нужно событие "шага". Нужно постоянно перемещать образцы по координатам? Вам нужно событие "шага". Нужно отследить монстров на наличие бафов? Вам нужно событие "шага". Это событие выполняется "постоянно", то есть, каждый игровой "шаг". Как его определить? В окне комнаты есть такое поле, как "Room speed" - это скорость комнаты, и по сути, скорость игры, т.е. FPS - количество кадров в секунду. Так что, если у вас скорость текущей комнаты 60 fps или шагов - событие "шага" будет срабатывать 60 раз в секунду. Вуаля. Рассмотрим виды этого события:
  • Step - самое распространённое событие, срабатывает как раз после событий создания и уничтожения, но перед всеми остальными. Очень удобно отлавливать этим событием кнопки клавиатуры или мышки.
  • Begin step - это событие шага срабатывает перед всеми остальными событиями, хотя в списке оно и идёт где-то посредине.
  • End step - это событие шага срабатывает после всех остальных событий, но перед событием рисования.
  • Collision - событие "столкновения". Срабатывает, когда спрайт или маска объекта пересекаются со спрайтом другого объекта. В контекстном меню это событие предлагает выбрать с каким объектом нужно чтобы текущий объект сталкивался. Потому этих событий может быть много - для каждого из предопределённых объектов. Самое распространённое применение - столкновение пули со стеной, конечно же.
  • Keyboard - событие нажатия на кнопку клавиатуры. Но не обычное. Это событие срабатывает каждый шаг, пока кнопка нажата. Предлагает на выбор множество различных кнопок, от алфавитных до функциональных и прочих Backspace'ов. Потому это событие может быть у объекта не одно - зависит от количества кнопок, нажатия на которые вам нужно отлавливать. Стоит отметить лишь событие Keyboard - No key и Keyboard - Any key. Первое срабатывает постоянно, каждый игровой шаг, пока не нажата ни одна кнопка. Второе - срабатывает постоянно, пока нажата любая кнопка на клавиатуре. Наркомания, не так ли? Эти два вида событий есть и у других событий клавиатуры, о которых речь ниже.
  • Mouse - это все события мышки. Давайте рассмотрим их виды:

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

  • Left/Right/Middle button - события мышки, которые срабатывают каждый шаг, пока курсор наведён на спрайт объекта и при этом зажата левая/правая кнопка мышки или колёсико. Да-да, колёсико мышки бывает кликабельное.
  • No button - аналогично предыдущим, только событие срабатывает постоянно, пока не нажата ни одна из кнопок мышки (не стоит забывать, что курсор всё ещё должен быть на спрайте, поскольку это персональные события).
  • Left/Right/Middle pressed/released - эти события отличаются от предыдущих тем, что срабатывают лишь один раз, когда кнопка мышки нажата (pressed)/отпущена (released), а курсор находится на спрайте объекта. Когда событие сработало один раз, оно не будет срабатывать, пока пользователь не нажмёт/отпустит нужную кнопку ещё раз.
  • Mouse enter/leave - событие срабатывает, когда пользователь наводит/уводит курсор со спрайта или маски объекта. Очень удобное событие чтобы делать, например, всплывающие описания для предметов.
  • Mouse wheel up/down - эти события срабатывают, когда пользователь прокручивает колёсико мышки вверх/вниз. Глобальное событие.
  • Global mouse - а вот это уже очень важные события, которые отлавливают события шага/нажатия/отпускания кнопок мышки на общем уровне, т.е. событие глобальное, и потому не нужно, чтобы курсор находится на спрайте объекта. Находят применение чаще всех остальных.
  • Joustick 1/2 - честно говоря, никогда ими не пользовался. Это события для буржуйских джойстиков - когда нажата нужная ось или кнопка.
  • Other - прочие события, которые не вошли в основные категории событий. Вот они:

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

  • Outside room - событие срабатывает, когда объект покидает границы текущей комнаты. Можно использовать, например, для удаления таких образцов.
  • Intersect boundary - событие срабатывает, когда спрайт объекта пересекает границу комнаты.
  • Outside/Boundary view X - аналогично предыдущим двум событиям, только для одного из семи доступных видов (проще - игровых камер).
  • Game start/end - из названия понятно, что эти два события срабатывают лишь по одному разу за игру - в её начале и в конце. Это глобальные события, обычно используются для инициализации игровых данных. Часто game end используется чтобы закрывать dll'ки и удалять прочие непотребства из памяти, даже не смотря на то, что GM большинство из таких операций делает автоматически.
  • Room start/end - аналогично предыдущим, только для игровых комнат. В GM комнаты - это, по сути, игровые уровни. Так вот, эти события срабатывают, когда текущая комната запускается/заканчивается. Стоит помнить, что событие может срабатывать многократно, поскольку игрок может выходить/возвращаться в комнату. Тем более, нам не важно, какая это комната, поскольку мы сможем написать нужное условие на проверку имени/номера текущей комнаты, перед выполнением нужных действий.
  • No more leaves/health - это события для встроенных в GM систем здоровья и жизней, события срабатывают, когда они заканчиваются (равны нулю). Не понятно, кто ими пользуется, ведь намного проще объявить две-три переменных и сделать свою системку здоровья.
  • Animation end - это событие также для встроенной в GM системы анимаций. По сути - срабатывает когда все кадры у спрайта объекта проигрываются до последнего. Иногда полезно, но снова же, проще написать свою гибкую систему анимаций.
  • End of path - событие срабатывает, когда объект подходит к концу пути. Тоже иногда полезно.
  • Close button - событие срабатывает, когда нажимают кнопку закрытия игры - т.е. на крестик окна игры. Это же событие должно срабатывать и для кнопки Esc, если в настройках игры установлена такая возможность.
  • User defined X - это пользовательские события, их доступно до 16-ти штук. Срабатывания этих событий можно выполнить лишь через код, с помощью специальной функции. Редко, но находят применение.
  • Draw - вот мы и подобрались к самому интересному событию. Это событие "рисования". В своё время никак не мог понять, что оно делает и как им пользоваться, но когда разобрался, приятно удивился. Итак, событие рисования. Когда вы добавляете его объекту, он перестаёт отображать свой стандартный спрайт, не смотря на то, что события столкновения срабатывают как прежде, по сути делает объект невидимым. Это событие срабатывает каждый шаг и предназначено для динамической перерисовки. Вы делаете свою систему анимаций и нужно нарисовать спрайт персонажа? Вам нужно это событие. Вам нужно отобразить текст на экране или создать свой интерфейс? Вам нужно это событие. Вы хотите, чтобы у ваших юнитов были полоски здоровья, а при наведении на них курсора отображались всплывающие подсказки? Для всего этого существует событие рисования. Только сюда можно добавлять действия и функции рисования (обычно начинающиеся с draw_, например, draw_sprite() или draw_text() и т.д.), чтобы они работали. Кстати, поскольку это событие также срабатывает каждый шаг, после всех остальных событий (перерисовка объекта происходит в самом конце каждого шага, уже после того, как его изменили и переместили в новую позицию), поэтому его можно использовать вместо события Step, хотя это и не рекомендуется. В общем, мощнейший инструмент, нужен всегда и везде.
  • Key pressed и следующее за ним Key released - события нажатия/отпускания кнопок клавиатуры. В отличии от указанных выше событий Keyboard, срабатывают не каждый шаг, а лишь один раз, после чего пользователь должен отпустить/нажать кнопку снова. Используются чаще всего, например, для управления персонажем/машинкой/т.д.
  • Trigger - это новый вид событий, который появился в Game Maker 8. При добавлении этого события открывается окошко редактирования триггеров - это новый ресурс GM, хоть их и нельзя добавлять в структуру игры напрямую. В этом окошке вам предлагается в виде кода прописать условие, которое будет проверяться каждый шаг, и событие будет выполняться тогда, когда условие истинно, т.е., по сути, триггеры - это одна из модификаций события Step. Вы можете написать туда не только условие, но и вообще какой угодно код, который будет выполняться каждый шаг. Уже не говоря, что к этому событию можно и нужно добавлять действия в списке действий. Не очень понятно, зачем они нужны, ведь тех же самых результатов можно добиться, используя событие Step. По-видимому, они позиционировались как уникальные пользовательские события. Но раз их добавили - значит, иногда они всё-таки очень нужны.

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

Итого, вот и все события, которые есть в Game Maker, но их хватит на все случаи жизни. Поскольку каждому объекту можно задать свой набор событий, это заметно упрощает построение логики игры, позволяет реализовать тот или иной момент разными способами. Такая гибкость наравне с объектами - фишка GM, и одновременно - его наказание, поскольку многие моменты приходится реализовать вручную, которые уже встроены по-умолчанию в другие конструкторы. Также, поскольку каждому событию можно задать список действий, нужно рассмотреть стандартные действия, т.е., привычные каждому модмейкеру на варкрафте гуи-иконки, так называемые библиотеки стандартных действий.

Стандартные действия или "Почему я всё ещё это читаю?"

Итак, вы добавили объекту событие. Теперь, в соседнем поле "Actions" вы можете добавлять действия, которые просто перетягиваете из панельки с закладками справа в список. Все действия выполняются в порядке расположения в списке - сверху вниз. Их можно перетягивать вверх-вниз, копипастить и так далее.

События и стандартные действия в Game Maker — Game Maker — DevTribe: инди-игры, разработка, сообщество

При перетягивании большинства действий открывается окно настроек этого действия - там вы задаёте все нужные данные. Редактирование уже добавленного действия выполняется последствием двойного клика на иконку в списке.
По-моему, проще некуда. Хотя, на самом деле, продвинутому пользователю нужно всего одно действие - блок кода "Code" на закладке "Control", нужно рассмотреть все стандартные действия, хоть это и не очень удобный и громоздкий способ задавать логику игры.

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