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

📄 msgroute.cpp

📁 C人工智能游戏开发的一些实例源代码 C Game development in artificial intelligence source code of some examples
💻 CPP
字号:
/* Copyright (C) Steve Rabin, 2001. 
 * All rights reserved worldwide.
 *
 * This software is provided "as is" without express or implied
 * warranties. You may freely copy and compile this source into
 * applications you distribute provided that the copyright text
 * below is included in the resulting source code, for example:
 * "Portions Copyright (C) Steve Rabin, 2001"
 */

#include "msgroute.h"
#include "gameobject.h"
#include "statemch.h"
#include "database.h"
#include "global.h"
#include "time.h"
#include "msg.h"



MsgRoute::MsgRoute( void )
{

}


MsgRoute::~MsgRoute( void )
{

}


void MsgRoute::SendMsg( float delay, MSG_Name name, objectID receiver, objectID sender, int state )
{

	if( delay <= 0.0f )
	{	//Deliver immediately
		MSG_Object msg( g_time.GetCurTime(), name, receiver, sender, state );
		RouteMsg( msg );
	}
	else
	{	//Check for duplicates - then store
		MessageContainer::iterator i;
		for( i=m_delayedMessages.begin(); i!=m_delayedMessages.end(); ++i )
		{
			if( (*i)->IsDelivered() == false &&
				(*i)->GetMsgName() == name &&
				(*i)->GetReceiver() == receiver &&
				(*i)->GetSender() == sender &&
				(*i)->GetMsgState() == state )
			{	//Already in list - don't add
				return;
			}
		}
		
		//Store in delivery list
		float deliveryTime = delay + g_time.GetCurTime();
		MSG_Object * msg = new MSG_Object( deliveryTime, name, receiver, sender, state );
		m_delayedMessages.push_back( msg );
	}

}


void MsgRoute::DeliverDelayedMessages( void )
{
	MessageContainer::iterator i;
	for( i=m_delayedMessages.begin(); i!=m_delayedMessages.end(); ++i )
	{
		float dtime = (*i)->GetDeliveryTime();
		float ctime = g_time.GetCurTime();
		if( (*i)->GetDeliveryTime() <= g_time.GetCurTime() )
		{	//Deliver and delete msg
			MSG_Object * msg = *i;
			RouteMsg( *msg );
			delete( msg );
			i = m_delayedMessages.erase( i );
		}
	}

}

void MsgRoute::RouteMsg( MSG_Object & msg )
{
	GameObject * object = g_database.Find( msg.GetReceiver() );

	if( object != 0 )
	{
		if( msg.GetMsgState() < 0 || 
			msg.GetMsgState() == object->GetStateMachine()->GetState() )
		{	//State was irrelevant or current state matches msg state (for msg scoping)
			msg.SetDelivered( true );
			object->GetStateMachine()->Process( EVENT_Message, &msg );
		}
	}

}







⌨️ 快捷键说明

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