Статья: “3D RPG”. Статья расчитана на новичка.Для начала я скажу что RPG бывает разное.Это может быть пошаговое RPG, on-line RPG, RPG в реальном времени и т.д. В этой статье я расскажу как можно сделать 3D RPG в реальном времени т.е. подразумеваеться что в ней можно будет просто бегать убивать врагов, получать за это опыт,после чего распределять очки и т.п. В этой статье я не буду рассказывать как сделать умный ИИ,квесты RPG с сюжетом и создовать мир. Я просто расскажу как реализовать параметры игрока, вывод их на экран,простую анимацию ГГ,распределение очков. Чтобы начать скачайте вот этот архив(2.8 mb) в нём все необходимые текстуры и модели. Итак начнём. Сперва в скрипт настроек Ultimate3DOptions добавьте такую строчку:
Эта строчка нужна чтобы внесённые в неё символы отоброжались при использовании функции DrawText.В нашем случае она нужна для отображения русского языка.Такая возможность появилась только в ULTIMATE 3D 2.1 так что при создании RPG используйте именно эту версию ULTIMATE 3D. Далее создаём объекты:
param-в этом объекте буду записаны все характеристики игрока. anim-в этом объекте мы запишем кадры анимации персонажа.
Далее добавим в событие создания param следующий скрипт:
globalvar ataka,zazhita,lovkost,zhiznvs,zhiznos,opit,level,ochki; //Делаем параметры персонажа глобальными ataka=10;//Сила атаки нашего персонажа zazhita=8;//Защита нашего персонажа lovkost=7;//Ловкость нашего персонажа zhiznvs=50;//Сколько всего жизней у нашего персонажа zhiznos=50;//Сколько жизней в данный момент opit=0;//Сколько опыта в данный момент level=1;//Уровень нашего персонажа ochki=0;//Сколько в данный момент очков распределения
Далее добавим в событие создания anim следующий скрипт: globalvar annach,ankon; //Делаем кадры анимации глобальными annach[0]=0;//начальный кадр анимации(атака мечём) ankon[0]=30;//конечный кадр анимации(атака мечём) annach[1]=90;//начальный кадр анимации(атака кулаком) ankon[1]=115;//конечный кадр анимации(атака кулаком) annach[2]=370;//начальный кадр анимации(бег) ankon[2]=395;//конечный кадр анимации(бег) //Это всё кадры анимации модели robot.3ds
Тепер поставим оба объекта(anim,param) в комнату чтобы потом не забыть))) Далее в событие создания model изменим переменную file которая там уже есть на значение 'model\robot.3ds'.Это требуеться чтобы загрузилась модель робота. Теперь в событии создания робота(model) добавьте следующий скрипт:
first_frame=0;//Первый кадр анимации last_frame=1;//Последний кадр анимации frame=0;/* Текущий кадр при отрецательном значении скорость анимации */ scalx=0.1;//Уменьшение размера модели так как модель получилась scaly=0.1;//Слишком большая scalz=0.1;
Это требуеться чтобы анимация модели была в кадре 0(это кадр стоячей моделии) и модель была оптимального размера. Далее создаём объект terrain -это ландшафт(описывать его создание не буду так как это уже описанно в двух статьях) и поставим его в комнату. Далее в событие шага model добавляем следующий скрипт:
z=GetTerrainHeightAtPos(terrain,x,y); //Это требуеться чтоб герой не провалился под землю
В событии шага камеры(camera):
follow=gg;//Камера будет двигаться за героем perspective=2;//Камера будет динамическая distance=20;//Расстояние от камеры до героя rotatey=180;//Чтоб камера смотрела сзади модели т.к модель не стандартная GetMousePos(); rotatex+=(global.mouse_y-display_get_height()/2)*mouse_speed; if(rotatex<0){ rotatex=1; } if(rotatex>20){ rotatex=20; } gg.roty+=(global.mouse_x-display_get_width()/2)*mouse_speed; //это чтобы вертеть главного героя SetMousePos(display_get_width()/2,display_get_height()/2); //Это чтобы камерой двигать
z=GetTerrainHeightAtPos(terrain,x,y)+5;/*Это чтобы камера под землю не провалилась*/
if(keyboard_check(vk_up)){//если нажата кнопка вверх with(gg){ Move(rotx,roty+180,1);//движемся туда куда смотрит герой //+180 всё из-за того что модель нестандартная //и если не поставить +180 робот пойдёт задом first_frame=annach[2];//Первый кадр анимации last_frame=ankon[2];//Последний кадр анимации frame=-0.5;// Скорость анимации } }
if(keyboard_check(vk_down)){//если нажата кнопка вниз with(gg){ Move(rotx,roty,1);//движемся назад first_frame=annach[2];//Первый кадр анимации last_frame=ankon[2];//Последний кадр анимации frame=-0.5;// Скорость анимации } }
if (MouseCheckButton(mb_left))//Если нажата левая кнопка мыши { with(gg){ first_frame=annach[0];//Первый кадр анимации last_frame=ankon[0];//Последний кадр анимации frame=-0.5;// Скорость анимации kadr=GetCurrentFrame();//Узнаём какой кадр сейчас проигрываеться if (collision_point(x,y,vrag,true,false))and(kadr=ceil((ankon[0]-annach[0])/2+annach[0])) //Проверяем столкновение с врагом и кадр анимации //Это надо чтобы удар происходил в центре анимации { vzhiznos-=ataka*2;//Уменьшаем жизни врага на атака*2 //Здесь еще можно сделать анимацию врага show_message("Выбил "+string(ataka*2));//это сообщение рекомендуеться убрать в своей //игре оно для того чтобы было понятно что вы попали по врагу } } }
if (MouseCheckButton(mb_right))//Если нажата правая кнопка мыши { with(gg){ first_frame=annach[1];//Первый кадр анимации last_frame=ankon[1];//Последний кадр анимации frame=-0.5;// Скорость анимации kadr=GetCurrentFrame();//Узнаём какой кадр сейчас проигрываеться if (collision_point(x,y,vrag,true,false))and(kadr=ceil((ankon[1]-annach[1])/2+annach[1])) //Проверяем столкновение с врагом и кадр анимации //Это надо чтобы удар происходил в центре анимации { vzhiznos-=ataka;//Уменьшаем жизни врага на атака //Здесь еще можно сделать анимацию врага show_message("Выбил "+string(ataka));//это сообщение рекомендуеться убрать в своей //игре оно для того чтобы было понятно что вы попали по врагу } } }
if (vzhiznos<1)//если у врага кончились жизни { opit+=120;//Повышаем опыт.Для игры ставьте значение поменьше //для того чтоб игрок не сразу получал уровень with(vrag) instance_destroy();//удаляем врага vzhiznos=30;//Повышаем жизни обратно }
if (opit>99)//Если опыта больше 99 { ochki+=5;//Увеличиваем очки на 5 opit=0;//Обнуляем опыт level+=1;//Увеличиваем уровень }
Создайте объект sozdatel он будет создавать героя и врага. В событии создания sozdatel:
globalvar gg,vrag; gg=instance_create(176,172,model);//создание героя vrag=instance_create(250,279,model);//создание врага
Теперь нужно создать ГУИ который будет показывать характеристики игрока.Для этого создайте объект gui. В событие Draw(рисование) объекта gui добавьте следующий код: DrawText(0,0,0,"АТАКА:"+string(ataka));//Рисуем атаку DrawText(0,0,20,"ЗАЩИТА:"+string(zazhita));//Рисуем защиту DrawText(0,0,40,"ЛОВКОСТЬ:"+string(lovkost));//Рисуем ловкость DrawText(0,0,60,"ОПЫТ:"+string(opit));//Рисуем опыт DrawText(0,0,80,"УРОВЕНЬ:"+string(level));//Рисуем уровень DrawText(0,0,100,"ОЧКИ:"+string(ochki));//Рисуем количество очков DrawText(0,0,120,"ЖИЗНИ:"+string(zhiznos)+"/"+string(zhiznvs));//Рисуем жизни
Далее поместите gui в комнату.Теперь нам требуеться создать объект plus. Этот объект и будет распределять очки.После создания сразу снимите галачку "видимый" и поместите plus в комнату. Теперь в событие шага(step) объекта plus поместите следующий код:
if ochki>0 then visible=true else visible=false; //Это чтобы распределение очков появлялось только если есть что распределять
Далее в событие рисования(Draw) объекта plus следующий код:
//Рисуем эту самую информацию DrawText(0,130,0,"Чтобы улучшить атаку нажмите 1"); DrawText(0,130,20,"Чтобы улучшить защиту нажмите 2"); DrawText(0,130,40,"Чтобы улучшить ловкость нажмите 3"); DrawText(0,130,120,"Чтобы улучшить жизни нажмите 4");
Осталось сделать последнее.Это добавить четыре события отпускания клавиши для объекта plus. В событие отпускания клавиши 1(release 1-key):
if (ochki>0)//если очков больше нуля { ataka+=1;//Увеличиваем на 1 атаку ochki-=1;//Уменьшаем на 1 очки }
В событие отпускания клавиши 2(release 2-key):
if (ochki>0)//если очков больше нуля { zazhita+=1;//Увеличиваем на 1 защиту ochki-=1;//Уменьшаем на 1 очки }
В событие отпускания клавиши 3(release 3-key):
if (ochki>0)//если очков больше нуля { lovkost+=1;//Увеличиваем на 1 ловкость ochki-=1;//Уменьшаем на 1 очки }
В событие отпускания клавиши 4(release 4-key):
if (ochki>0)//если очков больше нуля { zhiznvs+=10;//Увеличиваем на 10 жизни(всего) zhiznos+=10;//Увеличиваем на 10 жизни(осталось) ochki-=1;//Уменьшаем на 1 очки }
Вот и всё простой примерчик 3D RPG готов.Для нормальной игры вам потребуеться добавить множество врагов,характеристик и т.д. Я вам продемонстрировал что создать RPG не так уж сложно.
Вопрос, а нужно ли создавать столько объектов? Собсна 1 объект может выполнять все стартовые задачи, включая создание переменных, применение параметров и т.д. А в целом статья удачная.