Dear visitor, welcome to CRYMOD.NET - Портал сообщества CryENGINE.
If this is your first visit here, please read the Help. It explains in detail how this page works.
To use all features of this page, you should consider registering.
Please use the registration form, to register here or read more information about the registration process.
If you are already registered, please login here.
Сегодня первая часть по программингу системы развития персонажа!
Смысл системы в том что бы добавить возможность изменять параметры игрока в СЕ3. Но, вы можете на свое усмотрение изменять любые игровые параметры/структуры. Урок рассчитан для людей, который уже знакомы хотя бы с основами С++ и СЕ2/СЕ3. Я использую VS2012, но вполне подойдет и 2010. Данный код был написан под 3.4.3. Работа с другими версиями не гарантируется.
Так же советую сделать backup папки Code(а то вдруг накосячите).
Начнем
Для начала откройте проект GameDLL и создайте там свою папку, в которой вы будете собирать все ваши .cpp и .h файлы. Создайте одноименные срр и h файлы. В cpp будет реализовываться функционал, в h файле различные объявления. И так начнем.
Я уже определился, каким будет класс и как он будет функционировать.
1)Пока что я попробую поработать с хп гг.
2)С каждым левелом хп будет увеличиваться исходя из текущего, с учетом коэффициента.
3) Опыт будет начисляться при убийстве других персонажей, выполнение квестов и при продвижении сюжетной линии.
4) С каждым уровнем набить лвл будет сложнее, например на 2-ой лвл нужно убить 2 врага, на 10 – 20 врагов. То, сколько опыта нужно на конкретный лвл будет рассчитываться тоже исходя из текущего лвла и коэффициента.
...
Для осуществления задуманного я буду использовать классы(логично). Из методов я буду использовать: конструктор, гетеры(Get – получать) получения текущего уровня игрока, опыта. Гетер возвращающий опыт игрока, и гетер коэффициента уровня. Дальше, сетеры(Set – установить): сетер опыта, сетер уровня игрока.
Оставшиеся функции это: сериализация данных(сохранение), проверка «А не поднялся ли уровень?» и простое поднятие уровня. В принципе последняя не обязательно, её стоит написать лишь для того что бы потом сделать из неё фг нод.
По поводу переменных в классе
1. Текущий уровень игрока
2. Опыт, который необходимо набрать для достижения лвла
3. Текущий опыт
4. Коэффициенты для опыта и хп.
5. Айди игрока, и 1 bool
Определяем класс
Вот так выглядит класс
(PS. Выкладываю скриншотами т.к. хочу что бы вы лично сами набрали этот код и попытались понять что как и зачем)
Click here for further information
Немного по функциям.
GetLevel() - "ВзятьУровень", можно легко догадаться, что функция вернет значение поля CurLevel (int), которое отвечает за текущий уровень игрока.
GetExp() – "ВзятьОпыт" – возвращает значение поля CurExp(Cur – current), отвечающее за текущий опыт игрока.
DetermineExp() - В данной функции я буду определить необходимое количество опыта для поднятия уровня.
GetKForlvl(int cl); - Функция возвращает коэф. в зависимости от уровня игрока, т.е. принимает значение уровня, и в зависимости от него возвращает значение.
SetExp(int exp, bool add) – функция устанавливает или добавляет опыт игроку в зависимости от того чему равен add(true/false), exp – количество опыта для установки/добавления.
SetLevel(int lvl) - собственно "УстановитьУровень". Функция принимает значение уровня, который нужно установить.
UpLevel() - "ПодняУровень" функция просто увеличивает уровень игрока и обнуляет текущий опыт.
CheckLvl() – Проверка на поднятие уровня, данная функция будет вызываться каждый раз, когда идет добавление/изменения опыта игрока.
Деструктор по желанию.
int KForLevel;
int KForExp;
это есть коэффициенты для хп и опыта.
Так же нам понадобится структура, в которой будут храниться параметры игрока, но об этом попозже.
И так. Директивы препроцессора:
Click here for further information
Конструктор и деструктор:
Click here for further information
Инициализация статических переменных:
Click here for further information
Гетеры(Формулу расчета можете использовать любую, эта не самая удачная..):
Click here for further information
Сетеры:
Click here for further information
Начинка(ням-ням):
По поводу CParamsChanger это независимый класс, в котором и происходит изменение параметров игрока. Его исходник я дам чуть ниже, а пока можете закомментировать эти строчки.
Click here for further information
Итого
Предоставленного материала вполне достаточно, что бы хоть немного да въехать в суть кодинга движка. Если вы до сих пор не понимаете ООП и все что с ним связано, то советую разбираться на месте. Открывайте книгу по с++ или гуглите ключевые слова.
А чуть не забыл!
Открываем Actor.h и в самом конце, перед }; вписываем:
CCharacterDevelopmentSystem CharDevSys;
Так же не забудьте подключить хэдер файл(.h) в самом верху, где идут все инклюды(#include)
…
#include "GrabHandler.h"
#include "WeaponAttachmentManager.h"
#include "AutoEnum.h"
#include"Progress.h" – Это наш файл, который нужно подключить. В нем описан класс развития персонажа(у меня это CCharracterDevelopmentSystem).
Дальше. Открываем Actor.cpp и ищем там функцию NetKill(…)
И сразу после открытия тела функции вписываем это:
Click here for further information
Первая часть закончена. Можете компилировать проект и пробовать.
Вторая часть
Продолжаем писать нашу систему! В этой части я расскажу про сам способ изменения параметров игрока и в кратце объясню некоторые строки кода.
Создаем новый срр и хэдер файл и формируем 2 новых класса(хотя один из них можно описать как структуру)
И так – ParamsChanger.h
Click here for further information
CPlayerParams это структура(у меня класс), которая хранит параметры игрока. На данный момент класс не дописан: нету сериализации данных и кое чего ещё . В поле Health будет хранится МАКСИМАЛЬНОЕ значение уровня здоровья.
CParamsChanger это класс, который понадобится нам для работы с параметрами игрока. Наследует CPlayer.
Опишу функции.
Деструктор. По желанию. Я написал, вдруг потом понадобится.
GetCurrentParams() – функция возвращает указатель на CPlayerParams(я планирую им возвращать sPlayerParam)
SetHealth() – Ну тут все понятно. Изменяет состояние поля Health в sPlayerParam
ChangeParams() – Функция, в которой происходит изменение параметров игрока.
GetPlayerParams() – Функция служит для получения исходных параметров игрока.
Сериализация(сохранение).
sPlayerParams – это объект того класса, который был описан выше.
Далее инициализируем статик поле Health класса CPlayerParams
int CPlayerParams::Health = 100;
Далее Гетер параметров:
Click here for further information
Изменение Health:
Click here for further information
Начинка. Прокомментирую этот участок кода. Здесь мы получаем указатель на игрока(*player) => объект заполнен данными и мы можем преступать работать с ними.
Функция SetMaxHealth(…) устанавливает значение максимального здоровья игрока.
Click here for further information
Получение параметров игрока:
Click here for further information
Сериализация(сохранение данных)
Click here for further information
Заключение
Ну-с, вроде как все. Каркас готов, далее можете развивать систему по своему усмотрению.
Лично у меня в планах дописать такие параметры как сила, ловкость, выносливость, мана.
Надеюсь, этой статьёй я придам вам желание пробовать программировать движок, и изучать его самостоятельно.
Не так давно я так же ничего не смысли в программирование движка, пока не появилась реальная нужда начать это делать. Дерзайте!
Так же хотелось бы выразить огромное спасибо Alex626 за некоторую помощь.
Если вам понравилась статья, то вы можете поддержать автора для того, что бы он продолжал писать подобные тутриалы.
WebMoney - R420064269055, Z384037033845
Использовании материала данной статьи на сторонних ресурсах разрешается только с согласием автора(R-jay)
Статья супер. Молодец, что написал ее.
Я правда пока не изучаю программирование С++. У меня сейчас моделирование.
Но потом у меня есть желание изучить С++. И мне может помочь данная статья.
А про скриншоты, правильно сделал. Копирую - ничего не поймешь. Надо все, каждый символ набирать(набирая со скриншота, уже запомнится что то в уме).
Я сам когда Visual Basic изучал, все сам, каждую команду, каждый класс набирал, и смотрел(читал) что они означают. И понял.
Я попробую на основе этой статьи изучить С++ и сделать другие характеристики.
но это будет попозже.
Надо изучать С++, вдруг может пригодится когда-нибудь.
Все равно молодец , хорошая статья и правильно сделана.
Хоть наверно тупо "копипаста" не будет. Все ручками.
RJAY, а ты уверен, что в твоём примере работает сериализация?
На 100% не уверен, но в двиге сохранялся, потом загружался, были баги с юи, но после получения лвла все ок было, то есть добавлялся следующий лвл(был 7 после загрузки стал