Приветствую Вас, Гость | RSS
Вторник, 02.03.2021, 15:02
Главная » Статьи » Уроки [ Добавить статью ]

Как создать движение
Как создать движение
Создание персонажа и управление им
Вы конечно уже знаете, кто будет гулять по вашему «саду», на кого он будет похож, и что он там будет делать. Наброски персонажа на бумаге или в голове, список движений, используемые предметы и пр. Всё это называется профайлом. Это может быть полностью ваш герой или содранный парень из doom-a…неважно. Мы просто должны научить его плясать под наши кнопки.

Для начала прикинем, что мы умеем делать в области графики. Предполагаю, не так много, а это значит придётся изучить как минимум пару графических пакетов процентов до 40-60 каждый. Мы же хотим сделать реальную анимацию персонажа. Для этого подойдёт «3D studio MAX». Затем, нам придётся перевести анимационный фаил AVI в формат GIF – для этого применим «Paint Shop Pro - Animation Shop». Вот и всё, что вам необходимо изучить для создания простенького персонажа. Многое вам придётся изучить самостоятельно, используя поисковую систему (или книги), т.к. перепечатывать интернетовский материал, в ассортименте разбросанный по всемирной паутине, не собираюсь.

Допустим модель и анимация героя уже готова. Тогда остаётся её правильно нарезать и запихнуть в игру.

Дальше я объясню весь процесс на конкретном примере.

Для своей игры мне понадобилось что-то вроде космодесантника. Сначала был рисунок на бумаге, но возможно вы многое добавите или уберёте в процессе моделирования, как обычно это происходит у меня. Я хотел придать ему более мультяшный вид и сделал торс и шлем бОльших размеров. Этот тип имел пистолет. Также предполагалось, что он сможет стрелять на шесть сторон с места, передвигаясь пешком и в прыжке. Если он не стреляет, то перемещается бегом. Итак, модель, анимация, рендринг и перевод в gif формат уже закончены и начинается немного муторная работа – разделение на торс и ноги.

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

А! Сначала подсчитаем, какие файлы образовались.

Файлы анимации, учитывая две стороны перемещения:

– бег с поднятым пистолетом (оружие на уровне виска) (2шт)

– ход с любым положением оружия (только анимация ног) (2шт)

– стойка на две стороны с анимацией стрельбы в трёх положениях на каждую сторону (только анимация туловища и картинка стоячих ног) (6шт)

– прыжок на две стороны с любым…(анимация ног) (2шт)

Итого: 12 gif-ов. Надеюсь, ничего не забыл.

Если мы просто запихнём человечка целиком, то весь кайф управления туловищем отдельно от ног будет утерян. Единственный способ – делить персонаж на верх и низ по линии талии.

Делим: (ResizeCanvas-ом) берём верх у анимации стойки – это анимация туловища и рук с оружием – 6 изображений (по 3 на сторону). С верхом разобрались. То же делаем с нижней частью и получаем ноги в положениях: стоя, шагом, бегом, прыжок. На ноги – 8 изображений (две стороны). Если у вас в некоторых положениях верхняя часть залезает на нижнюю (например длинный ствол в положении «стрельба вниз» находится ниже пояса), то нужно будет вручную закрасить нижнюю часть…нет…это я сморозил конечно – у нас же в анимации десяток кадров и это будет нехорошая работа – никогда не занимайтесь такой чушью. Нужно будет отрендрить верх отдельно, без ног, но не исправляйте камеру, иначе верх «уедет» при стыковке.

Воооот. Нарезали персонаж, теперь соберём его.

Алгоритм

Определяем кнопки, отвечающие за наведение пистолета. Это стрелки ВВЕРХ и ВНИЗ. Когда они отпущены, то возвращаем руки в начальное положение. Кнопки передвижения – стрелки ВЛЕВО и ВПРАВО. Прыжок – ALT. Стрельба – CTRL. Вы можете взять и другие, но это сочетание очень часто применяется в аркадах и если вы, допустим, поменяете назначение CTRL и ALT, то любители аркад будут огорчены. Но вы, конечно, добавите в меню «настройка клавиатуры». Речь не об этом. Продолжаем.

Сначала я опишу алгоритм в общих чертах (я написал его сходу только однажды, а потом пробежал глазами – если что-то не ясно, смотрите конкретный пример). Он возможно не будет совпадать с тем, что я приведу в конце, но в качестве плана сойдёт.

В событии STEP проводим обработку клавиатуры и придаём нашему герою соответствующие скорости и значения. Вот примерное описание кода для управления оружием: [Блок туловища]

{

Если вверх

{

направление руки=Оружие вверх.

Если стрельба то Вылет патрона.

} иначе

Если вниз

{

направление руки=Оружие вниз.

Если стрельба то Вылет патрона.

} иначе

{

….

направление руки=Оружие горизонтально

Если стрельба то Вылет патрона.

}

}

Переменная Направление руки вам понадобится для выбора рисуемого спрайта. ВВЕРХ, ВНИЗ и далее ВЛЕВО, ВПРАВО, ОГОНЬ, ПРЫЖОК в коде будут означать нажатие соответствующих клавиш.

Теперь ноги: [Блок шасси] (шасси, ноги – разница то, зато звучит хорошо)

{

Если не прыжок_ // это переменная jump, а не опрос клавиатуры

{

Если влево

{

Направление перс.= влево

Если стрельба то скорость = шаг иначе бег

// скорость горизонтальная

} иначе

Если вправо

{

Направление перс.= вправо

Если стрельба то скорость = шаг иначе бег

} иначе

{

скорость = нуль J

}

}

иначе (если прыжок_)

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

}

Сразу оговорюсь, что прыжок=ложь в том случае, когда персонаж находится на полу. Здесь применяют обычный код включающий в себя манипуляции с гравитацией. Если вы применяете такой код, то можно сказать, что прыжок есть когда гравитация не равна нулю.

Как мы видим, туловище не зависит от ног, будь то прыжок или перемещение по поверхности. Блоки стрельбы и прыжка простые, но напишу пару строк:

[Блок стрельбы]

А мы кстати его уже рассматривали. См.выше.

[Блок прыжка]

Если кнопка_прыжок

Вертикальная скорость = начальная скорость прыжка.

Закончили со STEP-ом.

В событии DRAW займёмся спрайтами. Они должны меняться в соответствии с нажатыми кнопками. Лично я решаю проблему прокручивания анимации с помощью переменных-счётчиков и переменных-инкрементов (их обычно сразу заменяю на цифры – это скорость прокручивания), возможно есть и лучшее решение.

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

Если не прыжок

{

Если гор.скорость=0

Рисуем спрайт ног для стойки

иначе

Если модуль(гориз.скорость)<скорость шага // скор.шага - константа

{

прибавляем номер изображения, если номер больше кол-ва изображений в спрайте, то скидываем на ноль.

рисуем спрайт шага с этим номером

}

иначе

Если модуль(гориз.скорость)>скор. шага

То же самое что и с шагом, только рисуем бег (это анимация в полный рост!)

}

иначе рисуем спрайт ног в прыжке

С ногами всё. Спрайт для прыжка можно сделать циклическим, но лично я сделал его подлиннее и прокручивал заметно (т.е. это совсем не заметно но...) медленнее других и останавливал на последнем кадре, если это был затяжной прыжок (читай – падение).

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

Если не стрельба

{

Если направление рук вверх

Рисуем спрайт стрельбы вверх, но только его нулевое изображение

Иначе

Если …вниз

……вниз….

Иначе

……горизонтально….

}

иначе

Рисуем те же спрайты но уже с одиночной прокруткой (один выстрел) и после прокрутки объявляем о том, что стрельба=ложь. Таким образом нашу анимацию выстрела никто не потревожит и по её окончании мы даём добро на очередной выстрел (если он состоится…хе-хе).

Не забудьте учитывать направление.

Теперь в том виде, который вы так долго ждали. Это код из моей игры. Он не идеально оптимизирован и если я продолжу создание этой игры, то пересмотрю некоторые вещи, которые я подметил в процессе конструирования этого хелпа. Я не буду говорить «пожалуйста, не слизывайте этот код», т.к. он как бы не поддаётся сильному преобразованию – все действия практически стандартны, но надеюсь вы разберётесь и сделаете его лучше и подгоните под свою задумку.

Код из демки

Начнём с оглавления переменных в событии CREATE:

//Здесь некоторые переменные остались от прошлых версий, так что если их на найдёте - удаляйте

img_speed=30/room_speed; //инкремент (прибавление) счётчика

reload_snd_mark=1 //маркер звука перезарядки

step_snd_mark=1; //............шагов

temp_c=1 //а чёрт его знает

jump=false //прыжок=ложь

fire=false //огонь

reload=false; //перезарядка

cameras_num=gameplay.cameras_num+1 //количество камер (применяется в ДРО(DRAW))

fire_dir=0; //направление стрельбы

//три переменных направления стрельбы:

fire_up=-1; //вверх

fire_cr=0; //гориз-но

fire_dn=1; //вниз

can_shoot=true //можем_стрелять (на самом деле отвечает за темп стрельбы)

gravity_=gameplay.gravity_; //гравитация равна глобальной (идиотское присваивание но я так часто делаю :оР)

walk_speed=0.9 //скорость ходьбы

run_speed=2.2 //...бега

//можете указать скорость стойки

now_speed=run_speed; //переменная скорости = бег

// далее константы направления и их переменная. из направлений использованы только два

d_up= 1;

d_down= 2;

d_left= 3;

d_right=4;

direct=d_right;

tracer_count=0; // не помню

// счётчики кадров:

img_count_fire=0;

img_count_walk=6

img_count_jump=0;

img_count_reload=0;

img_count=0;

count_do=1; //честно не помню

get_collision=false //гдето используется

control=true //контроль над игроком (теряется временно при встрече с врагом и пр)

//image_single=-1

//Inventory возможные вещи

inv_key_red=false; //наличие красного ключа //здесь это не нужно

Как видите, здесь нет переменных вроде A,B,Z,QWE и примерно ясно само назначение переменной, если знать немного английский. Это я говорил новичкам – приучайте себя сразу к культурному написанию кода.

Далее событие STEP:

//Вот вам один из примеров универсального блока в котором уже мало что изменится. Он отвечает за гравитацию и её отключение, когда игрок на земле (иначе могут быть глюки). Впрочем, можно обойтись и постоянной гравитацией, но надо будет добавить ещё кое-что.

gravity_direction = 270;

if place_free(x,y+1) //если под игроком нет земли (поверхности)

{

jump=true; //прыжок = истина. это чисто моя прибавка. Обычно её здесь нет

gravity = gameplay.gravity_ //меняем гравитацию на глобальную

}

else

{

jump=false; //прыжок=ложь. стоим на земле.

img_count_jump=20; //счётчик кадров для прыжка.

gravity = 0; //обнуление гравитации, но поверьте, игрок никуда не улетит. :)

}

//А далее непосредственно обработка управления

if control=true //если игрок может управлять перс-жем

{ //опрашиваем вверх-вниз, но до этого обнуляем направление стрельбы....

fire_dir=0; //выставляем горизонт.направление стрельбы

if keyboard_check(vk_up) {fire_dir=1;} //вверх

else

if keyboard_check(vk_down) {fire_dir=-1;} //вниз

//...таким образом если эти клавиши не нажаты, то направление остаётся нулевым.

if jump=false //если не совершается прыжок

{

if keyboard_check(vk_left) hspeed=-now_speed; //нажатие влево и вправо..

else if keyboard_check(vk_right) hspeed=now_speed; //придают игроку скорость

//если игрок перезаряжает обойму, то скорость падает до «шагом». Обратите внимание, что это идёт после обработки влево-вправо:

if reload=true now_speed=walk_speed;

//если кнопки влево-вправо отпущены, то игрок начинает сбавлять скорость и она зануляется когда менее чем 0.2 по модулю. sign(hspeed) даст нам нужный знак уменьшения скорости:

if !keyboard_check(vk_right) && !keyboard_check(vk_left)

if abs(hspeed)>0.2 hspeed-=sign(hspeed)*0.2 else hspeed=0;

//ALT-прыжок. идёт проверка на нажатие кл. и на присутствие земли под ногами и свободного места вверху (чтобы не шарахаться об потолок над самой головой со всей дури):

if keyboard_check(vk_alt) && !place_free(x,y+1) && place_free(x,y-10)

{

vspeed=-4; //придаём вертикальную скорость

jump=true; //и отпускаем в прыжок

img_count_jump=0; //счётчик изображения обнуляем (а сам спрайт меняется на прыжковый в DRAW)

}

}

else //продолжение if jump=false...else - если сейчас прыжок

{ //часто в играх можно управлять высотой прыжка удерживанием кнопки "прыжок", но сначала проверим влево-вправо как и в прошлый раз… здесь кое-что изменилось:

if keyboard_check(vk_left) {if hspeed>-now_speed hspeed-=0.2 else hspeed=-now_speed;}

if keyboard_check(vk_right) {if hspeed
//вы уже заметили разницу управления в прыжке и на земле. На земле скорость меняется мгновенно, а в прыжке она как бы плавно перетекает в нужную сторону.

//теперь о высоте прыжка. Я сделал ограничение времени, ссылаясь на номер спрайта. Вы же можете основаться на alarm-е или другом счётчике. Значит действие такое - пока изображение спрайта не выше четвёртого и нажат "прыжок" то скорость прыжка поддерживается постоянной (гравитация уже действует). После 4-го изображения никакого поддержания скорости не будет и она окажется полностью в руках гравитации. Здесь также есть проверка на отсутствие потолка и проверка вертикальной скорости – она не должна быть положительной, ибо соскочив с обрыва, прыгать уже не положено:

if img_count_jump<4 && keyboard_check(vk_alt) && vspeed<0 && place_free(x,y-5) then vspeed=-4;

}// END "if jump=false... else..." - некоторые свои заметки я оставил как есть

//FIRE - Блок "огня" (самая вкуснятина в игрушках :о)

if keyboard_check(vk_control) && reload=false //Если нажат "огонь" и нет перезарядки:

{

if can_shoot=true && pistol_shells>0 //если мы Можем стрелять и есть патроны

{ //небольшое отступление - direct=d_left или =d_right – почему-то само присваивание я сделал в DRAW, но его можно переместить и "поближе". Сами попробуйте. Эта переменная показывает направление движения

if direct=d_left { //если направление влево

//Далее в зависимости от направления стрельбы меняется место появления пули. Три направления (их описание см. выше) в одну сторону ...

if fire_dir=0 {instance_create(x-26,y-18,pistol_bullet);instance_create(x-20,y-18,pistol_gilze);} else

if fire_dir=1 {instance_create(x-16,y-30,pistol_bullet);instance_create(x-12,y-24,pistol_gilze);} else

if fire_dir=-1 {instance_create(x-26,y,pistol_bullet);instance_create(x-21,y-4,pistol_gilze);}

}

if direct=d_right {//если направление вправо

//...и в другие три.

if fire_dir=0 {instance_create(x+27,y-18,pistol_bullet);instance_create(x+18,y-18,pistol_gilze);} else

if fire_dir=1 {instance_create(x+16,y-30,pistol_bullet);instance_create(x+10,y-26,pistol_gilze);} else

if fire_dir=-1 {instance_create(x+27,y,pistol_bullet);instance_create(x+20,y-4,pistol_gilze);}

}

fire=true; //произошёл выстрел

sound_play(snd_pistol_fire);//играем звук выстрела

img_count_fire=0; // обнуляем номер изображения спрайта, чтобы начать выстрел с нуля и прекратить его когда его анимация закончится (это уже в DRAW)

pistol_shells-=1; // минус патрон. можете вставить проверку на наличие чита.

} else // если стрелять не можем... облом, да?

if can_shoot=true && pistol_shells=0 { // прежде чем проиграть невесёлую "мелодию" осечки, проверим, а имеем ли мы право вообще дотрагиваться до курка: Если Можем_стрелять и нет патронов:

sound_play(snd_pistol_noshells); //тот самый звук осечки

can_shoot=false; //переключатель на "клин" "огня". Иначе будет непрерывный звук...короче убери палец с кнопки если хочешь ещё раз услышать этот звук потом.

}

if jump=false then now_speed=walk_speed; // если мы на земле, то скорость падает

can_shoot=false; // а знаете...тот переключатель на "клин" "огня" был похоже лишним и бессовестно жрал наши ресурсы! Хулюгаааан... Удалите его и проверьте как всё быстро заработает. :о)

alarm[1]=room_speed/8; // темп стрельбы. В аларме: "can_shoot=true;"

alarm[5]=room_speed/2; // шаг в бег превратится через room_speed/2. В аларме стоит строка "if reload=false now_speed=run_speed;"

}

//Я вот что подумал...тот тип не только жрал ресурсы, но и был вовсе не клин_огня. Это было просто ограничением по скорострельности. Клин будет дальше.

// FIRE END

// RELOAD - блок перезарядки

//если нажата "перезарядка" и мы_не_в_состоянии_выстрела и патронов>0 и не_перезаряжаемся (фууух...):

if keyboard_check(vk_shift) && can_shoot=true && pistol_oboyma>0 && reload=false

{

pistol_oboyma-=1; //при перезарядке обычно что-то убывает. Кто выкрикнул «здоровье»?

reload=true; //пошла перезарядка (не можем стрелять и делать другие вещи)

img_count_reload=0; //сами знаете

fire_dir=0; //направление обнулили сразу

if jump=false then now_speed=walk_speed; //шаг в бег (на бегу фигово перезаряжать я вам скажу). вы конечно можете обрубать такие вещи.

}

//RELOAD END

if reload=true {//если перезарядка

//если изображение перезарядки находится в пределах 4-9 кадра и звука вылета обоймы ещё не было (маркер первого звука)

if img_count_reload>4 && img_count_reload<9 && reload_snd_mark=1 //это можно оптимизировать немного

{

sound_play(snd_pistol_clipout); //ставим первую часть "оперы перезарядки"..

reload_snd_mark=2; //..и готовимся ко второй

//"появляем" обойму в нужном месте:

if direct=d_left instance_create(x-16,y-1,i_pistol_oboyma) else

if direct=d_right instance_create(x+16,y-1,i_pistol_oboyma);

}

//если изображение перезарядки и звука вставки обоймы ещё не было

if img_count_reload>10 && reload_snd_mark=2 {

sound_play(snd_pistol_clipin); //ставим продолжение "оперы перезарядки"

reload_snd_mark=1 //переводим стрелки на первый звук перезарядки, но его больше не будет, т.к. кадры не те уже.

}

}

// А вот и клин_огня, как я его назвал. Это можно описать как "всё готово к стрельбе, осталось только отжать курок"

if !keyboard_check(vk_control) && can_shoot=true && pistol_shells>=0 && reload=false then {fire=false;}// - это добрый знак - у нас есть как минимум один патрон.

}// Control - завершение блока контроль_над_персонажем_есть

//Окончание модуля STEP

Ширина листа не позволяет оставаться коду в изначальном положении. :о/ Будет проще, если вы скопируете его в GameMaker-ский редактор (кто ещё не догадался).

Теперь займёмся DRAW. Оговорюсь: кадры и изображение - одно и то же здесь и выше.

// МОДУЛЬ DRAW старт.

if control=true //если есть контроль то вычисляем направление движения:

{

if x

if x>xprevious {direct=d_right;} // обратно

//спрашиваете: а если новая коорд.=старой? Отвечаю - остаёмся в том же направлении, но если вы хотите сделать например в стоячем положении поворот к игроку или другую чушь то ради Бога. Обычно делается.. как выше.

}

if jump=true //?есть прыжок:

{

//счётчик спрайтов прыжка. После кадра-22 идёт зависание на 23-м. Обычно такой продолжительности прыжки и даже падения редки, но даже если.. то это будет выглядеть лучше, чем циклическое дрыгание ногами.

if img_count_jump<=22 img_count_jump+=0.2*50/(cameras_num*room_speed) else img_count_jump=23;

//рисуем ноги в соответствии с направлением:

if direct=d_left draw_sprite(pl_jump_left,img_count_jump,x,y)

else draw_sprite(pl_jump_right,img_count_jump,x,y);

if reload=true //если идёт перезарядка

{ //счётчик кадров перезарядки и далее рисуем торс в перезарядке

//да! тут есть такая штука как cameras_num - это учёт количества камер - два игрока - сплитскрин, один - нормальный экран, но в двух камерах игрок обрабатывается дважды и всё, что в DRAW имеет привычку ускоряться в двое. Здесь это учтено...и скорость комнаты тоже, хотя она нужна только при отладке.

if img_count_reload<14 img_count_reload+=0.3*50/(cameras_num*room_speed)

//после прокрутки анимации перезарядки нужно сообщить о её окончании, добавить положенное количество патронов "pistol_shells_in_oboyma" и сделать небольшую паузу. В аларме-5: "if reload=false now_speed=run_speed;" - можно бегать!:

else

{

reload=false;

pistol_shells=pistol_shells_in_oboyma;

alarm[5]=room_speed/40;

}

//рисуем наконец:

if direct=d_left draw_sprite(pl_pistol_reload_l,img_count_reload,x,y);

if direct=d_right draw_sprite(pl_pistol_reload_r,img_count_reload,x,y);

} else //не перезарядка

if fire=true { //и к тому же имеем выстрел (главное логично)

//счётчик и всё такое что было выше

if img_count_fire<8 img_count_fire+=1*50/(cameras_num*room_speed) else img_count_fire=8;

if fire_dir=0 //гориз-но. направления и свой спрайт

if direct=d_left draw_sprite(pl_stay_l,img_count_fire,x,y) else

if direct=d_right draw_sprite(pl_stay_r,img_count_fire,x,y);

if fire_dir=1 //вверх стреляем

if direct=d_left draw_sprite(pl_stay_l_up,img_count_fire,x,y) else

if direct=d_right draw_sprite(pl_stay_r_up,img_count_fire,x,y);

if fire_dir=-1 //вниз

if direct=d_left draw_sprite(pl_stay_l_dn,img_count_fire,x,y) else

if direct=d_right draw_sprite(pl_stay_r_dn,img_count_fire,x,y);

} else //а если не стреляем (и заметьте - прыгаем)

{ //просто держим торс (и руки с ним) в нужном направлении

if fire_dir=0

if direct=d_left draw_sprite(pl_stay_l,0,x,y) else

if direct=d_right draw_sprite(pl_stay_r,0,x,y);

if fire_dir=1

if direct=d_left draw_sprite(pl_stay_l_up,0,x,y) else

if direct=d_right draw_sprite(pl_stay_r_up,0,x,y);

if fire_dir=-1

if direct=d_left draw_sprite(pl_stay_l_dn,0,x,y) else

if direct=d_right draw_sprite(pl_stay_r_dn,0,x,y);

}

}

else // Jump else //не прыгаем

{

// НОГИ:

//если скорость гориз.перемещения меньше или равна "шаговой" и мы твёрдо стоим на ногах

if abs(hspeed)<=walk_speed && vspeed=0 // знаете, что-то мне кажется странным присутствие здесь "vspeed=0", особенно учитывая в будущем применение лифта. Попробуйте-ка без него обойтись.

{ //вместо указателя направления я поставил то что его определяет (см. в начале draw)

// если не стоим на месте то рисуем ноги идущими

//и вот здесь уже используется обычный image_index для прокрутки кадров без изврата

if x

if x>xprevious {draw_sprite(pl_walk_right,-1,x,y);img_count_walk=6;}

//если стоим то рисуем ноги стоячими (какое-то слово дикое)...недвижимыми...о!

if x=xprevious && direct=d_left {draw_sprite(pl_stay_left,0,x,y);img_count_walk=1}

if x=xprevious && direct=d_right {draw_sprite(pl_stay_right,0,x,y);img_count_walk=1}

}

//если скорость больше "ходовой". Надо думать это бег.

if abs(hspeed)>walk_speed && vspeed=0 { //история с vspeed=0.

//в этих кадрах (12-19) мы разрешаем проиграть звук (для двух ног)

if (image_index>12 && image_index<19) || (image_index>0 && image_index<8) then step_snd_mark=1;

//а здесь мы его проиграем и скажем что уже сделали это

if ((image_index>9 && image_index<11) || (image_index>21 && image_index<23)) && step_snd_mark=1 then {sound_play(pl_step);step_snd_mark=0;}

//бег является нам спрайтом в полный рост, а все "ноги" и "торсы" отдыхают:

if x

if x>xprevious {draw_sprite(pl_run_right,-1,x,y);}

}

// НОГИ END //но "Jump else //не прыгаем" ещё продолжается

// перезарядка в прыжке та же что и на земле

if reload=true

{

if img_count_reload<14 img_count_reload+=0.3*50/(cameras_num*room_speed) else {reload=false;pistol_shells=pistol_shells_in_oboyma;alarm[5]=room_speed/40;}

if direct=d_left draw_sprite(pl_pistol_reload_l,img_count_reload,x,y);

if direct=d_right draw_sprite(pl_pistol_reload_r,img_count_reload,x,y);

} else // и выстрел тоже

if fire=true && abs(hspeed)<=walk_speed {

if img_count_fire<8 img_count_fire+=1*50/(gameplay.cameras_num*room_speed) else img_count_fire=8;

if fire_dir=0

if direct=d_left draw_sprite(pl_stay_l,img_count_fire,x,y) else

if direct=d_right draw_sprite(pl_stay_r,img_count_fire,x,y);

if fire_dir=1

if direct=d_left draw_sprite(pl_stay_l_up,img_count_fire,x,y) else

if direct=d_right draw_sprite(pl_stay_r_up,img_count_fire,x,y);

if fire_dir=-1

if direct=d_left draw_sprite(pl_stay_l_dn,img_count_fire,x,y) else

if direct=d_right draw_sprite(pl_stay_r_dn,img_count_fire,x,y);

}

else

if abs(hspeed)<=walk_speed

{

if fire_dir=0

if direct=d_left draw_sprite(pl_stay_l,0,x,y) else

if direct=d_right draw_sprite(pl_stay_r,0,x,y);

if fire_dir=1

if direct=d_left draw_sprite(pl_stay_l_up,0,x,y) else

if direct=d_right draw_sprite(pl_stay_r_up,0,x,y);

if fire_dir=-1

if direct=d_left draw_sprite(pl_stay_l_dn,0,x,y) else

if direct=d_right draw_sprite(pl_stay_r_dn,0,x,y);

}

}

//Дальше идёт отображение отладочной инфы. Я её "заземлил", т.к. уже отладил эти моменты.

/* draw_text(view_left,view_top,'Jump: ' +string(jump) + ' Gravity: ' +string(gravity) + ' Img_ind: ' +string(image_index) );

draw_text(view_left,view_top+15,'Shells: ' +string(pistol_shells) + ' Oboyma: ' +string(pistol_oboyma) );*/

/* draw_text(view_left,view_top+15,'inv_key_red: ' +string(inv_key_red));

draw_text(x-30,y-20,'v: ' +string(draw_getpixel(x,y)) );

// МОДУЛЬ DRAW закончен.

Неужели всё? Как говорил персонаж известного мультфильма: «Да!…То есть - нет!».

Это я просто накидал самое основное. Дальше я добавил ещё такие моменты:

– Когда персонаж натыкается на врага или пулю, то теряет контроль на секунду и ему придаётся обратная скорость, но он не поворачивается в сторону полёта и остаётся ощущение толчка J…ну вы меня поняли – полёт спиной назад.

– Вообщем то эту игру я ещё не доделал и есть много идей, но с персонажем мудрить довольно.

Категория: Уроки | Добавил: (17.12.2010) | Автор: Валерий Игоревичь Залит E
Просмотров: 789 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2021 |