You are not logged in.

RJAY

Стажер

  • "RJAY" is male
  • "RJAY" started this thread

Posts: 253

Location: Минск

Occupation: 3D художнк, программист

1

Saturday, March 30th 2013, 2:05pm

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




Введение

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



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

  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;
это есть коэффициенты для хп и опыта.

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

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.

Опишу функции.
  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;

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

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)

Для ультраленивых код ниже
RJAY has attached the following file:
  • code.rar (2.22 kB - 401 times downloaded - latest: May 28th 2024, 12:26pm)
[Идея] Записки путешественника
Программирование системы развития персонажа.
У всех любовь, а у меня компилируется.
Цитата великих: ...или ты из ворда компилируешь?

This post has been edited 9 times, last edit by "RJAY" (Jan 23rd 2014, 12:09am)


Mototok

Искусный моддер

  • "Mototok" is male

Posts: 697

Location: ДОНЕЦКАЯ НАРОДНАЯ РЕСПУБЛИКА (ДНР)

Occupation: 3d-artist

2

Saturday, March 30th 2013, 2:16pm

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

Sodiet

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

  • "Sodiet" is male

Posts: 356

Location: Россия

3

Saturday, March 30th 2013, 2:25pm

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

RJAY

Стажер

  • "RJAY" is male
  • "RJAY" started this thread

Posts: 253

Location: Минск

Occupation: 3D художнк, программист

4

Saturday, March 30th 2013, 2:30pm

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

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

zoragon

Trainee

  • "zoragon" is male

Posts: 177

Location: Москва

5

Saturday, March 30th 2013, 3:52pm

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

Alt vi venter på Ragnarok


a1exei19

Искусный моддер

6

Saturday, March 30th 2013, 4:21pm

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

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

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

Всем удачи.

AndreyFilantrop

Супер Моддер

  • "AndreyFilantrop" is male

Posts: 1,704

Location: Россия, Москва

Occupation: медицина

7

Saturday, March 30th 2013, 7:56pm

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

Alex626

admin

  • "Alex626" is male

Posts: 10,482

Location: Земля

8

Saturday, March 30th 2013, 8:15pm

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

d.salvator

Супер Моддер

  • "d.salvator" is male

Posts: 1,562

Location: Belarus

Occupation: Инженер по АТПиП

9

Saturday, March 30th 2013, 8:43pm

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

10

Saturday, March 30th 2013, 9:40pm

Quoted

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

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

RJAY

Стажер

  • "RJAY" is male
  • "RJAY" started this thread

Posts: 253

Location: Минск

Occupation: 3D художнк, программист

11

Sunday, March 31st 2013, 10:52pm

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

a1exei19

Искусный моддер

12

Monday, April 1st 2013, 7:25am

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

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

Alex626

admin

  • "Alex626" is male

Posts: 10,482

Location: Земля

13

Monday, April 1st 2013, 11:11am

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

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

c0Re™

Стажер

  • "c0Re™" is male

Posts: 280

Location: Российская Федерация

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

14

Monday, April 1st 2013, 11:15am

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

Alex626

admin

  • "Alex626" is male

Posts: 10,482

Location: Земля

15

Friday, April 5th 2013, 2:36pm

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

RJAY

Стажер

  • "RJAY" is male
  • "RJAY" started this thread

Posts: 253

Location: Минск

Occupation: 3D художнк, программист

16

Friday, April 5th 2013, 6:01pm

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

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

17

Tuesday, May 7th 2013, 10:07am

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

18

Tuesday, November 5th 2013, 5:14pm

Подскажите в чем проблема? В старых версия всё работало а теперь вот эти ошибки.
Ownage has attached the following image:
  • Снимок.PNG

Alex626

admin

  • "Alex626" is male

Posts: 10,482

Location: Земля

19

Tuesday, November 5th 2013, 5:15pm

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

20

Tuesday, November 5th 2013, 6:22pm

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

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

Все таже ошибка не может какой-то файл object создать
Ownage has attached the following image:
  • Снимок.PNG