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

📄 magiceffectarrow.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
字号:
//-------------------------------------------------------------------------
// MagicEffectArrow.cpp
//-------------------------------------------------------------------------

#include "MagicEffect.h"
#include "Magic.h"
#include "GamePlayerSet.h"
#include "Player.h"
#include "Hero.h"
#include "3DMapEffect.h"
#include "3DGameMap.h"
#include "../NdSound/Ndsound.h"
#include "Physics.h"
#include "3DMapSimpleObj.h"
#include "3DRoleData.h"

//--------------------------------------------------------------------
CMagicEffect* CMagicEffect::CreateNewArrow(OBJID idSender, OBJID idTarget, int nType, DWORD dwDelay)
{
	CMagicEffect* pEffect = new CMagicEffect;
	if(pEffect->CreateArrow(idSender, idTarget, nType, dwDelay))
		return pEffect;
	
	SAFE_DELETE(pEffect);
	return NULL;
}
//--------------------------------------------------------------------
BOOL CMagicEffect::CreateArrow(OBJID idSender, OBJID idTarget, int nArrowType, DWORD dwDelay)
{
	// check sender 
	CPlayer* pPlayer = g_objPlayerSet.GetPlayer(idSender);
	if(!pPlayer && g_objHero.GetID() == idSender)
	{
		pPlayer = &g_objHero;
	}
	if(!pPlayer)
	{
		return false;
	}
	
	CPlayer* pTarget = g_objPlayerSet.GetPlayer(idTarget);
	if(!pTarget && g_objHero.GetID() == idTarget)
	{
		pTarget = &g_objHero;
	}
	if(!pTarget)
	{
		return false;
	}

	m_idSender = idSender;
	m_idTarget = idTarget;

	m_nType = MAGICEFFECT_ARROW;
	CMyPos posSender, posTarget, posCell;

	const int _OFFSET_Y = -60;

	pPlayer->GetPos(posCell);
	g_objGameMap.Cell2World(posCell.x, posCell.y, posSender.x, posSender.y);
	m_posBegin = posSender;

	pTarget->GetPos(posCell);
	g_objGameMap.Cell2World(posCell.x, posCell.y, posTarget.x, posTarget.y);
	m_posEnd = posTarget;
	m_posEnd.y += _OFFSET_Y;	
	m_dwData = nArrowType;
	m_dwDelay = dwDelay;

	// 第一次修正 
	int nDesc = sqrt((posSender.x - posTarget.x) * (posSender.x - posTarget.x)
						+ (posSender.y - posTarget.y) * (posSender.y - posTarget.y));
	if(nDesc <= 0)
		nDesc = 1;
	CMyPos posOffset;
	posOffset.x = (posSender.x - m_posEnd.x)*25/nDesc;
	posOffset.y = (posSender.y - m_posEnd.y)*25/nDesc;
	m_posBegin.x -= posOffset.x;
	m_posBegin.y -= posOffset.y;

	// 第二次修正
	m_posBegin.y += _OFFSET_Y-pPlayer->GetFlyOffset();	
	return true;
}
//--------------------------------------------------------------------
BOOL CMagicEffect::ProcessArrow()
{
	typedef struct
	{
		C3DMapSimpleObj* pObj;
		float fHorizontal;
		float fVertical;
		char  szFlyingSound[_MAX_PATH];
		char  szHitSound[_MAX_PATH];
		char  szEffectIndex[64];
		char  szTargetEffect[64];
	}ArrowInfo;
	
	if(!m_bDelayOk)
	{
		const DWORD dwArrowDelay = 800;
		if(::TimeGet() - m_dwBegin >= dwArrowDelay+m_dwDelay)
			m_bDelayOk = true;
		return false;
	}
	if(!m_bBegin)
	{
		if(!m_pData)
		{
			m_pData = new ArrowInfo;
		}
		if(!m_pData)
			return true;
		ArrowInfo* pInfo = (ArrowInfo*)m_pData;
		// get flying obj ini ...
		OBJID idSimpleObj;
		//----------------------------------------------------
		{
			FlyingObjInfo* pMyInfo = g_obj3DRoleData.GetFlyingObjInfo(m_dwData);
			MYASSERT(pInfo);

			idSimpleObj = pMyInfo->idSimpleObj;
			strcpy(pInfo->szEffectIndex, pMyInfo->szFlyEffect);
			strcpy(pInfo->szTargetEffect, pMyInfo->szTargetEffect);
		}
		//----------------------------------------------------
		m_bBegin = true;
		m_dwMoment = 0;
		m_dwBegin = ::TimeGet();
		CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
		if(!pPlayer)
			return true;
		
		C3DMapSimpleObj* pObj = C3DMapSimpleObj::CreateNew(idSimpleObj, m_posBegin, true);
		CInteractiveLayer* pLayer = g_objGameMap.GetInteractiveLayer();
		if(pLayer && pObj)
		{
			if(strcmp(pInfo->szEffectIndex, "NULL") != 0)
				pObj->AddEffect(pInfo->szEffectIndex);
			pLayer->AddMapObj(pObj);
		}
		else
		{
			SAFE_DELETE(pObj);
			SAFE_DELETE(pInfo);
			return true;
		}
		pInfo->pObj = pObj;
		
		CMy3DPos posBegin, posEnd;
		CMy3DDir dir3D;
		posBegin.x = m_posBegin.x;
		posBegin.y = m_posBegin.y;
		posBegin.z = 0;

		posEnd.x = m_posEnd.x;
		posEnd.y = m_posEnd.y;
		posEnd.z = 0;

		CPhysics::S3Get3DDir(posBegin, posEnd, dir3D);
		pInfo->fHorizontal = dir3D.fHorizontal;
		pInfo-> fVertical = dir3D.fVertical;

		const double fPei=3.14159;
		pObj->SetRotate(dir3D.fHorizontal, dir3D.fVertical);

		m_dwBegin = ::TimeGet();
		return false;
	}
	ArrowInfo* pInfo = (ArrowInfo*)m_pData;

	// 开始飞行
	if(!pInfo)
		return true;

	int nV = 1600;
	float fA = 0;
	DWORD dwTime = ::TimeGet() - m_dwBegin;
	float fTime = dwTime*1.0/1000;
	CMyPos posCurrent;
	
	if(CPhysics::S2DBMGetPos(nV, fA, fTime, m_posBegin, m_posEnd, posCurrent))
	{
		m_pData = NULL;
		for(int i = 0; i < m_setRoleInfo.size(); i++)
		{
			MagicEffectRoleInfo* pRloeInfo = m_setRoleInfo[i];
			CPlayer* pTarget = NULL;
			CPlayer* pSender = NULL;
			if(pRloeInfo)
				pTarget = g_objPlayerSet.GetPlayer(pRloeInfo->idRole, true);
			pSender = g_objPlayerSet.GetPlayer(m_idSender, true);	
			if(pTarget && pSender)
			{
				pTarget->m_objEffect.Add(pInfo->szTargetEffect,false,0,pTarget->GetLook());
				if (pRloeInfo->dwData > 0)
				{
					if (!pTarget->IsAttacking() && !pTarget->TestStatus(USERSTATUS_DIE))
						pTarget->SetIntoneCmd(_ACTION_BRUISE0, pTarget->GetDir(pSender));
					
					DWORD dwColor = _COLOR_GREEN;
					if (g_objHero.GetID() == pTarget->GetID())
						dwColor = _COLOR_RED;
					pTarget->AddZoomNum(pRloeInfo->dwData, dwColor, 300, 30);
					
					if (pTarget->IsNpc())
					{
						int nLife = (int)pTarget->GetData(CPlayer::_PLAYER_LIFE)-(int)pRloeInfo->dwData;
						pTarget->SetData(CPlayer::_PLAYER_LIFE, __max(0, nLife));
						//pTarget->SetLife(__max(0, nLife));
					}
				}
				else
				{
					if (!pTarget->IsAttacking() && !pTarget->TestStatus(USERSTATUS_DIE) && pTarget->IsPlayer())
						pTarget->SetIntoneCmd(_ACTION_DODGE0, pTarget->GetDir(pSender));
				}
			}
		}
		if(pInfo->pObj)
			pInfo->pObj->Die();
		SAFE_DELETE(pInfo);
		return true;
	}
	else
	{
		if(pInfo->pObj)
			pInfo->pObj->SetWorldPos(posCurrent);
		else
			return true;
	}
	return false;	
}
//--------------------------------------------------------------------

⌨️ 快捷键说明

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