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

📄 actionengine.cpp

📁 游戏框架
💻 CPP
字号:
// ***************************************************************
//  ActionEngine   version:  1.0
//  -------------------------------------------------------------
//	File Name:	ActionEngine.cpp
//	Created:	2007/07/18
//	Modified:	2007/07/18   16:52
//	Author:		William.Liang
//  Msn:		lwq49@msn.com
//  Email:		lwq49@21cn.com, lwq49@msn.com
//	Description:
//
//	Purpose:	
//  -------------------------------------------------------------
//  license:
//
//  The contents of this file are subject to the Mozilla Public
//  License Version 1.1 (the "License"); you may not use this file
//  except in compliance with the License. You may obtain a copy
//  of the License at http://www.mozilla.org/MPL/ Software dis-
//  tributed under the License is distributed on an "AS IS" 
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or im-
//  plied. See the License for the specific language governing
//  rights and limitations under the License.
//
//  The Initial Developer of the Original Code is William.Liang .
//  Copyright (C) 2007 - All Rights Reserved.
// ***************************************************************
#include "StdAfx.h"
#include "ActionEngine.h"
//#include "EventService.h"

//宏定义
#define NO_TIME_LEFT						DWORD(-1)				//不响应时间

//////////////////////////////////////////////////////////////////////////

//************************************
// <p>Description: 构造函数</p>
//************************************
CActionThread::CActionThread(void)
{
	m_dwTimerSpace=0L;
	m_pActionEngine=NULL;
}

//************************************
// <p>Description: 析构函数</p>
//************************************
CActionThread::~CActionThread(void)
{
}

//************************************
// <p>Description: 配置函数</p>
// <p>Parameters:  </p>
// <p>    CActionEngine * pActionEngine</p>
// <p>    DWORD dwTimerSpace</p>
//
// <p>Returns:   bool</p>
//************************************
bool CActionThread::InitThread(CActionEngine * pActionEngine, DWORD dwTimerSpace)
{
	//效益参数
	//_ASSERT(dwTimerSpace>=5L);
	_ASSERT(pActionEngine!=NULL);
	if (pActionEngine==NULL) return false;

	//设置变量
	m_dwTimerSpace=dwTimerSpace;
	m_pActionEngine=pActionEngine;

	return true;
}

//************************************
// <p>Description: 运行函数</p>
//
// <p>Returns:   bool</p>
//************************************
bool CActionThread::RepetitionRun()
{
	_ASSERT(m_pActionEngine!=NULL);
	Sleep(m_dwTimerSpace);
	m_pActionEngine->OnActionThreadSink();
	return true;
}

//////////////////////////////////////////////////////////////////////////

//************************************
// <p>Description: 构造函数</p>
//************************************
CActionEngine::CActionEngine()
{
	m_bService=false;
	m_dwTimerSpace=25;
}

//************************************
// <p>Description: 析构函数</p>
//************************************
CActionEngine::~CActionEngine(void)
{
	//停止服务
	StopService();

	//清理内存
	RemoveAll();

	return;
}

//************************************
// <p>Description: 接口查询</p>
// <p>Parameters:  </p>
// <p>    const IID & Guid</p>
// <p>    DWORD dwQueryVer</p>
//
// <p>Returns:   void * __cdecl</p>
//************************************
void * __cdecl CActionEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
	QUERYINTERFACE(IActionEngine,Guid,dwQueryVer);
	QUERYINTERFACE(IActionEngineManager,Guid,dwQueryVer);
	QUERYINTERFACE_IUNKNOWNEX(IActionEngine,Guid,dwQueryVer);
	return NULL;
}

//************************************
// <p>Description: 设置定时器</p>
// <p>Parameters:  </p>
// <p>    IGameObject * pIGameObject</p>
// <p>    enuActionType ActionType</p>
// <p>    WORD wActionID</p>
// <p>    DWORD dwElapse</p>
// <p>    DWORD dwRepeat</p>
// <p>    WPARAM wParam</p>
//
// <p>Returns:   bool __cdecl</p>
//************************************
bool __cdecl CActionEngine::CreateAction(IGameObject* pIGameObject, enuActionType ActionType, WORD wActionID, DWORD dwElapse, DWORD dwRepeat, WPARAM wParam, BOOL bCheckExist)
{
	//锁定资源
	CThreadLockHandle LockHandle(&m_ThreadLock);

	//效验参数
	_ASSERT(dwRepeat>0L);
	if (dwRepeat==0) return false;

	//查找对象相同动作
	//bool bActionExist = false;// = (m_ActionItems.GetBy(pIGameObject)!=NULL);
	bool bActionExist = bCheckExist && (m_ActionItems.GetBy(wActionID)!=NULL);

	//创建定时器
	if (bActionExist==false)
	{
		tagActionItem*	pActionItem = new tagActionItem;
		IActionProcess*	pIActionProcess	= NULL;
		DWORD	dwFrames = (dwElapse+m_dwTimerSpace-1)/m_dwTimerSpace;

		switch(ActionType){
			case Action_Move:
				{
					_POINT	Point = *(_POINT*)wParam;
					pIActionProcess = new CActionProcessMove(pIGameObject, dwFrames, Point);
					break;
				}
			case Action_Resize:
				{
					_SIZE	Size = *(_SIZE*)wParam;
					pIActionProcess = new CActionProcessScaling(pIGameObject, dwFrames, Size);
					break;
				}
			case Action_Angle:
				{
					tagProcessAngleParam*	lpAngleParam = (tagProcessAngleParam*)wParam;
					pIActionProcess = new CActionProcessAngle(pIGameObject, dwFrames, lpAngleParam);
					break;
				}
			case Action_Vibrating:
				{
					tagProcessVibratingParam*	lpVibratingParam = (tagProcessVibratingParam*)wParam;
					pIActionProcess = new CActionProcessVibrating(pIGameObject, dwFrames, lpVibratingParam);
					break;
				}
			case Action_MoveTrack:
				{
					tagProcessTrackParam*	lpTrackParam = (tagProcessTrackParam*)wParam;
					pIActionProcess = new CActionProcessMoveTrack(pIGameObject, dwFrames, lpTrackParam);
					break;
				}
		}

		if(pIActionProcess){
			pActionItem->wActionID			= wActionID;
			pActionItem->pIGameObject		= pIGameObject;
			pActionItem->pIActionProcess	= pIActionProcess;
			pActionItem->bIsCallBack		= false;
			pActionItem->dwFrames			= dwFrames;
			pActionItem->dwPassFrames		= dwFrames;
			pActionItem->dwRepeatTimes		= dwRepeat;
			pActionItem->wBindParam			= wParam;

			m_ActionItems.Push(pActionItem, wActionID);
			int i=m_ActionItems.GetCount();

			return true;
		}
	}
	return false;
}

//************************************
// <p>Description: 设置定时器</p>
// <p>Parameters:  </p>
// <p>    IGameObject * pIGameObject</p>
// <p>    IActionProcess * pIActionProcess</p>
// <p>    WORD wActionID</p>
// <p>    DWORD dwElapse</p>
// <p>    DWORD dwRepeat</p>
// <p>    WPARAM wParam</p>
//
// <p>Returns:   bool __cdecl</p>
//************************************
bool __cdecl CActionEngine::CreateAction(IGameObject* pIGameObject, IActionProcess* pIActionProcess, WORD wActionID, DWORD dwElapse, DWORD dwRepeat, WPARAM wParam, BOOL bCheckExist)
{
	//锁定资源
	CThreadLockHandle LockHandle(&m_ThreadLock);

	//效验参数
	_ASSERT(dwRepeat>0L);
	if (dwRepeat==0) return false;

	//查找对象相同动作
	bool bActionExist = bCheckExist && (m_ActionItems.GetBy(wActionID)!=NULL);

	//创建定时器
	if (bActionExist==false)
	{
		if(pIActionProcess){
			tagActionItem*	pActionItem = new tagActionItem;
			DWORD	dwFrames = (dwElapse+m_dwTimerSpace-1)/m_dwTimerSpace;

			pActionItem->wActionID			= wActionID;
			pActionItem->pIGameObject		= pIGameObject;
			pActionItem->pIActionProcess	= pIActionProcess;
			pActionItem->bIsCallBack		= false;
			pActionItem->dwFrames			= dwFrames;
			pActionItem->dwPassFrames		= dwFrames;
			pActionItem->dwRepeatTimes		= dwRepeat;
			pActionItem->wBindParam			= wParam;

			m_ActionItems.Push(pActionItem, wActionID);

			return true;
		}
	}
	return false;
}

//************************************
// <p>Description: 删除定时器</p>
// <p>Parameters:  </p>
// <p>    WORD wActionID</p>
//
// <p>Returns:   bool __cdecl</p>
//************************************
bool __cdecl CActionEngine::Remove(WORD wActionID)
{
	//锁定资源
	CThreadLockHandle LockHandle(&m_ThreadLock);

	tagActionItem*		pActionItem = m_ActionItems.GetBy(wActionID);
	if(pActionItem){
		SafeDelete(pActionItem->pIActionProcess);
		SafeDelete(pActionItem);

		m_ActionItems.RemoveBy(wActionID);

		return true;
	}

	return false;
}

//************************************
// <p>Description: 删除定时器</p>
//
// <p>Returns:   bool __cdecl</p>
//************************************
bool __cdecl CActionEngine::RemoveAll()
{
	//锁定资源
	CThreadLockHandle LockHandle(&m_ThreadLock);

	//删除定时器
	tagActionItem*		pActionItem = m_ActionItems.Iterators(true);
	while(pActionItem){
		//删除执行处理接口指针
		SafeDelete(pActionItem->pIActionProcess);
		//删除执行项
		SafeDelete(pActionItem);

		pActionItem = m_ActionItems.Iterators();
	}
	m_ActionItems.RemoveAll();

	return true;
}

//************************************
// <p>Description: 开始服务</p>
//
// <p>Returns:   bool __cdecl</p>
//************************************
bool __cdecl CActionEngine::StartService()
{
	//效验状态
	//定时器引擎重复启动,启动操作忽略
	if (m_bService==true) return true;

	//判断绑定
	if (m_AttemperEvent.IsValid()==false)
	{
		//CEventTrace::ShowEventNotify(TEXT("定时器引擎未与触发服务绑定"),Level_Exception);
		return false;
	}

	//设置变量
	if (m_ActionThread.InitThread(this,m_dwTimerSpace)==false)
	{
		//CEventTrace::ShowEventNotify(TEXT("定时器引擎线程服务初始化失败"),Level_Exception);
		return false;
	}

	//启动服务
	if (m_ActionThread.StartThead()==false)
	{
		//CEventTrace::ShowEventNotify(TEXT("定时器引擎线程服务启动失败"),Level_Exception);
		return false;
	}

	//设置变量
	m_bService=true;

	return true;
}

//************************************
// <p>Description: 停止服务</p>
//
// <p>Returns:   bool __cdecl</p>
//************************************
bool __cdecl CActionEngine::StopService()
{
	//设置变量
	m_bService=false;

	//停止线程
	m_ActionThread.StopThread();

	//删除计时器
	RemoveAll();

	return true;
}

//************************************
// <p>Description: 设置接口</p>
// <p>Parameters:  </p>
// <p>    IUnknownEx * pIUnknownEx</p>
//
// <p>Returns:   bool __cdecl</p>
//************************************
bool __cdecl CActionEngine::SetActionEngineSink(IUnknownEx * pIUnknownEx)
{
	//效验参数
	_ASSERT(pIUnknownEx!=NULL);
	_ASSERT(m_bService==false);
	if (m_bService==true) return false;
	if (pIUnknownEx==NULL) return false;

	//设置接口
	if (m_AttemperEvent.SetQueueService(pIUnknownEx)==false)
	{
		//CEventTrace::ShowEventNotify(TEXT("定时器引擎与触发服务绑定失败"),Level_Exception);
		return false;
	}
	
	return true;
}

//************************************
// <p>Description: 动作通知</p>
//
// <p>Returns:   void</p>
//************************************
void CActionEngine::OnActionThreadSink()
{
	//锁定资源
	CThreadLockHandle LockHandle(&m_ThreadLock);

	//查询定时器
	if (m_ActionItems.GetCount()>0)
	{
		bool bKillAction=false;
		tagActionItem*		pActionItem = m_ActionItems.Iterators(true);
		while(pActionItem){
			//动作处理
			//bKillAction=false;
			//每个动作检查
			pActionItem->dwPassFrames--;
			//动作结束处理
			if (pActionItem->dwPassFrames==0L){
				//动作的最后一帧对齐处理
				pActionItem->pIActionProcess->Process(true);
				//发送通知
				m_AttemperEvent.PostActionEvent(pActionItem->pIGameObject, pActionItem->wActionID, pActionItem->dwRepeatTimes-1, pActionItem->wBindParam);

				//设置次数
				if (pActionItem->dwRepeatTimes!=TIMER_REPEAT_TIMER)
				{
					_ASSERT(pActionItem->dwRepeatTimes>0);
					if (pActionItem->dwRepeatTimes==1L)
					{
						pActionItem->dwRepeatTimes--;
						bKillAction=true;
					}
					else{
						pActionItem->dwRepeatTimes--;
						pActionItem->dwPassFrames = pActionItem->dwFrames;
						pActionItem->pIActionProcess->Reset();
					}
				}
			}
			else{
				//动作的每帧处理
				pActionItem->pIActionProcess->Process();
			}
			pActionItem = m_ActionItems.Iterators();
		}

		//处理已失效的动作
		if(bKillAction){
			for(INT_PTR i=m_ActionItems.GetCount();i>=1;i--){
				pActionItem = m_ActionItems.Get(i);
				if(pActionItem->dwPassFrames==0 && pActionItem->dwRepeatTimes==0){
					pActionItem->pIActionProcess->Release();
					SafeDelete(pActionItem);
					m_ActionItems.Remove(i);
				}
			}
		}
	}

	return;
}

//////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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