Такс. Начнем по порядку. Где найти литературу для изучения с++ я писать не буду, есть google и специальные форумы. Непосредственно по теме:
1. Идем в исходники CryAction и смотрим как устроены ноды для работы с xml документами. (FlowXmlDataNodes.cpp, FlowXmlFileNodes.cpp, FlowXmlNavNodes.cpp)
2. Пишем свой класс для работы с xml. Делаем геттеры и сеттеры. Примерно так :
|
Код
|
1
2
3
4
5
6
7
8
9
10
11
|
/*Getters*/
float GetFloat(const char * entityName,const char * valueName);
int GetInt(const char * entityName,const char * valueName);
string GetString(const char * entityName,const char * valueName);
bool GetBool(const char * entityName,const char * valueName);
/*Setters*/
void SetFloat(const char * entityName,const char * valueName , float value);
void SetInt(const char * entityName, const char * valueName , int value);
void SetString(const char * entityName,const char * valueName , string value);
void SetBool(const char * entityName,const char * valueName , bool value);
|
3. Настраиваем игровые объекты для работы с нашим классом. Т.е. возьмем за пример любую сущность. В моём случае это моя личная сущность "Network building". У каждого игрового объекта (сущности) имеется виртуальная функция NetSerialize() используем её для сохранения параметров в файл. Примерно так:
|
Код
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
bool CNetworkBuilding::NetSerialize( TSerialize ser, EEntityAspects aspect, uint8 profile, int pflags )
{
if (aspect == POSITION_ASPECT)
{
if(gEnv->bServer && !gEnv->IsEditor()) // ИСПОЛЬЗУЕМ ТОЛЬКО НА СЕРВЕРЕ!
{
int cur_state = (int)m_state;
ws->SetInt(entity_name,"BuildStatus",build_status); // Тут собственно используем наш класс и записываем данные в файл.
ws->SetInt(entity_name,"EntityState",cur_state);
}
EState newState = m_state;
ser.EnumValue("cur_state", newState, eState_NotUsed, eState_Done);
ser.Value( "build_status", build_status);
if (ser.IsReading())
{
//CryLog("CNetworkBuilding::NetSerialize reading !!!");
m_state = newState;
Building(build_status);
}
}
return true;
}
|
где ws указатель на наш чудо класс.
Суть кода - при изменении состояния объекта сервер будет записывать данные о нем в файл и считывать данные при загрузке.
Для того чтобы код работал при изменении состояния объекта необходимо вызвать макрос
|
Код
|
1
2
|
if (gEnv->bServer)
CHANGED_NETWORK_STATE(this, POSITION_ASPECT);
|
Как то так...Надеюсь более или менее понятно, что к чему...
Советую всё же для начала изучить язык, поковырять код движка, немного освоится, прежде чем лезть в самые дебри. Удачи