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

📄 actormanager.cpp

📁 大型3D游戏设计制作详析及源代码,游戏脚本,设计报告,技术报告,用户手册
💻 CPP
字号:
/********************************************************************
	created:	2004/07/09
	created:	9:7:2004   23:57
	filename: 	d:\Works\GameLib_sdk\ActorManager.cpp
	file path:	d:\Works\GameLib_sdk
	file base:	ActorManager
	file ext:	cpp
	author:		lazybug
	
	purpose:	人物对象管理类的实现部分
*********************************************************************/


#include "StdAfx.h"
#include ".\ActorManager.h"
#include <utility>
#include <algorithm>
#include "GameLogic.h"

using namespace std ;

CGameLogic* CPlayer::context ;

CActorManager::CActorManager(CGameLogic* context)
{
	m_activePlayer = NULL ;
	m_context = context ;

	CPlayer::context = context ;

	m_user_attention_player = NULL ;
}

CActorManager::~CActorManager(void)
{
	std::vector<pair<std::string, CPlayer*> >::iterator	pos1 ;

	for ( pos1 = m_enum_data.begin(); pos1 != m_enum_data.end(); ++pos1 )
	{
		(*pos1).second->active_in_scene = true ;
	}

	push_enum_state() ;
	// 删除所有的Player和SimpleObj
	CPlayer* actor = this->enumActor();

	while ( actor != NULL )
	{
		delete actor ;
		actor = this->enumActor() ;
	}
	pop_enum_state() ;

	std::vector< std::pair<std::string, CSimpleObj*> >::iterator pos ;

	for ( pos = m_simple_data.begin(); pos != m_simple_data.end(); ++pos)
	{
		delete (*pos).second ;
	}
}

void CActorManager::CreateActors()
{
	CPlayer*	myActor ;
	GameRes*	res_info ;
	CSimpleObj* myObj ;
	fstream		in ;
	string		name ;

	m_enum_data.clear() ;

	/*
	*	下面根据列表文件创建简单对象,比如萝卜
	*/
	in.open( ".\\Actor\\SimpleObj.profile" ) ;

	if ( in.is_open() )
	{
		in >> name ;
		while ( !in.eof() )
		{	
			res_info = m_context->GetRes(name) ;
			myObj = new CSimpleObj(res_info) ;
			m_simple_data.push_back( make_pair(name, myObj) ) ;

			in >> name ;
		}
	}
	else
	{
		throw runtime_error("SimpleObj.profile not found!") ;
	}

	/*
	 *	创建人物对象
	 */
	myActor = new CPlayer("牛二") ;
	m_enum_data.push_back( make_pair("牛二", myActor) ) ;

	myActor = new CPlayer("老掌柜") ;
	m_enum_data.push_back( make_pair("老掌柜", myActor) ) ;

	myActor = new CPlayer( "管家") ;
	m_enum_data.push_back( make_pair("管家", myActor) ) ;

	myActor = new CPlayer( "栓柱" ) ;
	m_enum_data.push_back( make_pair("栓柱", myActor) ) ;

	myActor = new CPlayer( "厨师" ) ;
	m_enum_data.push_back( make_pair("厨师", myActor) ) ;

	myActor = new CPlayer( "虫老大" ) ;
	m_enum_data.push_back( make_pair("虫老大", myActor) ) ;
	myActor->AutoAttack(true);

	myActor = new CPlayer( "虫老二" ) ;
	m_enum_data.push_back( make_pair("虫老二", myActor) ) ;
	myActor->AutoAttack(true);

	myActor = new CPlayer( "虫老五" ) ;
	m_enum_data.push_back( make_pair("虫老五", myActor) ) ;
	myActor->AutoAttack(true);

	myActor = new CPlayer( "虫阿三" ) ;
	m_enum_data.push_back( make_pair("虫阿三", myActor) ) ;
	myActor->AutoAttack(true);

	myActor = new CPlayer( "虎头怪" ) ;
	m_enum_data.push_back( make_pair("虎头怪", myActor) ) ;
	myActor->AutoAttack(true);

	this->DisableAllActors() ;

	m_enum_pos = m_enum_data.begin() ;
}

CPlayer* CActorManager::enumActor()
{
	CPlayer* ret ;

	if ( m_enum_pos == m_enum_data.end() )
	{
		SortActors() ;
		m_enum_pos = m_enum_data.begin() ;
		return NULL ;
	}
	else
	{
		ret = (*m_enum_pos).second ;
		++m_enum_pos ;

		while ( ret->active_in_scene == false )
		{
			ret = (*m_enum_pos).second ;

			if ( m_enum_pos == m_enum_data.end() )
			{
				SortActors() ;
				m_enum_pos = m_enum_data.begin() ;
				ret = NULL ;
				break ;
			}
			m_enum_pos++ ;
		}

		return ret ;
	}
}

void CActorManager::DisableAllActors()
{
	std::vector<pair<std::string, CPlayer*> >::iterator	pos ;

	for ( pos = m_enum_data.begin(); pos != m_enum_data.end(); ++pos )
	{
		(*pos).second->active_in_scene = false ;
	}
}

CPlayer& CActorManager::GetActor(const std::string& name)
{
	std::vector<pair<std::string, CPlayer*> >::iterator	pos ;

	for ( pos = m_enum_data.begin(); pos != m_enum_data.end(); ++pos )
	{
		if ( (*pos).first == name )
		{
			return *((*pos).second) ;
		}
	}
	
	string err = "Actor Not Found: " ;

	err += name ;

	throw exception( name.c_str() ) ;
}

CSimpleObj& CActorManager::GetSimpleObj(const std::string& name)
{
	std::vector< std::pair<std::string, CSimpleObj*> >::iterator pos ;

	for ( pos = m_simple_data.begin(); pos != m_simple_data.end(); ++pos)
	{
		if ( (*pos).first == name )
		{
			return *((*pos).second) ;
		}
	}

	string err = "Try to get nonexsisted simple object: " ;

	err += name ;

	throw exception( name.c_str() ) ;
}

void CActorManager::SetActiveActor(const std::string& name)
{
	CPlayer* p ;

	try
	{
		p = &this->GetActor(name) ;
	}
	catch (exception e) 
	{
		m_activePlayer = NULL ;
		return ;
	}

	m_activePlayer = p ;
}

CPlayer& CActorManager::GetActiveActor()
{
	if ( m_activePlayer == NULL )
	{
		throw exception("No active actor found!") ;
	}
	else
	{
		return *m_activePlayer ;
	}
}

void CActorManager::SortActors()
{
	sort( m_enum_data.begin(), m_enum_data.end(), BaseYcomp() ) ;
}

void CActorManager::push_enum_state()
{
	m_enum_stack.push_back( m_enum_pos ) ;
	m_enum_pos = m_enum_data.begin() ;
}

void CActorManager::pop_enum_state()
{
	if ( !m_enum_stack.empty() )
	{
		m_enum_pos = m_enum_stack.back() ;
		m_enum_stack.pop_back() ;
	}
	else
	{
		throw logic_error( "Try to pop an empty enum stack!" ) ;
	}
}

/*
 *	刷新用户关注npc,当ActiveActor与某个npc的距离小于★两倍★的敏感距离,就认为关注
 */
void CActorManager::RefreshUserAttention()
{
	push_enum_state() ;

	CPlayer* Actor = this->enumActor() ;
	CPlayer* dest = NULL ;

	while ( Actor != NULL ) 
	{
		if ( Actor != m_activePlayer && Actor->active_in_scene )
		{
			if ( sqrt( (double)( Actor->x - m_activePlayer->x ) * ( Actor->x - m_activePlayer->x )
				  + ( Actor->y - m_activePlayer->y ) * ( Actor->y - m_activePlayer->y ) ) <= 1.25 * this->m_context->GetSensitiveLength() )
			{
				dest = Actor ;
			}
		}
		Actor = this->enumActor() ;
	}
	m_user_attention_player = dest ;

	pop_enum_state() ;
}

CPlayer* CActorManager::GetUserAttention()
{
	return m_user_attention_player ;
}

⌨️ 快捷键说明

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