⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 actiontable.cpp

📁 C人工智能游戏开发的一些实例源代码 C Game development in artificial intelligence source code of some examples
💻 CPP
字号:
#include "ActionTable.h"

//
// This is an optimized version of the ActionTable.
// It uses one multimap rather than nested maps.
//

// --------------------------------------------------------------------------

const char* CActionTable::GetAnimation(EnumAnimCondition eAnimCond, EnumAction eAction, EnumActionDescriptor* peActionDesc)
{
	unsigned long key = CREATE_KEY(eAnimCond, eAction);

	CONDITION_ACTION_MAP::iterator ca_it;
	ca_it = m_condActionMap.find(key);

	// Get list of actions for this animation condition.
	if(ca_it != m_condActionMap.end())
	{
		ActionAnimInfoStruct* pAnimInfoStruct = NULL;

		// Get number of animations listed for this action.
		long nCount = m_condActionMap.count(key);
	
		// If only one action is listed, return the animation.
		if(nCount == 1)
		{
			pAnimInfoStruct = &(ca_it->second);

			if(peActionDesc != NULL)
			{
				*peActionDesc = pAnimInfoStruct->eActionDesc;
			}
			return pAnimInfoStruct->szAnimFileName;
		}

		// Pick randomly from a list of animations for this action.
		else if(nCount > 1)
		{
			long nIndex = (long) ( ( (float)rand() / (float)RAND_MAX ) * (float)nCount );
			for(long i=0; i<nIndex; ++i, ++ca_it);
			pAnimInfoStruct = &(ca_it->second);

			if(peActionDesc != NULL)
			{
				*peActionDesc = pAnimInfoStruct->eActionDesc;
			}
			return pAnimInfoStruct->szAnimFileName;
		}
	}

	// No animation was found for the specified eAnimCond and eAction,
	// so see if a default animation exists.
	if(eAnimCond != kACond_Default)
	{
		return GetAnimation(kACond_Default, eAction, peActionDesc);
	}

	return NULL;
}

// --------------------------------------------------------------------------

void CActionTable::Read() 
{
	// Write code to read the action table data in from a file here.
	// For simplification, I'm hardcoding some entries.

	//
	// ---- BEGIN STUB CODE -------
	//

	unsigned long key;
	ActionAnimInfoStruct aaiStruct;

	// Create some default animations.

	aaiStruct.eActionDesc = kADesc_None;

	strcpy(aaiStruct.szAnimFileName, "default_idle_scratchhead.anm");
	key = CREATE_KEY(kACond_Default, kAct_Idle);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	strcpy(aaiStruct.szAnimFileName, "default_idle_lookaround.anm");
	key = CREATE_KEY(kACond_Default, kAct_Idle);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	strcpy(aaiStruct.szAnimFileName, "default_idle_flex.anm");
	key = CREATE_KEY(kACond_Default, kAct_Idle);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	strcpy(aaiStruct.szAnimFileName, "default_walk.anm");
	key = CREATE_KEY(kACond_Default, kAct_Walk);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	strcpy(aaiStruct.szAnimFileName, "default_run.anm");
	key = CREATE_KEY(kACond_Default, kAct_Run);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	strcpy(aaiStruct.szAnimFileName, "default_attack.anm");
	key = CREATE_KEY(kACond_Default, kAct_Attack);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );


	// Create some one-handed weapon animations.

	aaiStruct.eActionDesc = kADesc_None;

	strcpy(aaiStruct.szAnimFileName, "one_handed_idle.anm");
	key = CREATE_KEY(kACond_OneHanded, kAct_Idle);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	strcpy(aaiStruct.szAnimFileName, "one_handed_walk.anm");
	key = CREATE_KEY(kACond_OneHanded, kAct_Walk);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	strcpy(aaiStruct.szAnimFileName, "one_handed_run.anm");
	key = CREATE_KEY(kACond_OneHanded, kAct_Run);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	aaiStruct.eActionDesc = kADesc_Swing;
	strcpy(aaiStruct.szAnimFileName, "one_handed_attack_swing.anm");
	key = CREATE_KEY(kACond_OneHanded, kAct_Attack);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	aaiStruct.eActionDesc = kADesc_Jab;
	strcpy(aaiStruct.szAnimFileName, "one_handed_attack_jab.anm");
	key = CREATE_KEY(kACond_OneHanded, kAct_Attack);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );


	// Create some two-handed weapon animations.

	aaiStruct.eActionDesc = kADesc_None;

	strcpy(aaiStruct.szAnimFileName, "two_handed_idle.anm");
	key = CREATE_KEY(kACond_TwoHanded, kAct_Idle);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	strcpy(aaiStruct.szAnimFileName, "two_handed_walk.anm");
	key = CREATE_KEY(kACond_TwoHanded, kAct_Walk);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	strcpy(aaiStruct.szAnimFileName, "two_handed_run.anm");
	key = CREATE_KEY(kACond_TwoHanded, kAct_Run);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	aaiStruct.eActionDesc = kADesc_Swing;
	strcpy(aaiStruct.szAnimFileName, "two_handed_attack_swing.anm");
	key = CREATE_KEY(kACond_TwoHanded, kAct_Attack);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	aaiStruct.eActionDesc = kADesc_Jab;
	strcpy(aaiStruct.szAnimFileName, "two_handed_attack_jab.anm");
	key = CREATE_KEY(kACond_TwoHanded, kAct_Attack);
	m_condActionMap.insert( CONDITION_ACTION_MAP::value_type( key, aaiStruct) );

	//
	// ---- END STUB CODE -------
	//
}

// --------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -