Game Maker - создание игр | HellRoom Games
Июнь 19, 2025, 03:15:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Урок: пример создания персонажа по частям  (Прочитано 9818 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DANTES
Участник
****

Репутация: 46
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: Game Maker 8.0 Pro
Деятельность: Программист
Сообщений: 186


Red-line Community


WWW
« : Декабрь 15, 2013, 12:40:53 »

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

В чём "Секрет" нашей задачи:

Представьте ситуацию, вы играете в свою любимую игру. Вы её уже на 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.

Вот что в итоге получится:
Если возникли вопросы, пишите в коментариях, на всё отвечу.

* Skin Tutorial (By DANTES).gmk (14.13 Кб - загружено 647 раз.)
Записан

 
Aristokrat952
Твоя мама - лама
GM Pro user
*

Репутация: 385
Offline Offline

Пол: Женский
Награды:
1 место в Дичайшем джеме #8500 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+150 репутации]1 место в конкурсе Адекватные игры #3 [Антиутопия]3 место в конкурсе ...
API: Game Maker 8.0 Pro
Деятельность: Чет там делает
Сообщений: 1311


Дмитрий - зануда.


« Ответ #1 : Декабрь 15, 2013, 13:23:37 »

Чему урок с таким кодом:

Код:
if (global.skft=0) then {sprite_index=s_feet1} // если номер равен 0 даём объекту спрайт s_feet1
if (global.skft=1) then {sprite_index=s_feet2} // если номер равен 1 даём объекту спрайт s_feet2
if (global.skft=2) then {sprite_index=s_feet3} // если номер равен 2 даём объекту спрайт s_feet3
if (global.skft=3) then {sprite_index=s_feet4} // если номер равен 3 даём объекту спрайт s_feet4
if (global.skft=4) then {sprite_index=s_feet5} // если номер равен 4 даём объекту спрайт s_feet5
if (global.skft=5) then {sprite_index=s_feet6} // если номер равен 5 даём объекту спрайт s_feet6

может научить?
Записан

Статус: сплю и анимешусь с Яшей
genius
Активный участник
*****

Репутация: 25
Offline Offline

Пол: Мужской
Награды:
За постоянность! [10 дней на форуме]
API: Game Maker 8.0 Pro
Деятельность: JS, PHP, Laravel, Symfony, Yii2, GML, CoffeeScript, SQL, CSS, HTML, Bootstrap, XML, jQuery, jQuery UI, AJAX, COMET
Сообщений: 338


« Ответ #2 : Декабрь 15, 2013, 13:30:16 »

Так урок или пример ?
Записан
EnderMart
Участник
****

Репутация: 15
Offline Offline

Пол: Мужской
API: GameMaker Studio Master
Сообщений: 126


esketit


« Ответ #3 : Декабрь 15, 2013, 14:31:32 »

Так урок или пример ?
Урок: пример 
А по сути это бесполезная дрянь 
Записан

DANTES
Участник
****

Репутация: 46
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: Game Maker 8.0 Pro
Деятельность: Программист
Сообщений: 186


Red-line Community


WWW
« Ответ #4 : Декабрь 15, 2013, 15:43:40 »

Так урок или пример ?
Урок: пример  
А по сути это бесполезная дрянь  
Сказал человек у которого в репутации единственный + и тот за то, что посоветовал кому-то Paint.net   , когда для рисования есть такие программы как:
Corel Draw
Photoshop
Flash

А урок расчитан на новичков, так что если вы всё хорошо поняли и вам это не нужно, не надо писать такие сообщения как выше сказанное.
Записан

 
Fargost
«Старожил форума»
******

Репутация: 40
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [50 дней на форуме]
API: GameMaker Studio Pro
Сообщений: 544


Teedeush - the main aim


« Ответ #5 : Декабрь 15, 2013, 15:56:52 »

У тебя ломать клавы лучше получается :D
Записан
EnderMart
Участник
****

Репутация: 15
Offline Offline

Пол: Мужской
API: GameMaker Studio Master
Сообщений: 126


esketit


« Ответ #6 : Декабрь 15, 2013, 16:36:23 »

Так урок или пример ?
Урок: пример  
А по сути это бесполезная дрянь  
Сказал человек у которого в репутации единственный + и тот за то, что посоветовал кому-то Paint.net   , когда для рисования есть такие программы как:
Corel Draw
Photoshop
Flash

А урок расчитан на новичков, так что если вы всё хорошо поняли и вам это не нужно, не надо писать такие сообщения как выше сказанное.
А причём здесь репутация 
Я высказал своё мнение. И если ты не уважаешь мнение других, то кто будет уважать твоё мнение? имхо  Хм...
Записан

DANTES
Участник
****

Репутация: 46
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: Game Maker 8.0 Pro
Деятельность: Программист
Сообщений: 186


Red-line Community


WWW
« Ответ #7 : Декабрь 15, 2013, 16:46:49 »

Так урок или пример ?
Урок: пример  
А по сути это бесполезная дрянь  
Сказал человек у которого в репутации единственный + и тот за то, что посоветовал кому-то Paint.net   , когда для рисования есть такие программы как:
Corel Draw
Photoshop
Flash

А урок расчитан на новичков, так что если вы всё хорошо поняли и вам это не нужно, не надо писать такие сообщения как выше сказанное.
А причём здесь репутация 
Я высказал своё мнение. И если ты не уважаешь мнение других, то кто будет уважать твоё мнение? имхо  Хм...
Допустим, если ты выразил своё мнение, почему ты ен развернул ответ, допустим ты решил сказать (Пример задротов) что CallOfDuty лучше чем Battlefield или наоборот, кто-то согласится с этим, кто-то нет. Но почему бы не сказать, что по части игровой физики одна игра лучше другой, по сюжету другая лучше первой, и никто критиковать не будет. Так же и мой урок, расчитан на новичков! Всё просто ! Я сделал урок, а судить его должен лишь новичок, или же тот, который понимает нужно ли это новичку.
Записан

 
AndrewVideoGames
Главный Модератор
*

Репутация: 821
Offline Offline

Пол: Мужской
Награды:
За постоянность! [500 дней на форуме]За лояльность! [+750 репутации]5000 сообщений!За помощь новичкам!
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316



« Ответ #8 : Декабрь 15, 2013, 16:56:45 »

 Мнение можно выражать по разному.
 И код очень громоздкий и немного не оптимизированный, новичкам это не понравится, замени это:
Код:
if (global.skft=0) then {sprite_index=s_feet1} // если номер равен 0 даём объекту спрайт s_feet1
if (global.skft=1) then {sprite_index=s_feet2} // если номер равен 1 даём объекту спрайт s_feet2
if (global.skft=2) then {sprite_index=s_feet3} // если номер равен 2 даём объекту спрайт s_feet3
if (global.skft=3) then {sprite_index=s_feet4} // если номер равен 3 даём объекту спрайт s_feet4
if (global.skft=4) then {sprite_index=s_feet5} // если номер равен 4 даём объекту спрайт s_feet5
if (global.skft=5) then {sprite_index=s_feet6} // если номер равен 5 даём объекту спрайт s_feet6
примерно, на это:
Код:
sprite_index=execute_string('return s_feet'+string(global.skft+1));
И меньше места занимает раз в двенадцать и новичкам кажется божественным чудом, которое можно легко объяснить.
Записан
EnderMart
Участник
****

Репутация: 15
Offline Offline

Пол: Мужской
API: GameMaker Studio Master
Сообщений: 126


esketit


« Ответ #9 : Декабрь 15, 2013, 17:05:59 »

Так урок или пример ?
Урок: пример  
А по сути это бесполезная дрянь  
Сказал человек у которого в репутации единственный + и тот за то, что посоветовал кому-то Paint.net   , когда для рисования есть такие программы как:
Corel Draw
Photoshop
Flash

А урок расчитан на новичков, так что если вы всё хорошо поняли и вам это не нужно, не надо писать такие сообщения как выше сказанное.
А причём здесь репутация 
Я высказал своё мнение. И если ты не уважаешь мнение других, то кто будет уважать твоё мнение? имхо  Хм...
Допустим, если ты выразил своё мнение, почему ты ен развернул ответ, допустим ты решил сказать (Пример задротов) что CallOfDuty лучше чем Battlefield или наоборот, кто-то согласится с этим, кто-то нет. Но почему бы не сказать, что по части игровой физики одна игра лучше другой, по сюжету другая лучше первой, и никто критиковать не будет. Так же и мой урок, расчитан на новичков! Всё просто ! Я сделал урок, а судить его должен лишь новичок, или же тот, который понимает нужно ли это новичку.
А разве ты написал, что этот урок могут комментировать только новички?
Записан

MusNik
KeeVee Games
GM Pro user
*

Репутация: 733
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3241



WWW
« Ответ #10 : Декабрь 15, 2013, 17:08:54 »

Я сделал урок, а судить его должен лишь новичок, или же тот, который понимает нужно ли это новичку.
Урок плохой, наполнен говнокодом, новичку это не нужно и даже вредно.

Так нормально объяснил?

Записан

EnderMart
Участник
****

Репутация: 15
Offline Offline

Пол: Мужской
API: GameMaker Studio Master
Сообщений: 126


esketit


« Ответ #11 : Декабрь 15, 2013, 17:14:58 »

Я сделал урок, а судить его должен лишь новичок, или же тот, который понимает нужно ли это новичку.
Урок плохой, наполнен говнокодом, новичку это не нужно и даже вредно.

Так нормально объяснил?

Спасибо, Никита 
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.117 секунд. Запросов: 33.