Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming / GameProg / RPG_Programming_2ed.pdf
Скачиваний:
240
Добавлен:
12.02.2016
Размер:
12.06 Mб
Скачать

Джим Адамс

Последний аргумент в списке, AddTime, применяется для добавления

дополнительных миллисекунд к таймеру действия. Задание для AddTime значения –1 заставляет SetAction не использовать таймер действия, а это

значит, что действие будет очищено при следующем обновлении.

Использование sCharacterController

Вы получили множество функций в классе cCharacterController, и хотя вы уже прочитали об их функциональности, трудно представить, что же каждая из них делает. Возможно, поможет пример.

Начнем с установки сеток и информации об анимации для сетки каждого персонажа. Данный пример использует две сетки:

char *g_CharMeshNames[] = {

 

Сетка #

0

{ "..\\Data\\Warrior.x" }, //

{ "..\\Data\\Yodan.x" }

//

Сетка #

1

};

 

 

 

Каждая сетка содержит список анимаций, представляющих действия, которые может выполнять каждый персонаж. Каждая анимация действия в двух сетках совместно использует одни и те же имена анимационных

наборов. Вы отображаете эти имена, используя структуру sCharAnimationInfo (которая хранит имя анимации в файле .X, а также

флаг, определяющий, зациклена ли анимация) следующим образом:

ВНИМАНИЕ!

Заметьте, что в структурах данных анимации я повторно

 

использовал некоторые анимации, что исключительно

 

здорово. Просто убедитесь, что вы не устанавливаете

 

флаг зацикливания анимации в

TRUE,

если позже

 

устанавливаете флаг зацикливания в FALSE, иначе все не

 

будет работать. То же самое применимо, когда вы сперва

 

устанавливаете для другого действия флаг зацикливания в

 

FALSE, а позже устанавливаете его в TRUE.

 

 

Например, следующий фрагмент кода правильный:

 

sCharAnimationInfo Anims[] = {

 

 

 

{ "Idle", TRUE }, { "Walk", FALSE }

 

 

};

 

 

 

В то время как следующий фрагмент

не работает

(поскольку вы меняете флаг зацикливания у одной и той же используемой анимации):

sCharAnimationInfo Anims[] = {

{ "Idle", TRUE }, { "Idle", FALSE }

};

sCharAnimationInfo

g_CharAnimations[] = {

{

"Idle",

TRUE

},

//

Действие CHAR_IDLE

{

"Walk",

TRUE

},

//

Действие CHAR_MOVE

{"Swing", FALSE }, // Действие CHAR_ATTACK

{"Spell", FALSE }, // Действие CHAR_SPELL

{"Swing", FALSE }, // Действие CHAR_ITEM

{"Hurt", FALSE }, // Действие CHAR_HURT

netlib.narod.ru

603

Глава 12. Управление игроками и персонажами

{

"Die", FALSE

},

//

Действие

CHAR_DIE

{

"Idle", TRUE

}

//

Действие

CHAR_TALK

};

Теперь, когда вы определили, какие сетки используются и как их анимировать, вы можете инициализировать контроллер персонажей и начать добавлять персонажи:

//Graphics = ранее инициализированный объект cGraphics

//Font = ранее инициализированный объект шрифта

//MIL = массив главного списка предметов (sItem MIL[1024])

//SpellController = ранее созданный контроллер заклинаний

cCharacterController Controller;

// Инициализация контроллера

Controller.Init(&Graphics, &Font, "..\\Data\\Default.mcl", (sItem*)&MIL, SpellController.GetSpell(0), sizeof(g_CharMeshNames)/sizeof(char*), g_CharMeshNames, "..\\Data\\", "..\\Data\\",

sizeof(g_CharAnimations) / sizeof(sCharAnimationInfo), (sCharAnimationInfo*)&g_CharAnimations, &SpellController);

//Добавляем NPC (определение в MCL #0), который бродит

//внутри области от -256,0,-256 до 256,0,256

Controller.Add(0, 0, CHAR_NPC, CHAR_WANDER, 0.0f, 0.0f, 0.0f, 0.0f);

Controller.SetBounds(0, -256.0f, 0.0f, -256.0f,

256.0f, 0.0f, 256.0f);

Теперь, когда вы добавили к списку NPC, вы можете непрерывно обновлять и визуализировать его в каждом кадре:

long UpdateCounter = timeGetTime(); // Записываем текущее время

//Для примера устанавливаем действие атаки

Controller.GetCharacter(0)->Victim = FALSE; Controller.SetAction(Controller.GetCharacter(0), CHAR_ATTACK);

//Присоединяем оружие к NPC (предмет #0 - меч)

Controller.Equip(Controller.GetCharacter(0), 0, WEAPON, TRUE);

while(1) {

// Ограничиваем обновления каждыми 33 миллисекундами while(timeGetTime() < UpdateCounter + 33);

UpdateCounter = timeGetTime(); //

Записываем новое время

Controller.Update(33);

//

Принудительное обновление

Graphics.Clear();

//

на 33 миллисекунды

 

{

if(Graphics.BeginScene() == TRUE)

//Обновление анимации персонажа на 33 миллисекунды

//и визуализация ее на экране

Controller.Render(33);

}

Graphics.Display();

}

604

netlib.narod.ru

Соседние файлы в папке GameProg