www.pudn.com > 3D_OnlineGame_Humen.rar > 3DAnimation.cpp
#include "stdafx.h" #include "XMudClient.h" #include "D3DRMScreen.h" #include "3DSound.h" #include "3DFunction.h" #include "MainScreen.h" #include "MenuCreateNew.h" #include "Internetmsg.h" D3DVECTOR g_CameraPosition; extern LPDIRECT3DRMFRAME3 g_lpplayer; extern LPDIRECT3DRMFRAME3 g_pChaseFrame; extern LPDIRECT3DRMFRAME3 g_sFrame; extern LPDIRECT3DRM3 g_lpD3DRM; extern PathInfo info; extern rmfullglobals myglobs; extern int g_playerState; extern BOOL g_GetSameMove; extern CMainScreen m_MainScreen; extern CRITICAL_SECTION csAnimation; extern CListanimationlist; extern CList playerlist; extern int g_nReceiveMsgState,g_nGameState,nSpareTime,nRecTimes; float g_fightreadyDelta = 4.00f/40.0f; BOOL bRestartAlready=FALSE; extern SOCKET hLCltForRSvrSock; void __cdecl animationCallback(LPDIRECT3DRMFRAME3 obj, LPVOID arg, D3DVALUE delta) { D3DVECTOR *path; animationCallbackArgs* cb; animationCallbackArgs* cbfight; D3DVECTOR playerpos,sFramepos,pSoundPos,tmpSoundPos,camerapos; D3DVECTOR Npcposite; int i,j,k; BOOL bM = FALSE; TFightTag *lpFightTag; g_lpplayer->GetPosition(myglobs.scene, &playerpos); EnterCriticalSection(&csAnimation); j = animationlist.GetCount(); if(j < 2) { bM = TRUE; j = 3; } for(i=0;i frame3obj; if( i != 0 ){ if(cb->cXFileType == "NPC"){ switch( cb->PlayerState ){ case STOP: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if(cb->time > STOP_START + NUM_STOP_FRAMES) { cb->time = STOP_START; }else{ if(cb->way!=-1) { if(!m_MainScreen.bSelectOne) { cb->time = LEFTGO_START; cb->PlayerState = LEFTGO; } }else { cb->frame3obj->GetPosition(myglobs.scene,&Npcposite); g_pChaseFrame->SetPosition(myglobs.scene,Npcposite.x,Npcposite.y,playerpos.z); cb->frame3obj->LookAt(g_pChaseFrame,myglobs.scene,D3DRMCONSTRAIN_Z); } } } break; case LEFTGO: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta)*2; if(cb->time > LEFTGO_START + NUM_LEFTGO_FRAMES){ Npcposite = GetNextPosite(cb->frame3obj,cb); g_pChaseFrame->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); cb->frame3obj->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); cb->time = RIGHTGO_START; cb->PlayerState = RIGHTGO; } if(m_MainScreen.bSelectOne) { if(m_MainScreen.szSelectEName == cb->cXFileName) { cb->time = STOP_START; cb->PlayerState = STOP; } } } break; case RIGHTGO: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta)*2; if(cb->time > RIGHTGO_START + NUM_RIGHTGO_FRAMES){ Npcposite = GetNextPosite(cb->frame3obj,cb); g_pChaseFrame->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); cb->frame3obj->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); cb->time = LEFTGO_START; cb->PlayerState = LEFTGO; } if(m_MainScreen.bSelectOne) { if(m_MainScreen.szSelectEName == cb->cXFileName) { cb->time = STOP_START; cb->PlayerState = STOP; } } } break; case FIGHTREADY: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time > FIGHTREADY_START + NUM_FIGHTREADY_FRAMES) { k = cb->fightopplist.GetCount(); if(k==0)break; k = rand()%k; lpFightTag = cb->fightopplist.GetAt(cb->fightopplist.FindIndex(k)); cbfight = animationlist.GetAt(lpFightTag->tagPosite); switch(rand()%10) { case 0: { cb->time = HAND_START; cb->PlayerState = HAND; switch( rand() % 2 ) { case 0: cbfight->time = WOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = WOUND; else cbfight->PlayerState = WOUND; break; case 1: cbfight->time = GURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = GURAD; else cbfight->PlayerState = GURAD; break; } } break; case 1: { cb->time = FOOT_START; cb->PlayerState = FOOT; switch( rand() % 2 ) { case 0: cbfight->time = WOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = WOUND; else cbfight->PlayerState = WOUND; break; case 1: cbfight->time = GURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = GURAD; else cbfight->PlayerState = GURAD; break; } } break; case 2://NPC受傷,有可能被拳擊中,也有可能被踢中,也有可能對手泰山壓頂 { cb->time = WOUND_START; cb->PlayerState = WOUND; switch( rand() % 4 ) { case 0: cbfight->time = HAND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HAND; else cbfight->PlayerState = HAND; break; case 1: cbfight->time = FOOT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOT; else cbfight->PlayerState = FOOT; break; case 2: cbfight->time = HANDEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXT; else cbfight->PlayerState = HANDEXT; break; case 3: cbfight->time = FOOTEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTEXT; else cbfight->PlayerState = FOOTEXT; break; } } break; case 3: { cb->time = GURAD_START; cb->PlayerState = GURAD; switch( rand() % 2 ){ case 0: cbfight->time = HAND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HAND; else cbfight->PlayerState = HAND; break; case 1: cbfight->time = HANDEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXT; else cbfight->PlayerState = HANDEXT; break; } } break; case 4: { cb->time = HANDEXTGURAD_START; cb->PlayerState = HANDEXTGURAD; switch( rand() % 3 ){ case 0: cbfight->time = HAND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HAND; else cbfight->PlayerState = HAND; break; case 1: cbfight->time = HANDEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXT; else cbfight->PlayerState = HANDEXT; break; case 2: cbfight->time = FOOTEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTEXT; else cbfight->PlayerState = FOOTEXT; break; } } break; case 5: { cb->time = HANDEXT_START; cb->PlayerState = HANDEXT; switch( rand() % 3 ){ case 0: cbfight->time = WOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = WOUND; else cbfight->PlayerState = WOUND; break; case 1: cbfight->time = HANDEXTGURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXTGURAD; else cbfight->PlayerState = HANDEXTGURAD; break; case 2: cbfight->time = GURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = GURAD; else cbfight->PlayerState = GURAD; break; } } break; case 6: { cb->time = FOOTEXT_START; cb->PlayerState = FOOTEXT; switch( rand() % 2 ) { case 0: cbfight->time = WOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = WOUND; else cbfight->PlayerState = WOUND; break; case 1: cbfight->time = HANDEXTGURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXTGURAD; else cbfight->PlayerState = HANDEXTGURAD; break; } } break; case 7: { cb->time = FOOTLOW_START; cb->PlayerState = FOOTLOW; switch( rand() % 2 ){ case 0: cbfight->time = FOOTLOWWOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTLOWWOUND; else cbfight->PlayerState = FOOTLOWWOUND; break; case 1: cbfight->time = FOOTLOWGURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTLOWGURAD; else cbfight->PlayerState = FOOTLOWGURAD; break; } } break; case 8: { cb->time = FOOTLOWWOUND_START; cb->PlayerState = FOOTLOWWOUND; cbfight->time = FOOTLOW_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTLOW; else cbfight->PlayerState = FOOTLOW; } break; case 9: { cb->time = FOOTLOWGURAD_START; cb->PlayerState = FOOTLOWGURAD; cbfight->time = FOOTLOW_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTLOW; else cbfight->PlayerState = FOOTLOW; break; } } } } break; case HAND: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >HAND_START + NUM_HAND_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case HANDEXT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time > HANDEXT_START + NUM_HAND_FRAMES) { obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOT_START + NUM_FOOT_FRAMES) { obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOTEXT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTEXT_START + NUM_FOOT_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOTLOW: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTLOW_START + NUM_FOOT_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case WOUND: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >WOUND_START + NUM_WOUND_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOTLOWWOUND: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTLOWWOUND_START + NUM_FOOT_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case GURAD: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >GURAD_START + NUM_GURAD_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case HANDEXTGURAD: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >HANDEXTGURAD_START + NUM_HAND_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOTLOWGURAD: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTLOWGURAD_START + NUM_HAND_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case DAZUO: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >DAZUO_START + NUM_DAZUO_FRAMES) cb->time = DAZUO_START; } break; case SLEEP: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >SLEEP_START + NUM_SLEEP_FRAMES) cb->time = SLEEP_START; } break; case DEAD: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >DEAD_START + NUM_DEAD_FRAMES) cb->time = DEAD_START; } break; case DRINK: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >DRINK_START + NUM_DRINK_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; case EAT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >EAT_START + NUM_EAT_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; case PRACTICE: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >PRACTICE_START + NUM_PRACTICE_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; case KETOU: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >KETOU_START + NUM_KETOU_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; } }else if(cb->cXFileType == "OTHERPLAY"){ switch(cb->PlayerState){ case STOP: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time > STOP_START + NUM_STOP_FRAMES){ cb->time = STOP_START; }else{ if(!g_GetSameMove){ if(!m_MainScreen.bSelectOne){ cb->time = LEFTGO_START; cb->PlayerState = LEFTGO; } } } } break; case LEFTGO: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta)*2; if(cb->time > LEFTGO_START + NUM_LEFTGO_FRAMES){ if(!g_GetSameMove){ Npcposite = GetNextPosite(cb->frame3obj,cb); g_pChaseFrame->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); cb->frame3obj->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); }else{ if(cb->pathlist.IsEmpty()){ cb->time = STOP_START; cb->PlayerState = STOP; break; } path = cb->pathlist.GetHead(); g_pChaseFrame->SetPosition( myglobs.scene,path->x, path->y, path->z); cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); cb->frame3obj->SetPosition( myglobs.scene,path->x, path->y, path->z); cb->pathlist.RemoveHead(); delete path; } cb->time = RIGHTGO_START; cb->PlayerState = RIGHTGO; } if(m_MainScreen.bSelectOne) { if(m_MainScreen.szSelectEName == cb->cXFileName) { cb->time = STOP_START; cb->PlayerState = STOP; } } } break; case RIGHTGO: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta)*2; if(cb->time > RIGHTGO_START + NUM_RIGHTGO_FRAMES){ if(!g_GetSameMove) { Npcposite = GetNextPosite(cb->frame3obj,cb); g_pChaseFrame->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); cb->frame3obj->SetPosition( myglobs.scene,Npcposite.x, Npcposite.y, Npcposite.z); } else { if(cb->pathlist.IsEmpty()) { cb->time = STOP_START; cb->PlayerState = STOP; break; } path = cb->pathlist.GetHead(); g_pChaseFrame->SetPosition( myglobs.scene,path->x, path->y, path->z); cb->frame3obj->LookAt( g_pChaseFrame, myglobs.scene,D3DRMCONSTRAIN_Z); cb->frame3obj->SetPosition( myglobs.scene,path->x, path->y, path->z); cb->pathlist.RemoveHead(); delete path; } cb->time = LEFTGO_START; cb->PlayerState = LEFTGO; } if(m_MainScreen.bSelectOne) { if(m_MainScreen.szSelectEName == cb->cXFileName) { cb->time = STOP_START; cb->PlayerState = STOP; } } } break; case FIGHTREADY: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FIGHTREADY_START + NUM_FIGHTREADY_FRAMES) { k = cb->fightopplist.GetCount(); if(k==0)break; k = rand()%k; lpFightTag = cb->fightopplist.GetAt(cb->fightopplist.FindIndex(k)); cbfight = animationlist.GetAt(lpFightTag->tagPosite); switch(rand()%10){ case 0: cb->time = HAND_START; cb->PlayerState = HAND; switch( rand() % 2 ){ case 0: cbfight->time = WOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = WOUND; else cbfight->PlayerState = WOUND; break; case 1: cbfight->time = GURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = GURAD; else cbfight->PlayerState = GURAD; break; } break; case 1: cb->time = FOOT_START; cb->PlayerState = FOOT; switch( rand() % 2 ){ case 0: cbfight->time = WOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = WOUND; else cbfight->PlayerState = WOUND; break; case 1: cbfight->time = GURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = GURAD; else cbfight->PlayerState = GURAD; break; } break; case 2://NPC受傷,有可能被拳擊中,也有可能被踢中,也有可能對手泰山壓頂 cb->time = WOUND_START; cb->PlayerState = WOUND; switch( rand() % 4 ) { case 0: cbfight->time = HAND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HAND; else cbfight->PlayerState = HAND; break; case 1: cbfight->time = FOOT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOT; else cbfight->PlayerState = FOOT; break; case 2: cbfight->time = HANDEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXT; else cbfight->PlayerState = HANDEXT; break; case 3: cbfight->time = FOOTEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTEXT; else cbfight->PlayerState = FOOTEXT; break; } break; case 3: cb->time = GURAD_START; cb->PlayerState = GURAD; switch( rand() % 2 ) { case 0: cbfight->time = HAND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HAND; else cbfight->PlayerState = HAND; break; case 1: cbfight->time = HANDEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXT; else cbfight->PlayerState = HANDEXT; break; } break; case 4: cb->time = HANDEXTGURAD_START; cb->PlayerState = HANDEXTGURAD; switch( rand() % 3 ){ case 0: cbfight->time = HAND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HAND; else cbfight->PlayerState = HAND; break; case 1: cbfight->time = HANDEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXT; else cbfight->PlayerState = HANDEXT; break; case 2: cbfight->time = FOOTEXT_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTEXT; else cbfight->PlayerState = FOOTEXT; break; } break; case 5: cb->time = HANDEXT_START; cb->PlayerState = HANDEXT; switch( rand() % 3 ){ case 0: cbfight->time = WOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = WOUND; else cbfight->PlayerState = WOUND; break; case 1: cbfight->time = HANDEXTGURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXTGURAD; else cbfight->PlayerState = HANDEXTGURAD; break; case 2: cbfight->time = GURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = GURAD; else cbfight->PlayerState = GURAD; break; } break; case 6: cb->time = FOOTEXT_START; cb->PlayerState = FOOTEXT; switch( rand() % 2 ){ case 0: cbfight->time = WOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = WOUND; else cbfight->PlayerState = WOUND; break; case 1: cbfight->time = HANDEXTGURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = HANDEXTGURAD; else cbfight->PlayerState = HANDEXTGURAD; break; } break; case 7: cb->time = FOOTLOW_START; cb->PlayerState = FOOTLOW; switch( rand() % 2 ){ case 0: cbfight->time = FOOTLOWWOUND_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTLOWWOUND; else cbfight->PlayerState = FOOTLOWWOUND; break; case 1: cbfight->time = FOOTLOWGURAD_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTLOWGURAD; else cbfight->PlayerState = FOOTLOWGURAD; break; } break; case 8: cb->time = FOOTLOWWOUND_START; cb->PlayerState = FOOTLOWWOUND; cbfight->time = FOOTLOW_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTLOW; else cbfight->PlayerState = FOOTLOW; break; case 9: cb->time = FOOTLOWGURAD_START; cb->PlayerState = FOOTLOWGURAD; cbfight->time = FOOTLOW_START; if( cbfight->cXFileName.IsEmpty() ) g_playerState = FOOTLOW; else cbfight->PlayerState = FOOTLOW; break; } } } break; case HAND: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >HAND_START + NUM_HAND_FRAMES) { obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case HANDEXT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time > HANDEXT_START + NUM_HAND_FRAMES) { obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOT_START + NUM_FOOT_FRAMES) { obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOTEXT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTEXT_START + NUM_FOOT_FRAMES) { obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOTLOW: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTLOW_START + NUM_FOOT_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case WOUND: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >WOUND_START + NUM_WOUND_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOTLOWWOUND: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTLOWWOUND_START + NUM_FOOT_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case GURAD: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >GURAD_START + NUM_GURAD_FRAMES) { obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case HANDEXTGURAD: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >HANDEXTGURAD_START + NUM_HAND_FRAMES) { obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOTLOWGURAD: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTLOWGURAD_START + NUM_HAND_FRAMES){ obj->GetPosition(myglobs.scene, &tmpSoundPos); pSoundPos.x = tmpSoundPos.z - playerpos.z; pSoundPos.y = 0.0f; pSoundPos.z = tmpSoundPos.x - playerpos.x; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case DAZUO: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >DAZUO_START + NUM_DAZUO_FRAMES) cb->time = DAZUO_START; } break; case SLEEP: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >SLEEP_START + NUM_SLEEP_FRAMES) cb->time = SLEEP_START; } break; case DEAD: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >DEAD_START + NUM_DEAD_FRAMES) cb->time = DEAD_START; } break; case DRINK: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >DRINK_START + NUM_DRINK_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; case EAT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >EAT_START + NUM_EAT_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; case PRACTICE: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >PRACTICE_START + NUM_PRACTICE_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; case KETOU: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >KETOU_START + NUM_KETOU_FRAMES){ cb->time = STOP_START; g_playerState = STOP; } } break; } } } else{ switch(g_playerState){ case STOP: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time > STOP_START + NUM_STOP_FRAMES) { cb->time = STOP_START; } } break; case LEFTGO: { cb->animset->SetTime(cb->time); cb->time += delta; if(cb->time > LEFTGO_START + NUM_LEFTGO_FRAMES) { if(cb->pathlist.IsEmpty()) { if(cb->iAimSite != 0) { if(g_sFrame) { cb->iAimSite = 0; g_sFrame->GetPosition(myglobs.scene, &sFramepos); g_lpplayer->GetPosition(myglobs.scene, &playerpos); if( fabs(sFramepos.x - playerpos.x)<1.8f && fabs(sFramepos.z - playerpos.z)<1.0f) { if(BumpAndShowMsg()) { cb->time = STOP_START; g_playerState = STOP; break; } } } } cb->time = STOP_START; g_playerState = STOP; break; } //g_lpplayer->GetPosition(myglobs.scene, &playerpos); myglobs.camera->GetPosition(myglobs.scene,&camerapos); path = cb->pathlist.GetHead(); camerapos.x += path->x - playerpos.x; camerapos.z += path->z - playerpos.z; g_pChaseFrame->SetPosition(myglobs.scene,path->x,path->y,path->z); g_lpplayer->LookAt(g_pChaseFrame,myglobs.scene,D3DRMCONSTRAIN_Z); g_lpplayer->SetPosition(myglobs.scene,path->x,path->y,path->z); myglobs.camera->SetPosition(myglobs.scene,camerapos.x,camerapos.y,camerapos.z); myglobs.camera->LookAt(g_lpplayer,myglobs.scene,D3DRMCONSTRAIN_Z); myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); cb->pathlist.RemoveHead(); delete path; cb->time = RIGHTGO_START; g_playerState = RIGHTGO; } } break; case RIGHTGO: { cb->animset->SetTime(cb->time); cb->time += delta; if(cb->time > RIGHTGO_START + NUM_RIGHTGO_FRAMES){ if(cb->pathlist.IsEmpty()){ if(cb->iAimSite != 0){ if(g_sFrame) { g_sFrame->GetPosition(myglobs.scene, &sFramepos); g_lpplayer->GetPosition(myglobs.scene, &playerpos); cb->iAimSite = 0; if( fabs(sFramepos.x - playerpos.x)<1.0f && fabs(sFramepos.z - playerpos.z)<1.0f) { if(BumpAndShowMsg()) { cb->time = STOP_START; g_playerState = STOP; break; } } } } cb->time = STOP_START; g_playerState = STOP; break; } myglobs.camera->GetPosition(myglobs.scene,&camerapos); path = cb->pathlist.GetHead(); camerapos.x += path->x - playerpos.x; camerapos.z += path->z - playerpos.z; g_pChaseFrame->SetPosition(myglobs.scene,path->x,path->y,path->z); g_lpplayer->LookAt(g_pChaseFrame,myglobs.scene,D3DRMCONSTRAIN_Z); g_lpplayer->SetPosition(myglobs.scene,path->x,path->y,path->z); myglobs.camera->SetPosition(myglobs.scene,camerapos.x,camerapos.y,camerapos.z); myglobs.camera->LookAt(g_lpplayer,myglobs.scene,D3DRMCONSTRAIN_Z); myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); cb->pathlist.RemoveHead(); delete path; cb->time = LEFTGO_START; g_playerState = LEFTGO; } } break; case FIGHTREADY: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FIGHTREADY_START + NUM_FIGHTREADY_FRAMES) cb->time = FIGHTREADY_START; } break; case HAND: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >HAND_START + NUM_HAND_FRAMES){ pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; g_playerState = FIGHTREADY; } } break; case HANDEXT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >HANDEXT_START + NUM_HAND_FRAMES){ pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOT_START + NUM_FOOT_FRAMES) { pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; g_playerState = FIGHTREADY; } } break; case FOOTEXT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTEXT_START + NUM_FOOT_FRAMES) { pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; g_playerState = FIGHTREADY; } } break; case FOOTLOW: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTLOW_START + NUM_FOOT_FRAMES) { pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; g_playerState = FIGHTREADY; } } break; case WOUND: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >WOUND_START + NUM_WOUND_FRAMES){ pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; g_playerState = FIGHTREADY; } } break; case FOOTLOWWOUND: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTLOWWOUND_START + NUM_FOOT_FRAMES) { pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; g_playerState = FIGHTREADY; } } break; case GURAD: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >GURAD_START + NUM_GURAD_FRAMES){ pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; g_playerState = FIGHTREADY; } } break; case HANDEXTGURAD: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >HANDEXTGURAD_START + NUM_HAND_FRAMES){ pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case FOOTLOWGURAD: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >FOOTLOWGURAD_START + NUM_FOOT_FRAMES) { pSoundPos.x = 0.0f; pSoundPos.y = 0.0f; pSoundPos.z = 0.0f; cb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; } } break; case DAZUO: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >DAZUO_START + NUM_DAZUO_FRAMES) cb->time = DAZUO_START; } break; case SLEEP: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >SLEEP_START + NUM_SLEEP_FRAMES) cb->time = SLEEP_START; } break; case DEAD: { if(bRestartAlready) { CPlayerInfo *lpPlayerInfo = playerlist.GetHead(); bRestartAlready=FALSE; g_playerState = STOP; lpPlayerInfo->m_iSTATUS = AOS_none; cb->time = STOP_START; cb->PlayerState = STOP; } else { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >DEAD_START + NUM_DEAD_FRAMES) cb->time = DEAD_START; } } break; case DRINK: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >DRINK_START + NUM_DRINK_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; case EAT: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >EAT_START + NUM_EAT_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; case PRACTICE: { cb->animset->SetTime(cb->time); cb->time += delta; if( cb->time >PRACTICE_START + NUM_PRACTICE_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; case KETOU: { cb->animset->SetTime(cb->time); cb->time += (g_fightreadyDelta*delta); if( cb->time >KETOU_START + NUM_KETOU_FRAMES) { cb->time = STOP_START; g_playerState = STOP; } } break; } }//end if() }//end for() LeaveCriticalSection(&csAnimation); } void __cdecl animationDestroyCallback(LPDIRECT3DRMOBJECT pFrame, LPVOID pvArg) { LPDIRECT3DRMANIMATIONSET2 pAnim = (LPDIRECT3DRMANIMATIONSET2)pvArg; pAnim->Release(); } D3DVECTOR GetNextPosite(LPDIRECT3DRMFRAME3 npcframe,animationCallbackArgs * lpanimate) { LPDIRECT3DRMFRAMEARRAY frames; LPDIRECT3DRMFRAME frame; LPDIRECT3DRMFRAME3 pFrame3; LPDIRECT3DRMFRAME3 roomFrame3; D3DVECTOR oldPos,tmpPos; npcframe->GetPosition( myglobs.scene,&tmpPos); oldPos.x = tmpPos.x; oldPos.z = tmpPos.z; myglobs.scene->GetChildren(&frames); frames->GetElement( 5, &frame); frame->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame3); roomFrame3 = pFrame3; switch(lpanimate->way) { case 0: if(searchpath(tmpPos,roomFrame3,0.0f,(0.2f))) { tmpPos.z += 0.2f; } break; case 1: if(searchpath(tmpPos,roomFrame3,(-0.2f),0.2f)) { tmpPos.x += -0.2f; tmpPos.z += 0.2f; } break; case 2: if(searchpath(tmpPos,roomFrame3,0.0f,(-0.2f))) { tmpPos.z += -0.2f; } break; case 3: if(searchpath(tmpPos,roomFrame3,0.2f,0.0f)) { tmpPos.x += 0.2f; } break; case 4: if(searchpath(tmpPos,roomFrame3,(-0.2f),0.0f)) { tmpPos.x += -0.2f; } break; case 5: if(searchpath(tmpPos,roomFrame3,0.2f,0.2f)) { tmpPos.x += 0.2f; tmpPos.z += 0.2f; } break; case 6: if(searchpath(tmpPos,roomFrame3,0.2f,(-0.2f))) { tmpPos.x += 0.2f; tmpPos.z += -0.2f; } break; case 7: if(searchpath(tmpPos,roomFrame3,(-0.2f),(-0.2f))){ tmpPos.x += -0.2f; tmpPos.z += -0.2f; } break; default: lpanimate->time = STOP_START; lpanimate->PlayerState = STOP; break; } if(lpanimate->nSteps >= 15){ lpanimate->nSteps = 0; lpanimate->way = rand()%12; }else { lpanimate->nSteps++; } if(oldPos.x == tmpPos.x && oldPos.z == tmpPos.z){ lpanimate->nSteps = 0; lpanimate->way = rand()%8; } roomFrame3->Release(); pFrame3->Release(); frames->Release(); frame->Release(); return tmpPos; } void OtherFight(CString szCWho,CString szWho,CString szCWho2,CString szWho2) { animationCallbackArgs *cb, * cb1=NULL, * cb2=NULL; POSITION posite1,posite2; POSITION pos,lastpos; D3DVECTOR fighttagpos; pos = animationlist.GetHeadPosition(); while(pos != NULL){ lastpos = pos; cb = animationlist.GetNext(pos); if((szWho == cb->cXFileName)&&(szCWho == cb->cCName)){ cb1 = cb; posite1 = lastpos; }else if((szWho2 == cb->cXFileName)&&(szCWho2 == cb->cCName)){ cb2 = cb; posite2 = lastpos; } } if((cb1 == NULL)||(cb2 == NULL)) { ASSERT(FALSE); return; } cb1->frame3obj->GetPosition(myglobs.scene,&fighttagpos); cb1->PlayerState = FIGHTREADY; cb1->time = FIGHTREADY_START; cb2->PlayerState = FIGHTREADY; cb2->time = FIGHTREADY_START; cb1->frame3obj->SetPosition(myglobs.scene,fighttagpos.x-0.5f,fighttagpos.y,fighttagpos.z); cb2->frame3obj->SetPosition(myglobs.scene,fighttagpos.x+0.5f,fighttagpos.y,fighttagpos.z); cb1->frame3obj->LookAt(cb2->frame3obj,myglobs.scene,D3DRMCONSTRAIN_Z); cb2->frame3obj->LookAt(cb1->frame3obj,myglobs.scene,D3DRMCONSTRAIN_Z); TFightTag * lpFightTag = new TFightTag; lpFightTag->tagPosite = posite2; cb1->fightopplist.AddTail(lpFightTag); lpFightTag = new TFightTag; lpFightTag->tagPosite = posite1; cb2->fightopplist.AddTail(lpFightTag); } void DoFight(CString szWho,int iFightKind) { D3DVECTOR tagPos; animationCallbackArgs *cb = NULL, *selfcb; myglobs.camera->DeleteMoveCallback(MoveCameraCallback,&info); m_MainScreen.bFaceSomeOne[0] = FALSE; m_MainScreen.bFaceSomeOne[1] = FALSE; m_MainScreen.bSelectOne = FALSE; int numPts = 8; g_lpplayer->GetPosition(myglobs.scene,&tagPos); g_lpplayer->SetPosition(myglobs.scene,tagPos.x,tagPos.y,tagPos.z); POSITION lastpos, pos = animationlist.GetHeadPosition(); while(pos != NULL){ lastpos = pos; cb = animationlist.GetNext(pos); if(cb->cXFileName == szWho) break; cb = NULL; } if(cb == NULL) { ASSERT(FALSE); return; } cb->frame3obj->SetPosition(myglobs.scene,tagPos.x+1.0f,tagPos.y,tagPos.z); g_pChaseFrame->SetPosition(myglobs.scene,tagPos.x+0.5f,tagPos.y+0.5f,tagPos.z); g_lpplayer->LookAt(cb->frame3obj,myglobs.scene,D3DRMCONSTRAIN_Z); cb->frame3obj->LookAt(g_lpplayer,myglobs.scene,D3DRMCONSTRAIN_Z); if(g_playerState != FIGHTREADY) { myglobs.camera->GetPosition(myglobs.scene,&g_CameraPosition); } myglobs.camera->SetPosition(myglobs.scene,tagPos.x+0.5f,tagPos.y+3.5f,tagPos.z-8.0f); myglobs.camera->LookAt(g_pChaseFrame,myglobs.scene,D3DRMCONSTRAIN_Z); g_playerState = FIGHTREADY; selfcb = animationlist.GetHead(); selfcb->time = FIGHTREADY_START; cb->PlayerState = FIGHTREADY; cb->time = FIGHTREADY_START; CPlayerInfo *lpPlayerInfo = playerlist.GetHead(); lpPlayerInfo = playerlist.GetHead(); lpPlayerInfo->m_iSTATUS = iFightKind; TFightTag * lpFightTag = new TFightTag; lpFightTag->tagPosite = lastpos; selfcb->fightopplist.AddTail(lpFightTag); lpFightTag = new TFightTag; lpFightTag->tagPosite = animationlist.FindIndex(0); cb->fightopplist.AddTail(lpFightTag); } void StopOther(POSITION posite) { POSITION pos, lastpos; POSITION pos2, lastpos2; animationCallbackArgs *cb, *cbOther, *cbself; TFightTag * lpFightTag, *lpFightTag2; cbself = animationlist.GetHead(); cb = animationlist.GetAt(posite); pos = cb->fightopplist.GetHeadPosition(); while(pos != NULL){ lastpos = pos; lpFightTag = cb->fightopplist.GetNext(pos); cbOther = animationlist.GetAt(lpFightTag->tagPosite); pos2 = cbOther->fightopplist.GetHeadPosition(); while(pos2 != NULL) { lastpos2 = pos2; lpFightTag2 = cbOther->fightopplist.GetNext(pos2); if(lpFightTag2->tagPosite == posite){ cbOther->fightopplist.RemoveAt(lastpos2); delete lpFightTag2; break; } } if(cbOther->fightopplist.GetCount() == 0) { cbOther->PlayerState = STOP; cbOther->time = STOP_START; D3DVECTOR tagPos; cbOther->frame3obj->GetPosition(myglobs.scene, &tagPos); tagPos.y = 0; cbOther->frame3obj->SetPosition(myglobs.scene, tagPos.x,tagPos.y,tagPos.z); if(cbOther == cbself) { g_playerState = STOP; CPlayerInfo *lpPlayerInfo = playerlist.GetHead(); lpPlayerInfo->m_iSTATUS = AOS_none; } } cb->fightopplist.RemoveAt(lastpos); delete lpFightTag; } }