Главная | Форум | Мой профиль | Выход | RSS
Меню сайта
Мини-чат
200
Наш опрос
Расширение спектра деятельности. Тоесть принимать и по возможности помогать не только Ultimate 3D
Всего ответов: 298
Кабинет

Поиск
Наши друзья
  • Официальный cайт U3D
  • Лучший сайт по GM
  • Сайт по геймдеву
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Реклама:

    Главная » Статьи » Теория

    Статья 3D_RPG

    Статья: “3D RPG”.
    Статья расчитана на новичка.Для начала я скажу что RPG бывает разное.Это может быть пошаговое RPG, on-line RPG, RPG в реальном времени и т.д. В этой статье я расскажу как можно сделать 3D RPG в реальном времени т.е. подразумеваеться что в ней можно будет просто бегать убивать врагов, получать за это опыт,после чего распределять очки и т.п. В этой статье я не буду рассказывать как сделать умный ИИ,квесты RPG с сюжетом и создовать мир. Я просто расскажу как реализовать параметры игрока, вывод их на экран,простую анимацию ГГ,распределение очков. 
    Чтобы начать скачайте вот этот архив(2.8 mb) в нём все необходимые текстуры и модели. 
    Итак начнём.
    Сперва в скрипт настроек Ultimate3DOptions добавьте такую строчку:

    global.u3d_character_set="АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЬьЫыЪъЩщЭэЮюЯяAaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789-_.?,!+-/*':%";


    Эта строчка нужна чтобы внесённые в неё символы отоброжались при использовании функции 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(keyboard_check(vk_left)){//если нажата кнопка влево
    with(gg){
    Move(rotx,roty+90,1);//движемся влево
    first_frame=annach[2];//Первый кадр анимации
    last_frame=ankon[2];//Последний кадр анимации
    frame=-0.5;// Скорость анимации
      }
    }
    if(keyboard_check(vk_right)){//если нажата кнопка вправо
    with(gg){
    Move(rotx,roty-90,1);//движемся вправо
    first_frame=annach[2];//Первый кадр анимации
    last_frame=ankon[2];//Последний кадр анимации
    frame=-0.5;// Скорость анимации
      }
    }
    if(keyboard_key=0)//если не нажата ниодна кнопка
    {
    with(gg){
    first_frame=0;//Первый кадр анимации
    last_frame=1;//Последний кадр анимации
    frame=0;// Текущий кадр 
    //Остановка анимации
    }
    }

    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 не так уж сложно.


    Вот скрин из статьи:
    Категория: Теория | Добавил: SHARKING (28.07.2009)
    Просмотров: 1980 | Комментарии: 7 | Рейтинг: 4.7/3
    Всего комментариев: 7
    6 Bedndarc  
    0
    Вопрос, а нужно ли создавать столько объектов? Собсна 1 объект может выполнять все стартовые задачи, включая создание переменных, применение параметров и т.д. А в целом статья удачная.

    7 ZXC76  
    0
    Можно и так... Просто кому-то так легче, или удобнее понять.

    5 Krasus  
    0
    здорово, надо будет разобраться.

    4 SHARKING  
    0
    Я доволен что мои труды оценили )))

    3 HaPuK  
    0
    Очень хорошая статья.!!!!
    Надо только модули по интереснее))

    2 ZXC76  
    0
    Отлично!!!!!! И всё подписано комментариями! И много.
    Хорошая и полезная статья кстати…

    1 SHARKING  
    0
    Напишите свои коменты

    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]

    Школа Ultimate3D 2009-2010 год