Пример #1
0
void  ZNetCharacter::OnUpdate(float fDelta)
{
	if (m_bInitialized==false) return;
	if (!IsVisible()) return;

	float fTimeLapse = ZGetGame()->GetTime() - m_fLastValidTime;
	m_fLastValidTime = ZGetGame()->GetTime();

	ZCharacter::OnUpdate(fDelta);

	// 실제 움직이는 부분은 module_movable 로 옮겨갔다

	if(IsMoveAnimation())		// 애니메이션에 움직임이 포함된넘은 움직여줘야한다.
	{
		rvector origdiff=fDelta*GetVelocity();

		rvector diff = m_AnimationPositionDiff.Ref();
		diff.z+=origdiff.z;
		//		rvector diff=m_RealPositionBefore-m_RealPosition;	// mesh 의 위치 변화로 움직임판정
		if(GetDistToFloor()<0 && diff.z<0) diff.z=-GetDistToFloor();

		Move(diff);

		// debug
		/*
		mlog("%d pos : %3.3f %3.3f %3.3f      ani-move : %3.3f %3.3f %3.3f\n",
			m_AniState_Lower,
			m_Position.x,m_Position.y,m_Position.z,diff.x,diff.y,diff.z);
		*/
	}

	UpdateHeight(fDelta);
}
Пример #2
0
void ZActor::UpdateHeight(float fDelta)
{
	if (GetDistToFloor() > 10.f || GetVelocity().z > 0.1f)
	{
        SetFlag(AF_LAND, false);
	}else {
		if(!CheckFlag(AF_LAND))
		{
			SetFlag(AF_LAND, true);
			m_Animation.Input(ZA_EVENT_REACH_GROUND);
		}
	}

	if(!CheckFlag(AF_LAND))
		m_pModule_Movable->UpdateGravity(fDelta);



	bool bJumpUp=(GetVelocity().z>0.0f);
	bool bJumpDown = false;

	if(m_pModule_Movable->isLanding())
	{
		SetFlag(AF_LAND, true);
		m_Animation.Input(ZA_EVENT_REACH_GROUND);
		SetVelocity(0,0,0);

		if(m_Position.z + 100.f < m_pModule_Movable->GetFallHeight())
		{
			float fSpeed=fabs(GetVelocity().z);

			RBspObject* r_map = ZGetGame()->GetWorld()->GetBsp();

			rvector vPos = m_Position;
			rvector vDir = rvector(0.f,0.f,-1.f);
			vPos.z += 50.f;

			RBSPPICKINFO pInfo;

			if(r_map->Pick(vPos,vDir,&pInfo)) 
			{
				vPos = pInfo.PickPos;

				vDir.x = pInfo.pInfo->plane.a;
				vDir.y = pInfo.pInfo->plane.b;
				vDir.z = pInfo.pInfo->plane.c;

				ZGetEffectManager()->AddLandingEffect(vPos,vDir);
			}
		}
	}

	rvector diff=fDelta*GetVelocity();

	bool bUp = (diff.z>0.01f);
	bool bDownward= (diff.z<0.01f);

	if(GetDistToFloor()<0 || (bDownward && m_pModule_Movable->GetLastMove().z>=0))
	{
		if(GetVelocity().z<1.f && GetDistToFloor()<1.f)
		{
			if(GetVelocity().z<0)
				SetVelocity(GetVelocity().x,GetVelocity().y,0);
		}
	}

	if(GetDistToFloor()<0 && !IsDie())
	{
		float fAdjust=400.f*fDelta;
		rvector diff=rvector(0,0,min(-GetDistToFloor(),fAdjust));
		Move(diff);
	}
}