Здравствуйте, снова с вами я "клаво-головолом"

и я решил рассказать начинающим ГМ-программистам о возможности создания персонажа по частям. То есть, персонажу можно настраивать отдельно голову, тело, руки, ноги м др. Итак, приготовьте чаёк с печеньками, включайте ГМ и начинайте творить

.
В чём "Секрет" нашей задачи:Представьте ситуацию, вы играете в свою любимую игру. Вы её уже на over9000 раз прошли и хотите чего-то новенького. В игре персонаж всегда одинаковый и вы сразу же захотите, чтобы вы были на месте этого персонажа. Но это невозможно!
Чтобы такого не случалось с вашей игрой, можно дать игроку возможность создавать собственного персонажа.
Для реализации этого ничего стороннего не потребуется, кроме знания того, как пользоваться GM.
Начинаем творить:1. Открываем Game Maker (Убедитесь что он PRO версии)
2. Для начала нам нужно создать спрайты игрока, создаём спрайт головы, назовём его
s_heads.
Далее создаём в нём 6 изображений 32x32 и закрасим их разными цветами.
Не обязательно, чтобы было именно 6 изображений (Голов), вы можете создавать их сколько угодно.
Теперь создадим спрайт тела назовите его
s_bodys. Так же создайте 6 изображений разных цветов, только на этот раз размером 32x64.
Теперь нам нужен спрайт рук, проделываем ту же процедуру, что и с другими спрайтами. Название спрайта
s_hands; размер 64х16.
Отлично! Мы сделали аж 3 спрайта, но этого не достаточно. Теперь нам нужно сделать ноги. Проблема заключается в том, что ноги должны бать анимированы.
Создаём папку в спрайтах, под названием
FEETS и создадим там спрайт
s_feet1. создайте в нём 2 изображения 64x64 и нарисуйте их как показано на изображении:
Таким же образом создайте ещё 5 таких спрайтов под именами s_feet2, s_feets3, s_feet4... до 6. (Не забудьте что у них разная расцветка)
получилось как-то так:
Со спрайтами мы ПОКА закончили.
3. Объекты, это самая главная часть нашего примера, для начала создадим объект туловища
o_body.
Присваиваем ему спрайт s_bodys
Таким же образом создайте 3 спрайта: o_head; o_hand; o_feet и присвойте им спрайты соответственно (к объекту feet присвойте спрайт s_feet1).
Создайте комнату
rm_game и добавьте в разные места все объекты которые мы сделали.
На всякий пожарный сохраните объект
Включите игру.
Как вы видите объекты мигают разными цветами, так не должно быть! Для этого мы создадим ещё один объект
o_cpu, он будет ответственный за управление всем проектом, процессор для нашего тела. Присваивать спрайт ему не нужно.
- Разберём нашу проблему, чтобы вы поняли дальнейшие действия. Объекты мигают, потому, что задана стандартная скорость спрайтов, все изображения это анимация. Нам нужно снизить скорость до нуля.
В Create

объекта процессора пишем:
o_body.image_speed=0 // Скорость спрайта объекта o_body
o_head.image_speed=0 // Скорость спрайта объекта o_head
o_hand.image_speed=0 // Скорость спрайта объекта o_hand
o_feet.image_speed=0 // Скорость спрайта объекта o_feet
Теперь можете проверить игру, всё будет работать (Но перед запуском не забудьте добавить объект процессора в комнату, но передж этим удалите все объекты, так как объект процессора нужно ставить первым в комнату)
Теперь нам нужно сделать возможность изменения изображения нашего персонажа. Дополните код процессора в Create

.
global.skbd=0 // номер изображения спрайта body
global.skhd=0 // номер изображения спрайта head
global.skhn=0 // номер изображения спрайта hand
global.skft=0 // номер изображения спрайта feet
Мы создали целых 4 переменных дла каждого объекта персонажа. Теперь нам нужно присвоить каждому объекту его номер.
Заходим в объект
o_body и в Create

пишем:
image_index=global.skbd //Присваиваем номер изображения
Так же делаем для o_head и o_hand (o_feet пока не трогаем). Теперь вы можете изменить в объекте проессора номер каждого объекта, но запомните, что он должен быть не больше 5 и не меньше 0, так как счёт начинается с 0.
Теперь вернёмся к объекту o_feet, в его Create

прописываем следующее:
sprite_index=execute_string('return s_feet'+string(global.skft+1));//Устанавливаем спрайт ног
Думаю с этим вы разберётесь.
Теперь мы вернёмся к 2 проблеме.
4. Теперь нам надо сделать так, чтобы наш персонаж не валялся по всей комнате разорванный на куски ,а был одним целым. для этого нам нужно вернутсья к спрайтам.
Проблема 1 у нас возникнет с центром, нам нужно будет установить его на теле так, чтобы к нему можно было спокойно прикреплять остальные части тела.
От центруем спрайт в районе рук на координатах 16;16 :
Теперь нам нужно от центровать голову (s_heads) центруем его на 16;32. По Сути мы отцентровали его у шеи, но будет одна загвоздка при написании кода в дальнейшем, которую мы легко решим, сейчас на счёт этого не парьтесь.
Руки (s_hands) центруем на координатах 8;8
Ноги нужно от центровать в каждом объекте от s_feet1 до s_feet6 в точках 32;-48
Готово, теперь нужно скрепить наши части тела
Заходим в объект o_hend и в End Step

пишем:
x=o_body.x
y=o_body.y
То же самое пишем в объекте o_feet
Получилось вот что:
Теперь разберёмся с головой, если мы напишем ему как и к рукам код, то его шея будет на уровне руки, это плохо, для этого мы пишем другой код (В End Step объекта o_head):
x=o_body.x
y=o_body.y-16
Теперь можно проверять.
Давайте сделаем анимацию ног.
Для этого в объекте o_feet в Step

пишем:
if keyboard_check(ord('A')) then { o_body.x-=20; image_speed=1 } //Включаем анимацию и перемещаемся влево
if keyboard_check(ord('D')) then { o_body.x+=20; image_speed=1 } //Включаем анимацию и перемещаемся вправо
if keyboard_check_released(ord('A'))or keyboard_check_released(ord('D')) then {image_speed=0; image_index=0} //Выключаем анимацию
Теперь при нажатии на кнопки A и D вы можете перемещать игрока и ваши части будут следовать за телом.
Вообщем-то всё готово, теперь вы можете просто изменять переменные global.skbd; skhd; skhn; skft и у вашего персонажа будут меняться части тела.
Можно поэкспериментировать и сразу же создать физику игроку, например вертеть головой и рукой, напишите для этого в Step

объекта o_head:
move_towards_point(mouse_x,mouse_y,0)
image_angle=direction
if mouse_x < x then {image_yscale = -1}else{image_yscale = 1}
Тот же код можно вписать к рукам o_hand.
Вот что в итоге получится:
Если возникли вопросы, пишите в коментариях, на всё отвечу.