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); }
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); } }