コード例 #1
0
void CN3FXBundleGame::Trigger(int iSourceID, __Vector3 TargetPos, int iSndID)
{
	m_bRegion = true;
	
	CPlayerBase* pSource = CGameProcedure::s_pProcMain->CharacterGetByID(iSourceID, true);
	if(pSource)
	{
		if(pSource->m_pShapeExtraRef)
		{
			__Vector3 vMin = pSource->m_pShapeExtraRef->Min();
			__Vector3 vMax = pSource->m_pShapeExtraRef->Max();

			m_vPos = vMin + ((vMax-vMin)*0.5f);	
		}
		else
		{
			const __Matrix44* pMtx = pSource->JointMatrixGet(m_iSourceJoint);
			if(!pMtx) m_vPos = pSource->Position();
			else pSource->JointPosGet(m_iSourceJoint, m_vPos);
		}
	}

	m_vDestPos = TargetPos;

	m_fDistance = (m_vDestPos - m_vPos).Magnitude();
	m_fHeight = m_fDistance/2.0f;

	m_vDir = m_vDestPos - m_vPos;
	m_vDir.Normalize();
	CN3FXBundle::Trigger(iSourceID, -1, -1, iSndID);
}
コード例 #2
0
void CN3FXBundleGame::SetPreBundlePos(int iSourceID, int iJoint)
{
	CPlayerBase* pSource = CGameProcedure::s_pProcMain->CharacterGetByID(iSourceID, true);
	if(pSource)
	{
		if(pSource->m_pShapeExtraRef)
		{
			__Vector3 vMin = pSource->m_pShapeExtraRef->Min();
			__Vector3 vMax = pSource->m_pShapeExtraRef->Max();
			m_vPrePos = vMin + ((vMax-vMin)*0.5f);	
		}
		else
		{
			const __Matrix44* pMtx = pSource->JointMatrixGet(iJoint);
			if(!pMtx) m_vPrePos = pSource->Position();
			else pSource->JointPosGet(iJoint, m_vPrePos);
		}
	}
}
コード例 #3
0
void CN3FXBundleGame::Trigger(int iSourceID, int iTargetID, int iTargetJoint, int iSndID)
{
	m_bRegion = false;

	CPlayerBase* pTarget = CGameProcedure::s_pProcMain->CharacterGetByID(iTargetID, false);
	if(!pTarget) return;
	
	CPlayerBase* pSource = CGameProcedure::s_pProcMain->CharacterGetByID(iSourceID, true);
	if(pSource)
	{
		if(pSource->m_pShapeExtraRef)
		{
			__Vector3 vMin = pSource->m_pShapeExtraRef->Min();
			__Vector3 vMax = pSource->m_pShapeExtraRef->Max();
			m_vPos = vMin + ((vMax-vMin)*0.5f);	
		}
		else
		{
			const __Matrix44* pMtx = pSource->JointMatrixGet(m_iSourceJoint);
			if(!pMtx) m_vPos = pSource->Position();
			else pSource->JointPosGet(m_iSourceJoint, m_vPos);
		}

		m_vDestPos = pSource->Position() + pSource->Direction();		
	}

	//CPlayerBase* pTarget = CGameProcedure::s_pProcMain->CharacterGetByID(iTargetID, false);
	if(pTarget && pTarget!=pSource)
	{
		if(m_bDependScale)
		{
			//m_vTargetScale.x = m_vTargetScale.z = pTarget->Radius() * 2.0f;
			//m_vTargetScale.y = pTarget->Height();
			float width = pTarget->Radius() * 2.0f;
			if(width > pTarget->Height()) m_fTargetScale = width;
			else m_fTargetScale = pTarget->Height();
		}

		if(pTarget->m_pShapeExtraRef)
		{
			__Vector3 vMin = pTarget->m_pShapeExtraRef->Min();
			__Vector3 vMax = pTarget->m_pShapeExtraRef->Max();

			m_vDestPos = vMin + ((vMax-vMin)*0.5f);	
		}
		else
		{
			__Vector3 vMin = pTarget->Min();
			__Vector3 vMax = pTarget->Max();
			m_vDestPos = vMin + ((vMax-vMin)*0.5f);
			//m_vDestPos = pTarget->Position();
			
			if(iTargetJoint==-1)
			{
				__Vector3 vMin = pTarget->Min();
				__Vector3 vMax = pTarget->Max();
	
				m_vDestPos = vMin + ((vMax-vMin)*0.5f);	
				m_vDestPos.y = vMin.y;
				//m_vDestPos = pTarget->Position();	
			}
			else if(iTargetJoint>-1)
			{
				const __Matrix44* pMtx = pTarget->JointMatrixGet(iTargetJoint);
				if(!pMtx) m_vDestPos = pTarget->Position() + (pTarget->Height()*0.5f);
				else pTarget->JointPosGet(iTargetJoint, m_vDestPos);
			}
		}
	//	m_vDir = pTarget->Direction();
	//	m_vDir.Normalize();
	}

	m_fDistance = (m_vDestPos - m_vPos).Magnitude();
	m_fHeight = m_fDistance/2.0f;

	m_vDir = m_vDestPos - m_vPos;
	m_vDir.Normalize();
	
	if(m_bStatic)
	{
		Trigger(iSourceID, m_vDestPos, iSndID);
		return;
	}

	CN3FXBundle::Trigger(iSourceID, iTargetID, iTargetJoint, iSndID);
}
コード例 #4
0
bool CN3FXBundleGame::Tick()
{
	if(m_dwState==FX_BUNDLE_STATE_DEAD) return false;
	
	m_fLife += CN3Base::s_fSecPerFrm;

	if(m_dwState==FX_BUNDLE_STATE_LIVE)
	{
	//	if(m_fLife>=m_fLife0) Stop();		

		if(!m_bRegion)
		{
			CPlayerBase* pTarget = CGameProcedure::s_pProcMain->CharacterGetByID(m_iTargetID, false);

			if(pTarget && pTarget->m_pShapeExtraRef)
			{
				__Vector3 vMin = pTarget->m_pShapeExtraRef->Min();
				__Vector3 vMax = pTarget->m_pShapeExtraRef->Max();

				m_vDestPos = vMin + ((vMax-vMin)*0.5f);	
			}
			else if(pTarget && m_iTargetJoint==-1)
			{
				__Vector3 vMin = pTarget->Min();
				__Vector3 vMax = pTarget->Max();
	
				m_vDestPos = vMin + ((vMax-vMin)*0.5f);	
				m_vDestPos.y = vMin.y;
				//m_vDestPos = pTarget->Position();	
			}
			else if(pTarget && m_iTargetJoint>-1)
			{
				const __Matrix44* pMtx = pTarget->JointMatrixGet(m_iTargetJoint);
				if(!pMtx) m_vDestPos = pTarget->Position();
				else pTarget->JointPosGet(m_iTargetJoint, m_vDestPos);
			}
		}

		switch(m_iMoveType)
		{
		case FX_BUNDLE_MOVE_CURVE_FIXEDTARGET:
			{
				m_vPos.x = (m_vDir*CN3Base::s_fSecPerFrm*m_fVelocity).x; 
				m_vPos.z = (m_vDir*CN3Base::s_fSecPerFrm*m_fVelocity).z;
				float fAng;
				if(m_fDistance!=0.0f)
					fAng = __PI * (m_fDistance - (m_vDestPos - m_vPos).Magnitude()) / m_fDistance;
				else fAng = 0.0f;
								
				m_vPos.y = sin(fAng) * m_fHeight;
				break;
			}
		case FX_BUNDLE_MOVE_DIR_SLOW:
		case FX_BUNDLE_MOVE_DIR_FIXEDTARGET:
			{
				m_vPos += m_vDir*CN3Base::s_fSecPerFrm*m_fVelocity;
				break;
			}
		case FX_BUNDLE_MOVE_DIR_FLEXABLETARGET_RATIO:
			{
				CPlayerBase* pTarget = CGameProcedure::s_pProcMain->CharacterGetByID(m_iTargetID, false);
				if(!pTarget) 
				{
					m_vPos += m_vDir*CN3Base::s_fSecPerFrm*m_fVelocity;
					break;
				}
				else
				{
					/*
					m_vDestPos = pTarget->Position();
					const __Matrix44* pMtx = pTarget->JointMatrixGet(m_iTargetJoint);
					if(pMtx) pTarget->JointPosGet(m_iTargetJoint, m_vDestPos);

					__Vector3 vDestDir = m_vDestPos - m_vPos;
					vDestDir.Normalize();

					__Quaternion qtRot;
					__Vector3 vDirAxis;
					float fDirAng;
					
					vDirAxis.Cross(m_vDir, vDestDir);

					int tmp;
					tmp = vDirAxis.x*10000.0f;
					vDirAxis.x = (float)(tmp)/10000.0f;
					tmp = vDirAxis.y*10000.0f;
					vDirAxis.y = (float)(tmp)/10000.0f;
					tmp = vDirAxis.z*10000.0f;
					vDirAxis.z = (float)(tmp)/10000.0f;
					if(vDirAxis.x==0.0f && vDirAxis.y==0.0f && vDirAxis.z==0.0f) vDirAxis.Set(0,1,0);

					fDirAng = acos((double)m_vDir.Dot(vDestDir));
					if(fDirAng > __PI*s_fSecPerFrm) fDirAng = __PI*s_fSecPerFrm;
					else if(fDirAng < -__PI*s_fSecPerFrm) fDirAng = -__PI*s_fSecPerFrm;

					qtRot.RotationAxis(vDirAxis, fDirAng);

					__Matrix44 mtxRot = qtRot;
					m_vDir *= mtxRot;

					m_vPos += m_vDir*CN3Base::s_fSecPerFrm*m_fVelocity;
					
					float fTerrainY = s_pTerrain->GetHeight(m_vPos.x, m_vPos.z);
					if(m_vPos.y <= fTerrainY) m_vPos.y = fTerrainY + 0.3f;	//땅을 타고 날라가라..
					break;
					*/
				}
				//break;
			}
		case FX_BUNDLE_MOVE_DIR_FLEXABLETARGET:
			{
				CPlayerBase* pTarget = CGameProcedure::s_pProcMain->CharacterGetByID(m_iTargetID, false);
				if(!pTarget) 
				{
					m_vPos += m_vDir*CN3Base::s_fSecPerFrm*m_fVelocity;
					break;
				}

				if(pTarget && pTarget->m_pShapeExtraRef)
				{
					__Vector3 vMin = pTarget->m_pShapeExtraRef->Min();
					__Vector3 vMax = pTarget->m_pShapeExtraRef->Max();

					m_vDestPos = vMin + ((vMax-vMin)*0.5f);	
				}

				else 
				{
					m_vDestPos = pTarget->Position();
					
					const __Matrix44* pMtx = pTarget->JointMatrixGet(m_iTargetJoint);
					if(!pMtx) m_vDestPos = pTarget->Position();
					else pTarget->JointPosGet(m_iTargetJoint, m_vDestPos);
				}				

				m_vDir = m_vDestPos - m_vPos;
				m_vDir.Normalize();
				
				m_vPos += m_vDir*CN3Base::s_fSecPerFrm*m_fVelocity;

				//float fTerrainY = s_pTerrain->GetHeight(m_vPos.x, m_vPos.z);
				//if(m_vPos.y <= fTerrainY) m_vPos.y = fTerrainY + 0.3f;	//땅을 타고 날라가라..
				break;
			}

		case FX_BUNDLE_MOVE_NONE:
			{
				//m_vDir.Set(0,0,1);
				m_vDir.y = 0.0f;
				m_vDir.Normalize();
				m_vPos = m_vDestPos;
				if(m_iSourceID==m_iTargetID)
				{
					CPlayerBase* pSource = CGameProcedure::s_pProcMain->CharacterGetByID(m_iSourceID, false);
					if(pSource) 
					{
						m_vDir = pSource->Direction();
						m_vDir.y = 0.0f;
						m_vDir.Normalize();
					}
				}
				break;
			}
		case FX_BUNDLE_REGION_POISON:
			{
				CN3Camera* pCamera = CGameProcedure::s_pEng->CameraGetActive();		// 활성화된 카메라 얻기..

				__Vector3 vEyePos = pCamera->EyePos();
				__Vector3 vEyeAt  = pCamera->AtPos();
				__Vector3 vEyeDir = vEyeAt - vEyePos;
				vEyeDir.Normalize();
				m_vDir = vEyeDir;
				m_vPos = vEyePos + vEyeDir*CN3Base::s_CameraData.fNP*3;
				break;
			}
		}
	}

	if(m_dwState==FX_BUNDLE_STATE_DYING || m_dwState==FX_BUNDLE_STATE_LIVE)
	{
		if(CheckAllPartsDead() || (m_fLife0 !=0.0f && m_fLife > m_fLife0) )
		{
			m_dwState = FX_BUNDLE_STATE_DEAD;
			Init();
			return false;
		}
	}

	for(int i=0;i<MAX_FX_PART;i++)
	{
		if(m_pPart[i] && m_pPart[i]->pPart)
		{
			if(m_pPart[i]->fStartTime <= m_fLife && m_pPart[i]->pPart->m_dwState==FX_PART_STATE_READY)
			{
				m_pPart[i]->pPart->Start();
			}
			m_pPart[i]->pPart->Tick();

		}
	}

	return true;
}