Вы не вошли.

Уважаемый гость, добро пожаловать на форум: CRYMOD.NET - Портал сообщества CryENGINE. Если вы здесь впервые, то, пожалуйста, прочитайте раздел Помощь. В этом разделе можно подробно ознакомится с функционалом данной системы. Что бы использовать все возможности системы, необходимо зарегистрироваться. Для этого пройдите по ссылке и узнайте подробнее о процессе регистрации. В случае если вы уже зарегистрировались – войдите под своей учётной записью.

RJAY

Стажер

  • "RJAY" мужчина
  • "RJAY" создал эту тему

Сообщений: 260

Место жительства: Минск

Профессия: 3D художнк, программист

1

Суббота, 30 Март 2013, 14:05

Программирование системы развития персонажа




Введение

Сегодня первая часть по программингу системы развития персонажа!
Смысл системы в том что бы добавить возможность изменять параметры игрока в СЕ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. Выкладываю скриншотами т.к. хочу что бы вы лично сами набрали этот код и попытались понять что как и зачем)

Нажмите сюда, чтобы узнать больше



Немного по функциям.

  1. GetLevel() - "ВзятьУровень", можно легко догадаться, что функция вернет значение поля CurLevel (int), которое отвечает за текущий уровень игрока.
  2. GetExp() – "ВзятьОпыт" – возвращает значение поля CurExp(Cur – current), отвечающее за текущий опыт игрока.
  3. DetermineExp() - В данной функции я буду определить необходимое количество опыта для поднятия уровня.
  4. GetKForlvl(int cl); - Функция возвращает коэф. в зависимости от уровня игрока, т.е. принимает значение уровня, и в зависимости от него возвращает значение.
  5. SetExp(int exp, bool add) – функция устанавливает или добавляет опыт игроку в зависимости от того чему равен add(true/false), exp – количество опыта для установки/добавления.
  6. SetLevel(int lvl) - собственно "УстановитьУровень". Функция принимает значение уровня, который нужно установить.
  7. UpLevel() - "ПодняУровень" функция просто увеличивает уровень игрока и обнуляет текущий опыт.
  8. CheckLvl() – Проверка на поднятие уровня, данная функция будет вызываться каждый раз, когда идет добавление/изменения опыта игрока.
Деструктор по желанию.

int KForLevel;
int KForExp;
это есть коэффициенты для хп и опыта.

Так же нам понадобится структура, в которой будут храниться параметры игрока, но об этом попозже.
И так. Директивы препроцессора:

Нажмите сюда, чтобы узнать больше


Конструктор и деструктор:

Нажмите сюда, чтобы узнать больше


Инициализация статических переменных:

Нажмите сюда, чтобы узнать больше


Гетеры(Формулу расчета можете использовать любую, эта не самая удачная..):

Нажмите сюда, чтобы узнать больше


Сетеры:

Нажмите сюда, чтобы узнать больше


Начинка(ням-ням):

По поводу CParamsChanger это независимый класс, в котором и происходит изменение параметров игрока. Его исходник я дам чуть ниже, а пока можете закомментировать эти строчки.
Нажмите сюда, чтобы узнать больше


Итого

Предоставленного материала вполне достаточно, что бы хоть немного да въехать в суть кодинга движка. Если вы до сих пор не понимаете ООП и все что с ним связано, то советую разбираться на месте. Открывайте книгу по с++ или гуглите ключевые слова.

А чуть не забыл!

Открываем Actor.h и в самом конце, перед }; вписываем:
CCharacterDevelopmentSystem CharDevSys;
Так же не забудьте подключить хэдер файл(.h) в самом верху, где идут все инклюды(#include)

#include "GrabHandler.h"
#include "WeaponAttachmentManager.h"
#include "AutoEnum.h"
#include"Progress.h" – Это наш файл, который нужно подключить. В нем описан класс развития персонажа(у меня это CCharracterDevelopmentSystem).

Дальше. Открываем Actor.cpp и ищем там функцию NetKill(…)

И сразу после открытия тела функции вписываем это:

Нажмите сюда, чтобы узнать больше


Первая часть закончена. Можете компилировать проект и пробовать.


Вторая часть

Продолжаем писать нашу систему! В этой части я расскажу про сам способ изменения параметров игрока и в кратце объясню некоторые строки кода.

Создаем новый срр и хэдер файл и формируем 2 новых класса(хотя один из них можно описать как структуру)
И так – ParamsChanger.h

Нажмите сюда, чтобы узнать больше



CPlayerParams это структура(у меня класс), которая хранит параметры игрока. На данный момент класс не дописан: нету сериализации данных и кое чего ещё :). В поле Health будет хранится МАКСИМАЛЬНОЕ значение уровня здоровья.

CParamsChanger это класс, который понадобится нам для работы с параметрами игрока. Наследует CPlayer.

Опишу функции.
  1. Деструктор. По желанию. Я написал, вдруг потом понадобится.
  2. GetCurrentParams() – функция возвращает указатель на CPlayerParams(я планирую им возвращать sPlayerParam)
  3. SetHealth() – Ну тут все понятно. Изменяет состояние поля Health в sPlayerParam
  4. ChangeParams() – Функция, в которой происходит изменение параметров игрока.
  5. GetPlayerParams() – Функция служит для получения исходных параметров игрока.
  6. Сериализация(сохранение).

sPlayerParams – это объект того класса, который был описан выше.


И так заходим в срр и подключаем следующие файлы:

#include "StdAfx.h"
#include "ParamsChanger.h"
#include "Actor.h"
#include "Player.h"

Далее инициализируем статик поле Health класса CPlayerParams
int CPlayerParams::Health = 100;

Далее Гетер параметров:

Нажмите сюда, чтобы узнать больше


Изменение Health:

Нажмите сюда, чтобы узнать больше



Начинка. Прокомментирую этот участок кода. Здесь мы получаем указатель на игрока(*player) => объект заполнен данными и мы можем преступать работать с ними.
Функция SetMaxHealth(…) устанавливает значение максимального здоровья игрока.

Нажмите сюда, чтобы узнать больше


Получение параметров игрока:

Нажмите сюда, чтобы узнать больше


Сериализация(сохранение данных)

Нажмите сюда, чтобы узнать больше


Заключение

Ну-с, вроде как все. Каркас готов, далее можете развивать систему по своему усмотрению.
Лично у меня в планах дописать такие параметры как сила, ловкость, выносливость, мана.
Надеюсь, этой статьёй я придам вам желание пробовать программировать движок, и изучать его самостоятельно.
Не так давно я так же ничего не смысли в программирование движка, пока не появилась реальная нужда начать это делать. Дерзайте!
Так же хотелось бы выразить огромное спасибо Alex626 за некоторую помощь.


Если вам понравилась статья, то вы можете поддержать автора для того, что бы он продолжал писать подобные тутриалы.
WebMoney - R420064269055, Z384037033845


Использовании материала данной статьи на сторонних ресурсах разрешается только с согласием автора(R-jay)

Для ультраленивых код ниже
RJAY приложил следующий файл:
  • code.rar (2.22 kB - Скачано 306 раз - Последняя загрузка: 24 Июнь 2019, 09:50)
[Идея] Записки путешественника
Программирование системы развития персонажа.
У всех любовь, а у меня компилируется.
Цитата великих: ...или ты из ворда компилируешь?

Это сообщение было отредактировано 9 раз(а), последнее редактирование в "RJAY" (23 Январь 2014, 00:09)


Mototok

Хардкор моддер

  • "Mototok" мужчина

Сообщений: 809

Место жительства: ДОНЕЦКАЯ НАРОДНАЯ РЕСПУБЛИКА (ДНР)

Профессия: 3d-artist

2

Суббота, 30 Март 2013, 14:16

Лол, зачем создавать тему со скринами, а потом их в галерею пихать, где логика?

Sodiet

Модератор новостей

  • "Sodiet" мужчина

Сообщений: 424

Место жительства: Россия

3

Суббота, 30 Март 2013, 14:25

Потому что эти изображения хранятся не на стороннем сервере, а на портале Crymod.net.
RJAY, молодец! ;) Только оформи получше.

RJAY

Стажер

  • "RJAY" мужчина
  • "RJAY" создал эту тему

Сообщений: 260

Место жительства: Минск

Профессия: 3D художнк, программист

4

Суббота, 30 Март 2013, 14:30

Потому что эти изображения хранятся не на стороннем сервере, а на портале Crymod.net.
RJAY, молодец! ;) Только оформи получше.

С этим проблемы :whistling:
[Идея] Записки путешественника
Программирование системы развития персонажа.
У всех любовь, а у меня компилируется.
Цитата великих: ...или ты из ворда компилируешь?

5

Суббота, 30 Март 2013, 15:52

Огромное спасибо! Удачи тебе!

Alt vi venter på Ragnarok


6

Суббота, 30 Март 2013, 16:21

Статья супер. Молодец, что написал ее.
Я правда пока не изучаю программирование С++. У меня сейчас моделирование.

Но потом у меня есть желание изучить С++. И мне может помочь данная статья. 8)

А про скриншоты, правильно сделал. Копирую - ничего не поймешь. Надо все, каждый символ набирать(набирая со скриншота, уже запомнится что то в уме).
Я сам когда Visual Basic изучал, все сам, каждую команду, каждый класс набирал, и смотрел(читал) что они означают. И понял.

Всем удачи.

AndreyFilantrop

Супер Моддер

  • "AndreyFilantrop" мужчина

Сообщений: 1,902

Место жительства: Россия, Москва

Профессия: медицина

7

Суббота, 30 Март 2013, 19:56

О Великий Маниту, Повелитель Кода, эта система разрабатыватся для вашей игры? Помоему мастерство на Краймоде выросло за последнее время!
АУРАЯМА, AURAYAMA (Crydev.net)–мистический эзотерический шутер от первого лица
AndreyFilantrop портфолио на deviantART

8

Суббота, 30 Март 2013, 20:15

+1. Хорошая статья! Ей самое место на главной. Надо бы только баннер придумать 600х160.
Legacy of the Yods



d.salvator

Супер Моддер

  • "d.salvator" мужчина

Сообщений: 1,655

Место жительства: Belarus

Профессия: Инженер по АТПиП

9

Суббота, 30 Март 2013, 20:43

Отличная статья, земляк!
Мой скайп Евгений (d.salvator)

10

Суббота, 30 Март 2013, 21:40

Цитата

Надо бы только баннер придумать 600х160.

Нарисуем... :)

RJAY

Стажер

  • "RJAY" мужчина
  • "RJAY" создал эту тему

Сообщений: 260

Место жительства: Минск

Профессия: 3D художнк, программист

11

Воскресенье, 31 Март 2013, 22:52

Надеюсь эта статья поможет кому :)
[Идея] Записки путешественника
Программирование системы развития персонажа.
У всех любовь, а у меня компилируется.
Цитата великих: ...или ты из ворда компилируешь?

12

Понедельник, 1 Апрель 2013, 07:25

Я попробую на основе этой статьи изучить С++ и сделать другие характеристики.
но это будет попозже.

Надо изучать С++, вдруг может пригодится когда-нибудь.
Все равно молодец :thumbup: , хорошая статья и правильно сделана.
Хоть наверно тупо "копипаста" не будет. Все ручками. :D

13

Понедельник, 1 Апрель 2013, 11:11

Ну вот, теперь статья на главной.

P.S. За баннер спасибо участнику CryDimon и его команде.
Legacy of the Yods



c0Re™

Стажер

  • "c0Re™" мужчина

Сообщений: 288

Место жительства: Российская Федерация

Профессия: дизайнер, программист

14

Понедельник, 1 Апрель 2013, 11:15

Титаническое спасибо вот за такую статью! Это реально очень нужная информация!
По-моему, даже в самых жестких сценах порнофильма любви больше, чем в моей жизни.

15

Пятница, 5 Апрель 2013, 14:36

RJAY, а ты уверен, что в твоём примере работает сериализация?
Legacy of the Yods



RJAY

Стажер

  • "RJAY" мужчина
  • "RJAY" создал эту тему

Сообщений: 260

Место жительства: Минск

Профессия: 3D художнк, программист

16

Пятница, 5 Апрель 2013, 18:01

RJAY, а ты уверен, что в твоём примере работает сериализация?

На 100% не уверен, но в двиге сохранялся, потом загружался, были баги с юи, но после получения лвла все ок было, то есть добавлялся следующий лвл(был 7 после загрузки стал 8)
[Идея] Записки путешественника
Программирование системы развития персонажа.
У всех любовь, а у меня компилируется.
Цитата великих: ...или ты из ворда компилируешь?

17

Вторник, 7 Май 2013, 10:07

Шикарно!)Спасибо тебе огромное и удачи в следующих работах)

18

Вторник, 5 Ноябрь 2013, 17:14

Подскажите в чем проблема? В старых версия всё работало а теперь вот эти ошибки.
Ownage приложил следующее изображение:
  • Снимок.PNG

19

Вторник, 5 Ноябрь 2013, 17:15

Удали временные файлы. Компилируй на VS2010.
Legacy of the Yods



20

Вторник, 5 Ноябрь 2013, 18:22

Удали временные файлы. Компилируй на VS2010.

Удали временные файлы. Компилируй на VS2010.

Все таже ошибка не может какой-то файл object создать
Ownage приложил следующее изображение:
  • Снимок.PNG