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

📄 exinterface.cpp

📁 大型3D游戏设计制作详析及源代码对于想了解游戏设计的程序来说
💻 CPP
字号:
#include "stdafx.h"
#include "GameObj.h"
#include "callback_functions.h"
#include "gamelogic.h"

CGameLogic*	LogicEngine ;

/*
 *	游戏初始化
 */
extern "C" _declspec(dllexport) void StartGame(int func_count, void* funclist)
{
	LoadActor = *((LoadActorFunc)(*(void**)funclist)) ;
	is_engine_busy = *( (EngineBusyFunc)(*(void**)( (char*)(funclist) + 4 ))) ;
	Speak = *( (PCharArguFunc)(*(void**)( (char*)(funclist) + 8 ))) ;

	LoadMusic  = *( (PCharArguFunc)(*(void**)( (char*)(funclist) + 12 ))) ;
	PlayMusic  = *( (BoolArguFunc)(*(void**)( (char*)(funclist) + 16 ))) ;
	StopMusic  = *( (NonArguFunc)(*(void**)( (char*)(funclist) + 20 ))) ;

	LoadBackGround = *( (LoadBGFunc)(*(void**)( (char*)(funclist) + 24 ))) ;
	LoadBGMask = *( (LoadBGFunc)(*(void**)( (char*)(funclist) + 28 ))) ;

	GetFrameCount = *( (UIntArguFunc)(*(void**)( (char*)(funclist) + 32 ))) ;

	GetMainFrame = *( (HandlFunc)(*(void**)( (char*)(funclist) + 36 ))) ;

	try
	{
		LogicEngine = new CGameLogic() ;
	}
	catch (std::exception& e) 
	{
		MessageBox(0, e.what(), "游戏初始化错误", MB_OK) ;
	}
	catch (...)
	{
		MessageBox(0, "Unknown error!", "游戏初始化错误", MB_OK) ;
	}
}

/*
 *	游戏状态自更新
 */
extern "C" _declspec(dllexport) void Update()
{
	int is_busy ;
	try
	{
		is_engine_busy( &is_busy ) ;
		if ( !is_busy )
		{
			LogicEngine->AutoUpdate() ;
		}
	}
	catch ( std::exception& e ) 
	{
		MessageBox(0,e.what(),"游戏运行期间错误",MB_OK) ;
	}
	
}

/*
 *	处理用户输入
 */
extern "C" _declspec(dllexport) void UserInput( int KeyMask )
{
	int is_busy ;

	is_engine_busy( &is_busy ) ;

	if ( !is_busy )
	{
		try
		{
			LogicEngine->UserInput( KeyMask ) ;
		}
		catch ( std::exception& e ) 
		{
			MessageBox(0,e.what(),"游戏运行期间错误",MB_OK) ;
		}
	}
}

extern "C" _declspec(dllexport) void enumObj(void* object)
{
	LogicEngine->enumObj(object) ;
}

/*
 *	查询说话
 */
extern "C" _declspec(dllexport) void QueryTalking(int* pID, void** pWords)
{
	const STalking_Board* board = LogicEngine->QueryTalking() ;

	if ( board == NULL )
	{
		*pID = -1 ;
		*pWords = NULL ;
	}
	else
	{
		*pID = board->Talker_id ;
		*pWords = (void*)board->words.c_str() ;
	}
}

/*
 *	返回当前背景和状态,比如淡入
 */
extern "C" _declspec(dllexport) void GetBackGround( int* pID, int* state )
{
	int is_busy ;
	is_engine_busy( &is_busy ) ;

	if ( !is_busy )
	{
		if ( LogicEngine->m_EventManager->m_is_in_state )
		{
			LogicEngine->m_EventManager->m_is_in_state = false ;
			if ( LogicEngine->m_EventManager->GetState() == BackGround_Fadein )
			{
				LogicEngine->m_EventManager->SetState( BackGround_Normal ) ;
			}

			if ( LogicEngine->m_EventManager->GetState() == BackGround_Blank )
			{
				LogicEngine->m_EventManager->SetState( BackGround_Normal ) ;
			}

			if ( LogicEngine->m_EventManager->GetState() == BackGround_Fadeout )
			{
				LogicEngine->m_EventManager->SetState( BackGround_Blank ) ;
			}	
		}
		if (!LogicEngine->m_EventManager->m_is_in_state && LogicEngine->m_EventManager->GetState() != BackGround_Normal)
		{
			LogicEngine->m_EventManager->m_is_in_state = true ;
		}
	}

	*pID = LogicEngine->m_EventManager->GetBackImg() ;
	*state = LogicEngine->m_EventManager->GetState() ;
}

/*
 *	查询背景掩码
 */
extern "C" _declspec(dllexport) void GetMaskGround( int* pID )
{
	*pID = LogicEngine->m_EventManager->GetMaskImg() ;
}

/*
 *	查询发现物品框,返回物品id和描述
 */
extern "C" _declspec(dllexport) void QueryDiscovery(int* pID, void** pWords)
{
	const SDiscovery_Board* board = LogicEngine->QueryDiscovery() ;

	if ( board == NULL )
	{
		*pID = -1 ;
		*pWords = NULL ;
	}
	else
	{
		*pID = board->item ;
		*pWords = (void*)board->description.c_str() ;
	}
}

/*
 *	查询当前菜单接口:返回-1表示无菜单,1234分别代表4个菜单
 */
extern "C" _declspec(dllexport) void QueryMenu( int* pID, char** pTitle)
{
	char* Title ;
	*pTitle = NULL ;
	*pID = LogicEngine->QueryCurrentMenu( &Title ) ;
}

/*
 *	枚举菜单项
 */
extern "C" _declspec(dllexport) void enumMenuItem(void* pItem)
{
	LogicEngine->enumMenuItem( pItem ) ;
}

/*
 *	查询战斗状态:返回战斗地点的坐标和焦点半径
 */
extern "C" _declspec(dllexport) void QueryBattleState( int* x, int* y, int* radius )
{
	LogicEngine->QueryBattleState(x, y, radius) ;
}

extern "C" _declspec(dllexport) void QueryEnd( int* pID )
{
	if ( LogicEngine->is_dead() )
	{
		*pID = 1 ;
		return ;
	}

	if ( LogicEngine->is_success() )
	{
		*pID = 2 ;
		return ;
	}

	*pID = 0 ;
}

/*
 *	结束当前游戏,释放逻辑引擎申请的所有的资源(不包括Unicough引擎管理的图片资源)
 */
extern "C" _declspec(dllexport) void EndGame()
{
	if ( LogicEngine != NULL )
	{
		delete LogicEngine ;
		LogicEngine = NULL ;
	}
}

extern "C" _declspec(dllexport) void GetCurrentHealth(int* hero_blood, int* hero_magic, int* evil_blood, int* evil_magic)
{
	*hero_blood = LogicEngine->m_ActorManager->GetActiveActor().Property("生命力")->val ;

	if ( *hero_blood < 0 )
	{
		*hero_blood = 0 ;
	}

	*hero_magic = LogicEngine->m_ActorManager->GetActiveActor().Property("魔法力")->val ;

	if ( *hero_magic < 0 )
	{
		*hero_magic = 0 ;
	}

	*evil_blood = LogicEngine->m_ActorManager->GetActor( LogicEngine->get_npc_fighter() ).Property("生命力")->val ;
	*evil_magic = LogicEngine->m_ActorManager->GetActor( LogicEngine->get_npc_fighter() ).Property("魔法力")->val ;

	if ( *evil_blood < 0 )
	{
		*evil_blood = 0 ;
	}

	if ( *evil_magic < 0 )
	{
		*evil_magic = 0 ;
	}
}

extern "C" _declspec(dllexport) void GetFullHealth( int* hero_blood, int* hero_magic, int* evil_blood, int* evil_magic )
{
	*hero_blood = LogicEngine->m_ActorManager->GetActiveActor().Property("生命力上限")->val ;
	*hero_magic = LogicEngine->m_ActorManager->GetActiveActor().Property("魔法力上限")->val ;

	*evil_blood = LogicEngine->m_ActorManager->GetActor( LogicEngine->get_npc_fighter() ).Property("生命力上限")->val ;
	*evil_magic = LogicEngine->m_ActorManager->GetActor( LogicEngine->get_npc_fighter() ).Property("魔法力上限")->val ;
}

/*
 *	以下定义Delphi提供得函数指针
 */
LoadActorFunc LoadActor ;
EngineBusyFunc is_engine_busy ;
PCharArguFunc Speak ;
PCharArguFunc LoadMusic ;
NonArguFunc PlayMusic ;
NonArguFunc StopMusic ;
LoadBGFunc LoadBackGround ;
LoadBGFunc LoadBGMask ;
UIntArguFunc GetFrameCount ;
HandlFunc GetMainFrame ;

⌨️ 快捷键说明

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