fVector3 CEngineInterface::GetSacle(VOID) const { register Fairy::TerrainData* pTerrainData = m_pFairySystem->getTerrainData(); if(pTerrainData && pTerrainData->getXSize()>0 && pTerrainData->getZSize()>0) return fVector3(pTerrainData->mScale.x, pTerrainData->mScale.y, pTerrainData->mScale.z); else return fVector3(100.0f, 100.0f, 100.0f); }
fVector3 CRenderSystem::GetSacle(VOID) const { register WX::TerrainData* pTerrainData = m_pRenderSystem->getTerrainData(); if(pTerrainData && pTerrainData->getXSize()>0 && pTerrainData->getZSize()>0) return fVector3(pTerrainData->mScale.x, pTerrainData->mScale.y, pTerrainData->mScale.z); else return fVector3(100.0f, 100.0f, 100.0f); }
VOID CEngineInterface::Camera_GetWindowToViewportRay(INT nX, INT nY, fRay& fRay) { Ogre::Ray ray = m_pFairySystem->getWindowToViewportRay(nX, nY); fVector3 fGFX = fVector3(ray.getOrigin().x, ray.getOrigin().y, ray.getOrigin().z); Axis_Trans(AX_GFX, fGFX, AX_GAME, fRay.mOrigin); fRay.mDirection = fVector3(ray.getDirection().x, ray.getDirection().y, ray.getDirection().z); }
CCamera_CharSel::CCamera_CharSel(Ogre::Camera* pOgreCamera) : CCamera(pOgreCamera) { m_fvLookatPos = fVector3(0.0f, 80.0f, 0.0f); m_fvGameLookatPos = fVector3(0.0f, 80.0f, 0.0f); m_fPitch = 0.0f; m_fDistance = 250.0f; m_fDirection = KLU_PI; Update(); }
void Draw::DrawLine(const fPoint &start, const fPoint &end, const cColorRGBA &color) { VertexDraw2D *buffer = LE_DrawManager.GetVertexBuffer2D(2); fSize screenSize(LE_DrawManager.GetVirtualScreenSize()); buffer[0].SetPosition(fVector3(start)/screenSize); buffer[0].SetColor(color); buffer[1].SetPosition(fVector3(end)/screenSize); buffer[1].SetColor(color); LE_DrawManager.Draw2DFlush(GraphicsFlag::PT_LINELIST); }
fVector3 GOFactory::GetCenter(Tile* p_tile, float p_depth) { if (p_tile) { float w = p_tile->getWidth(); float h = p_tile->getHeight(); TilePosition tp = p_tile->getTilePosition(); return fVector3(tp.x * w + w * 0.5f, tp.y * h + h * 0.5f, p_depth); } return fVector3(0, 0, 0); }
VOID CObject_Bus::Initial(VOID* pParam) { CObject_Dynamic::Initial(pParam); RemoveAllPassengers(); m_fvMoveTargetPos = fVector3(-1.f, -1.f, -1.f); m_bMoving = FALSE; m_pBusData = NULL; m_nCurrentAnimationIndex = -1; SObject_BusInit *pBusInit = (SObject_BusInit*)pParam; if(pBusInit != NULL) { m_nDataID = pBusInit->m_nDataID; INT i; for(i = 0; i < pBusInit->m_nPassengerCount; i++) { AddPassenger(i, pBusInit->m_anPassengerIDs[i]); } } else { m_nDataID = INVALID_ID; } UpdateData(); UpdateAnimation(); }
CObject_Dynamic::CObject_Dynamic() { m_bServerPath = FALSE; m_dwPathID = UINT_MAX; m_posPathNodePrev = fVector3( 0.f, 0.f, 0.f ); }
fVector3 KLU_RotateAngle(const fVector3& pos, const fVector3& axis, FLOAT angle) { const fVector3 vector = pos; fVector3 unitAxis = axis; unitAxis.normalise(); const float halfAngle = angle/float(2); const float s = sin(halfAngle); const float c = cos(halfAngle); const float x = unitAxis.x * s; const float y = unitAxis.y * s; const float z = unitAxis.z * s; const float w = c; const float xx = x*x; const float xy = y*x; const float xz = z*x; const float yy = y*y; const float yz = z*y; const float zz = z*z; const float wx = w*x; const float wy = w*y; const float wz = w*z; const float M[3][3] = { {float(1)-float(2)*(yy+zz), float(2)*(xy-wz), float(2)*(xz+wy)}, {float(2)*(xy+wz), float(1)-float(2)*(xx+zz), float(2)*(yz-wx)}, {float(2)*(xz-wy), float(2)*(yz+wx), float(1)-float(2)*(xx+yy)}, }; return fVector3( vector.x*M[0][0] + vector.y*M[0][1] + vector.z*M[0][2], vector.x*M[1][0] + vector.y*M[1][1] + vector.z*M[1][2], vector.x*M[2][0] + vector.y*M[2][1] + vector.z*M[2][2] ); }
// 把一个物体放到指定得摄影机位置 void CFakeObjectEntityManager::CreateObject(LPCTSTR szObjName, CObjEntityActor* pNode, CObjEntityActor* pAttachNode, LPCTSTR szCameraName, int nTexWidth, int nTexHeight, LPCTSTR szBackgroundName) { // 先根据该fake object的名称来获取摆放位置 m_fvPosition = Ogre::Vector3(_GetFakeObjPos(szObjName), 10000.f, 0.f); //物体不存在,创建新的渲染环境 FakeObjectMap::iterator it = _GetFakeNode(szObjName, pNode, szCameraName, nTexWidth, nTexHeight, szBackgroundName); if(it == m_mapObject.end()) return; it->second.pEntityNode = pNode; it->second.pAttachEntityNode = pAttachNode; //将需要渲染的实体放入渲染环境中 // 如果骑在马上的,要设置马的位置,把人的位置复位 Fairy::LogicModel* modelImpl = pNode->GetActorImpl(); if (modelImpl->isAttached()) { Fairy::LogicModel* parentModel = modelImpl->getAttachModel(); KLAssert (parentModel); modelImpl->setPosition(Ogre::Vector3(0.0f, 0.0f, 0.0f)); parentModel->setPosition(Ogre::Vector3(m_fvPosition.x, m_fvPosition.y, m_fvPosition.z)); parentModel->setVisible(true); } else pNode->SetGfxPosition(fVector3(m_fvPosition.x, m_fvPosition.y, m_fvPosition.z)); //初始就显示,在运行过程中会一直保持visible为true的状态 pNode->SetVisible(TRUE); }
MenuItem* GOFactory::createMenuItem( fVector3 p_position, fVector2 p_size, string p_text, fVector2 p_textOffset, fVector2 p_fontSize, string p_bgTexPath) { float scrW = GAME_FAIL; float scrH = GAME_FAIL; if(m_io != NULL) { scrW = (float)m_io->getScreenWidth(); scrH = (float)m_io->getScreenHeight(); } fVector2 finalPos, finalTextOffset; finalPos.x = scrW * (p_position.x); finalPos.y = scrH * (p_position.y); finalTextOffset.x = scrW * (p_textOffset.x); finalTextOffset.y = scrH * (p_textOffset.y); SpriteInfo* spriteInfo = NULL; if( p_bgTexPath != "" ) spriteInfo = CreateSpriteInfo( p_bgTexPath, fVector3(finalPos.x, finalPos.y, p_position.z), fVector2(p_size.x*scrW, p_size.y*scrH), NULL ); GlyphMap* font = NULL; TextArea* text = NULL; if( p_text != "" ) { text = createMenuItemTextArea(p_position, p_text, p_textOffset, p_fontSize ); text->setText( p_text ); } return new MenuItem( spriteInfo, text, finalPos, finalTextOffset ); }
MenuSubState* MenuSubStateFactory::createMain() { MenuSubState* tmp = createMenuSubState(); vector<string> texts = createMainTexts(); MenuItemProperties props = createMainProperties(); vector<MenuItem*> items = createItems( props, texts ); float fw = 1.0f/1920.0f; float fh = 1.0f/1080.0f; // Add logo! items.push_back( m_gof->createMenuItem( fVector3( 0.5f, 0.66f, 0.7f ), fVector2( 960.0f*fw, 525.0f*fh ), "", fVector2(0.0f, 0.0f), fVector2(fw*20, fh*20), "../Textures/logo.png" )); tmp->addItems( items ); tmp->setBehaviour( new MainSubState() ); tmp->setAllSelectable(); tmp->setSelectable( MainSubState::MM_NUM_ITEMS, false ); tmp->setMenuBackSnd( m_gof->CreateSoundInfo( m_menuBackSoundPath, 80 ) ); tmp->setMenuNavigatonSnd( m_gof->CreateSoundInfo( m_navigationSoundPath, 80 ) ); tmp->setItemSelectSnd( m_gof->CreateSoundInfo( m_itemSelectSoundPath, 80 ) ); return tmp; }
CSoundSystemFMod::CSoundSystemFMod() { s_pMe = this; m_bMuteAll = FALSE; m_fMasterGain = 1.0f; m_vListenerPos = fVector3(0.0f, 0.0f, 0.0f); }
Glyph* GOFactory::CreateGlyph( const string& p_texture, float p_x, float p_y, fVector2 p_size, vector<GlyphAnimation*> p_animations ) { fVector3 pos = fVector3(p_x, p_y, 0.99f); SpriteInfo* spriteInfo = CreateSpriteInfo(p_texture,pos, p_size, NULL); // spriteInfo->visible = false; return new Glyph( spriteInfo ); }
// 压入一条指令 BOOL CObject_Bus::PushCommand(const SCommand_Object *pCmd) { switch(pCmd->m_wID) { case OC_BUS_MOVE: { FLOAT x = pCmd->m_afParam[0]; FLOAT y = pCmd->m_afParam[1]; FLOAT z = pCmd->m_afParam[2]; fVector3 fvGame(x, y, z); StartMove(&fvGame); } break; case OC_BUS_STOP_MOVE: { FLOAT x = pCmd->m_afParam[0]; FLOAT y = pCmd->m_afParam[1]; FLOAT z = pCmd->m_afParam[2]; fVector3 fvGame; CGameProcedure::s_pGfxSystem->Axis_Trans( tGfxSystem::AX_PLAN, fVector3(x, 0.0f, z), tGfxSystem::AX_GAME, fvGame); SetPosition(fvGame); StopMove(); } break; case OC_BUS_ADD_PASSENGER: { INT nIndex = pCmd->m_anParam[0]; INT nPassengerID = pCmd->m_anParam[1]; AddPassenger(nIndex, nPassengerID); } break; case OC_BUS_REMOVE_PASSENGER: { INT nPassengerID = pCmd->m_anParam[0]; RemovePassenger(nPassengerID); } break; case OC_BUS_REMOVE_ALL_PASSENGER: { RemoveAllPassengers(); } break; default: break; } return TRUE; }
VOID CObject_Bus::Release(VOID) { RemoveAllPassengers(); ReleaseRenderInterface(); m_nDataID = INVALID_ID; m_pBusData = NULL; m_fvMoveTargetPos = fVector3(-1.f, -1.f, -1.f); m_bMoving = FALSE; m_nCurrentAnimationIndex = -1; CObject_Dynamic::Release(); }
// 创建界面模型 int CGamePro_CharCreate::CreateModel() { if( m_pAvatar[0] ) { return TRUE; } fVector3 CharacterPos[ 2 ]; fVector3 SrcPos[ 2 ]; SrcPos[ 0 ] = fVector3(1000, 320, 1000); SrcPos[ 1 ] = fVector3( 1000, 320, 1000); s_pGfxSystem->Axis_Trans( s_pGfxSystem->AX_GFX, SrcPos[ 0 ],s_pGfxSystem->AX_GAME, CharacterPos[ 0 ] ); s_pGfxSystem->Axis_Trans( s_pGfxSystem->AX_GFX, SrcPos[ 1 ],s_pGfxSystem->AX_GAME, CharacterPos[ 1 ] ); // 创建Avatar m_pAvatar[0] = (CObject_PlayerOther*)( CFakeObjSystem::GetMe()->NewFakeObject(_T("CObject_PlayerOther"), _T("CreateRole_Woman"), "Camera_Main") ); m_pAvatar[1] = (CObject_PlayerOther*)( CFakeObjSystem::GetMe()->NewFakeObject(_T("CObject_PlayerOther"), _T("CreateRole_Man"), "Camera_Main") ); // 女模型 m_pAvatar[0]->SetFaceDir(0); m_pAvatar[0]->GetCharacterData()->Set_MenPai( CLIENT_GAOMO_MENPAI ); m_pAvatar[0]->GetCharacterData()->Set_RaceID( 2 ); //m_pAvatar[ 0 ]->SetPosition( CharacterPos[ 0 ] ); //m_pAvatar[ 0 ]->SetScale(100); // 设置缺省头发颜色 // m_pAvatar[0]->GetCharacterData()->Set_HairColor(0);| // 男模型 m_pAvatar[1]->SetFaceDir(0); m_pAvatar[1]->GetCharacterData()->Set_MenPai( CLIENT_GAOMO_MENPAI ); m_pAvatar[1]->GetCharacterData()->Set_RaceID( 3 ); //m_pAvatar[ 1 ]->SetPosition( CharacterPos[ 1 ] ); //m_pAvatar[ 1 ]->SetScale(100); // 设置缺省头发颜色 // m_pAvatar[1]->GetCharacterData()->Set_HairColor(0); return TRUE; }
CSoundSourceFMod::CSoundSourceFMod(BOOL b3DMode) { _Sample = NULL; _State = source_stoped; _Loop = TRUE; _b3DMode = b3DMode; _Gain = 1.0f; _Alpha = 0.0; _Pos= fVector3(0.0f, 0.0f, 0.0f); _FModChannel= -1; }
Tile* GOFactory::CreateTile(bool p_type, TilePosition p_position, float p_width, float p_height) { fVector3 pos = fVector3(p_position.x * p_width + p_width * 0.5f, p_position.y * p_height + p_height * 0.5f, 0.0f); fVector2 size = fVector2(p_width, p_height); SpriteInfo* spriteInfo = CreateSpriteInfo("../Textures/wall.png", pos, size, NULL); if (spriteInfo) spriteInfo->visible = !p_type; return new Tile(p_type, p_position, p_width, p_height, spriteInfo); }
CSoundSourceFMod::CSoundSourceFMod(INT id, Type type, BOOL b3DMode) { _ID = id; _Sample = 0; _State = source_stoped; _Loop = TRUE; _b3DMode = b3DMode; _Alpha = 0.0; _Pos= fVector3(0.0f, 0.0f, 0.0f); _FModChannel= -1; _nType = type; }
VOID CGamePro_CharCreate::Init(VOID) { //s_pGfxSystem->Scene_Load( -1, "yangliucun.scene" ); s_pGfxSystem->Camera_SetEyePos (fVector3(1000, 325, 1000)); s_pGfxSystem->Camera_SetLookAtPos(fVector3(1000, 320, 0)); if(0 == m_iIsLoadFace) { int res = m_FaceMng.GetCharacterFaceIfo(); if(0 == res) { m_iIsLoadFace = 1; } } if(0 == m_iIsLoadFaceModel) { int res = m_FaceModelmng.GetCharacterModel(); if(0 == res) { m_iIsLoadFaceModel = 1; } } if(0 == m_iIsLoadHairModel) { int res = m_HairModelMng.GetCharacterModel(); if(0 == res) { m_iIsLoadHairModel = 1; } } // 创建模型信息. CreateModel(); }
fVector3 CCamera_Scene::_GetEyePos( const fVector3& fvLookAt, FLOAT fDistance, FLOAT fDirection, FLOAT fPitch) { FLOAT y = fDistance * ::sin(-fPitch); FLOAT r_xy = fDistance * ::cos(-fPitch); FLOAT x = -r_xy * ::sin(fDirection); FLOAT z = -r_xy * ::cos(fDirection); return fVector3 ( fvLookAt.x + x, fvLookAt.y + y, fvLookAt.z + z); }
VOID CCamera_Scene::SetLookAt(const fVector3& fvPos) { m_fvGameLookatPos = fvPos; fVector3 fvTemp; if(!CEngineInterface::GetMe()->Axis_Trans(CEngineInterface::AX_GAME, fVector3(fvPos.x, fvPos.y, fvPos.z), CEngineInterface::AX_GFX, fvTemp)) return; // 位置相同 而且 眼睛也不用回归则直接返回 // if( (fvTemp == m_fvLookatPos) && (STATIC_PITCH - m_fPitch < MIN_ANGLE) && (m_status == NORMAL_STATUS) ) if( (fvTemp == m_fvLookatPos) && (m_fPitchApproch - m_fPitch < MIN_ANGLE) && (m_status == NORMAL_STATUS) ) return; m_fvLookatPos = fvTemp; Update(); }
CObject_Bus::CObject_Bus() { m_nDataID = INVALID_ID; m_nPassengerCount = 0; INT i; for(i = 0; i < DEF_BUS_MAX_PASSENGER_COUNT; i++) { m_anPassengerIDs[i] = INVALID_ID; m_abPassengerAttacheds[i] = FALSE; } m_nCurrentAnimationIndex = -1; m_pBusData = NULL; m_fvMoveTargetPos = fVector3(-1.f, -1.f, -1.f); m_bMoving = FALSE; }
void Draw::DrawBox(const fRect &rect, float rotation, const cColorRGBA &color, Texture *texture, Shader *shader) { VertexDraw2D *buffer = LE_DrawManager.GetVertexBuffer2D(6); fSize screenSize(LE_DrawManager.GetVirtualScreenSize()); fRect rectInProj = rect / screenSize; fPoint rightTop(rect.width, 0.0f); fPoint rightBottom(rect.width, rect.height); fPoint leftBottom(0.0f, rect.height); fMatrix4x4 rotmat = fMatrix4x4::RotationZ(rotation); rightBottom = rotmat * rightBottom / screenSize; rightBottom += rectInProj.xy(); rightTop = rotmat * rightTop / screenSize; rightTop += rectInProj.xy(); leftBottom = rotmat * leftBottom / screenSize; leftBottom += rectInProj.xy(); buffer[0].SetPosition(fVector3(rectInProj.xy(), 0.0f)); buffer[0].SetColor(color); buffer[0].SetTexcoord(fVector2(0.0f, 0.0f)); buffer[1].SetPosition(fVector3(leftBottom, 0.0f)); buffer[1].SetColor(color); buffer[1].SetTexcoord(fVector2(0.0f, 1.0f)); buffer[2].SetPosition(fVector3(rightTop, 0.0f)); buffer[2].SetColor(color); buffer[2].SetTexcoord(fVector2(1.0f, 0.0f)); buffer[3].SetPosition(fVector3(leftBottom, 0.0f)); buffer[3].SetColor(color); buffer[3].SetTexcoord(fVector2(0.0f, 1.0f)); buffer[4].SetPosition(fVector3(rightBottom, 0.0f)); buffer[4].SetColor(color); buffer[4].SetTexcoord(fVector2(1.0f, 1.0f)); buffer[5].SetPosition(fVector3(rightTop, 0.0f)); buffer[5].SetColor(color); buffer[5].SetTexcoord(fVector2(1.0f, 0.0f)); if(shader == NULL) { if(texture) { DrawCommand::BindTexture(0, texture); } else { DrawCommand::BindTexture(0, RenderContext::GetSingleton().GetDefaultTexture(RenderContext::DefaultTextureTypeWhite)); } } LE_DrawManager.Draw2DFlush(GraphicsFlag::PT_TRIANGLELIST, shader); }
void Draw::DrawBox(const fRect &rect, float rotation, const cColorRGBA &leftTopColor, const cColorRGBA &rightTopColor, const cColorRGBA &leftBottomColor, const cColorRGBA &rightBottomColor) { VertexDraw2D *buffer = LE_DrawManager.GetVertexBuffer2D(6); fSize screenSize(LE_DrawManager.GetVirtualScreenSize()); fRect rectInProj = rect / screenSize; fPoint rightTop(rect.width, 0.0f); fPoint rightBottom(rect.width, rect.height); fPoint leftBottom(0.0f, rect.height); fMatrix4x4 rotmat = fMatrix4x4::RotationZ(rotation); rightBottom = rotmat * rightBottom / screenSize; rightBottom += rectInProj.xy(); rightTop = rotmat * rightTop / screenSize; rightTop += rectInProj.xy(); leftBottom = rotmat * leftBottom / screenSize; leftBottom += rectInProj.xy(); buffer[0].SetPosition(fVector3(rectInProj.xy(), 0.0f)); buffer[0].SetColor(leftTopColor); buffer[0].SetTexcoord(fVector2(0.0f, 0.0f)); buffer[1].SetPosition(fVector3(leftBottom, 0.0f)); buffer[1].SetColor(leftBottomColor); buffer[1].SetTexcoord(fVector2(0.0f, 1.0f)); buffer[2].SetPosition(fVector3(rightTop, 0.0f)); buffer[2].SetColor(rightTopColor); buffer[2].SetTexcoord(fVector2(1.0f, 0.0f)); buffer[3].SetPosition(fVector3(leftBottom, 0.0f)); buffer[3].SetColor(leftBottomColor); buffer[3].SetTexcoord(fVector2(0.0f, 1.0f)); buffer[4].SetPosition(fVector3(rightBottom, 0.0f)); buffer[4].SetColor(rightBottomColor); buffer[4].SetTexcoord(fVector2(1.0f, 1.0f)); buffer[5].SetPosition(fVector3(rightTop, 0.0f)); buffer[5].SetColor(rightTopColor); buffer[5].SetTexcoord(fVector2(1.0f, 0.0f)); DrawCommand::BindTexture(0, 0); LE_DrawManager.Draw2DFlush(GraphicsFlag::PT_TRIANGLELIST); }
BOOL CObject_Bus::Tick_Move(UINT uElapseTime) { FLOAT fElapseTime = (FLOAT)uElapseTime / 1000.f; FLOAT fMoveDist = fElapseTime * GetMoveSpeed(); FLOAT fDist = KLU_GetDist(fVector3(GetPosition().x, 0.f, GetPosition().z), fVector3(m_fvMoveTargetPos.x, 0.f, m_fvMoveTargetPos.z)); if(fMoveDist >= fDist) { if(m_fvMoveTargetPos.y <= DEF_BUS_PATH_NODE_INVALID_Y) { SetMapPosition(fVector2(m_fvMoveTargetPos.x, m_fvMoveTargetPos.z)); } else { SetPosition(m_fvMoveTargetPos); } StopMove(); } else { if(fDist > 0.f) { fVector3 fvThisPos = GetPosition(); fVector3 fvLen = m_fvMoveTargetPos - fvThisPos; if(m_fvMoveTargetPos.y <= DEF_BUS_PATH_NODE_INVALID_Y) { fvThisPos.x += (fvLen.x/fDist) * fMoveDist; fvThisPos.z += (fvLen.z/fDist) * fMoveDist; SetMapPosition(fVector2(fvThisPos.x, fvThisPos.z)); } else { fvThisPos.x += (fvLen.x/fDist) * fMoveDist; fvThisPos.y += (fvLen.y/fDist) * fMoveDist; fvThisPos.z += (fvLen.z/fDist) * fMoveDist; SetPosition(fvThisPos); } } } FLOAT fFaceDir = GetFaceDir(); if(fabsf(m_fTargetDir - fFaceDir) > 0.01f) { if(fabsf(m_fTargetDir - fFaceDir) < __PI * 5.f / 4.f && fabsf(m_fTargetDir - fFaceDir) > __PI * 3.f / 4.f) { SetFaceDir(m_fTargetDir); } else { FLOAT fElapseDir = fElapseTime * __PI; if(m_fTargetDir - fFaceDir > __PI || (m_fTargetDir - fFaceDir < 0.f && m_fTargetDir - fFaceDir > -__PI)) {// 正转 fFaceDir -= fElapseDir; if(fFaceDir < 0.f) { fFaceDir += 2.f *__PI; } SetFaceDir(fFaceDir); } else {// 反转 fFaceDir += fElapseDir; if(fFaceDir > m_fTargetDir) { fFaceDir = m_fTargetDir; } SetFaceDir(fFaceDir); } } } return TRUE; }
BOOL CEngineInterface::Axis_Trans(AXIS_TYPE typeSource, const fVector3& fvSource, AXIS_TYPE typeTar, fVector3& fvTarget) { register Fairy::TerrainData* pTerrainData = m_pFairySystem->getTerrainData(); // 尚未加载 if(pTerrainData && (pTerrainData->getXSize()==0 || pTerrainData->getZSize()==0)) { pTerrainData = 0; } fVector3 fvScale = GetSacle(); //检查是否是合法的坐标 fvTarget = fvSource; if(!Axis_CheckValid(typeSource, fvSource)) return FALSE; if(typeSource == typeTar) return TRUE; switch(typeSource) { //----------------------------------------------- case AX_GAME: { if(AX_PLAN==typeTar) return TRUE; else if(AX_GFX == typeTar) { if(pTerrainData) { fvTarget.x = pTerrainData->mPosition.x + (FLOAT)fvSource.x * pTerrainData->mScale.x; fvTarget.y = pTerrainData->mPosition.y + (FLOAT)fvSource.y * pTerrainData->mScale.y; fvTarget.z = pTerrainData->mPosition.z + (FLOAT)fvSource.z * pTerrainData->mScale.z; } else { fvTarget.x = (FLOAT)fvSource.x * fvScale.x; fvTarget.y = (FLOAT)fvSource.y * fvScale.y; fvTarget.z = (FLOAT)fvSource.z * fvScale.z; } return TRUE; } else if(AX_SCREEN==typeTar) { KLThrow("(AX_GAME->AX_SCREEN) Not support yet!"); } } break; //----------------------------------------------- case AX_PLAN: { if(!pTerrainData) return FALSE; FLOAT fGfxX = pTerrainData->mPosition.x + (FLOAT)fvSource.x * pTerrainData->mScale.x; FLOAT fGfxZ = pTerrainData->mPosition.z + (FLOAT)fvSource.z * pTerrainData->mScale.z; if(AX_GAME==typeTar) { //取得相地形高度作为Y坐标(游戏坐标) fvTarget.y = (pTerrainData->getHeightAtGrid(fvSource.x, fvSource.z)-pTerrainData->mPosition.y)/ pTerrainData->mScale.y; return TRUE; } else if(AX_GFX == typeTar) { //取得相地形高度作为Y坐标 fvTarget.x = fGfxX; fvTarget.z = fGfxZ; fvTarget.y = pTerrainData->getHeightAtGrid(fvSource.x, fvSource.z); return TRUE; } else if(AX_SCREEN==typeTar) { KLThrow("(AX_PLAN->AX_SCREEN) Not support yet!"); } } break; //----------------------------------------------- case AX_GFX: { if(AX_GAME==typeTar || AX_PLAN==typeTar) { if(pTerrainData) { fvTarget.x = (fvSource.x-pTerrainData->mPosition.x)/pTerrainData->mScale.x; fvTarget.y = (fvSource.y-pTerrainData->mPosition.y)/pTerrainData->mScale.y; fvTarget.z = (fvSource.z-pTerrainData->mPosition.z)/pTerrainData->mScale.z; } else { fvTarget.x = (fvSource.x)/fvScale.x; fvTarget.y = (fvSource.y)/fvScale.y; fvTarget.z = (fvSource.z)/fvScale.z; } return TRUE; } else if(AX_SCREEN==typeTar) { //KLThrow("(AX_GFX->AX_SCREEN) Not support yet!"); if(!pTerrainData) return FALSE; //得到Ogre相机 Ogre::Camera* pOgreCamera = m_pCamera_Current->GetOgreCamera(); if(!pOgreCamera) return FALSE; if(!(pOgreCamera->isVisible(Ogre::Vector3(fvSource.x, fvSource.y, fvSource.z)))) return FALSE; // x:[-1w, 1w] z:[-1h, 1h] Ogre::Vector3 vRet = pOgreCamera->getProjectionMatrix()* pOgreCamera->getViewMatrix() * Ogre::Vector3(fvSource.x, fvSource.y, fvSource.z); int nWidth = m_pFairySystem->getViewport()->getActualWidth(); int nHeight = m_pFairySystem->getViewport()->getActualHeight(); fvTarget.x = (( vRet.x + 1.0f)*nWidth/2.0f); fvTarget.y = ((-vRet.y + 1.0f)*nHeight/2.0f); return TRUE; } } break; //----------------------------------------------- case AX_SCREEN: { if(!pTerrainData) return FALSE; Ogre::Vector3 vRenderPos; BOOL bRet = m_pFairySystem->getTerrainIntersects(Fairy::Point((INT)fvSource.x, fvSource.y), vRenderPos); if(!bRet) return FALSE; if(AX_GAME==typeTar || AX_PLAN==typeTar) { return Axis_Trans(AX_GFX, fVector3(vRenderPos.x, vRenderPos.y, vRenderPos.z), AX_GAME, fvTarget); } else if(AX_GFX==typeTar) { fvTarget = fVector3(vRenderPos.x, vRenderPos.y, vRenderPos.z); return TRUE; } } break; } return FALSE; }
uint GCNewPlayer_MoveHandler :: Execute( GCNewPlayer_Move* pPacket, Player* pPlayer ) { //__ENTER_FUNCTION //AxTrace(0, 2, "GCNewPlayerHandler"); // return PACKET_EXE_CONTINUE ; //当前流程是主流程 if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcMain) { CObjectManager* pObjectManager = CObjectManager::GetMe(); //检查位置是否合法 if(!CWorldManager::GetMe()->GetActiveScene()->IsValidPosition(fVector2(pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ))) { TDThrow("ERROR POSITION @ GCNewPlayer_MoveHandler"); } //创建玩家 CObject_PlayerOther* pOther = (CObject_PlayerOther*)(pObjectManager->FindServerObject( (INT)pPacket->getObjID() )); fVector3 fvGame; CGameProcedure::s_pGfxSystem->Axis_Trans( CRenderSystem::AX_PLAN, fVector3(pPacket->getWorldPos().m_fX, 0.0f, pPacket->getWorldPos().m_fZ), CRenderSystem::AX_GAME, fvGame); if ( pOther == NULL ) { pOther = pObjectManager->NewPlayerOther( (INT)pPacket->getObjID() ); SObjectInit initPlayerOther; initPlayerOther.m_fvPos = fvGame; pOther->Initial( &initPlayerOther ); } else { fVector2 mapPos(fvGame.x, fvGame.z); pOther->SetMapPosition(mapPos); pOther->Enable( OSF_VISIABLE ); pOther->Disalbe( OSF_OUT_VISUAL_FIELD ); } ////激活鼠标查询 //if(pOther->GetRenderInterface()) //{ // pOther->Enable(OSF_RAY_QUERY); //} //更新装备信息 pOther->GetCharacterData()->Set_EquipVer(pPacket->getEquipVer()); //跟新移动速度 pOther->GetCharacterData()->Set_MoveSpeed(pPacket->getMoveSpeed()); // move to command { WORLD_POS posTarget; posTarget.m_fX = pPacket->getTargetPos().m_fX; posTarget.m_fZ = pPacket->getTargetPos().m_fZ; SCommand_Object cmdTemp; cmdTemp.m_wID = OC_MOVE; cmdTemp.m_auParam[0] = 0; cmdTemp.m_anParam[1] = pPacket->getHandleID(); cmdTemp.m_anParam[2] = 1; cmdTemp.m_apParam[3] = &posTarget; pOther->PushCommand(&cmdTemp ); } //放入Ask队列 CObjectManager::GetMe()->GetLoadQueue()->TryAddLoadTask(pOther->GetID(), CObject_Character::CT_PLAYEROTHER); // tempcode{ // 此版不做服务器繁忙客户端延后发消息的处理 // CGCharAskBaseAttrib msgAskBaseAttrib; // msgAskBaseAttrib.setTargetID( (INT)pPacket->getObjID() ); // CNetManager::GetMe()->SendPacket( &msgAskBaseAttrib ); //AxTrace(0, 0, "[%d]Ask %d", m_hmObject.size(), pPacket->getObjID()); // } pOther->PushDebugString("GCNewPlayer"); pOther->SetMsgTime(CGameProcedure::s_pTimeSystem->GetTimeNow()); } return PACKET_EXE_CONTINUE ; //__LEAVE_FUNCTION return PACKET_EXE_ERROR ; //__ENTER_FUNCTION // AxTrace(0, 2, "GCNewPlayerHandler"); // // //当前流程是主流程 // if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcMain) // { // CObjectManager* pObjectManager = CObjectManager::GetMe(); // // //创建玩家 // CObject_PlayerOther* pOther = pObjectManager->CreatePlayerOther( // (INT)pPacket->getObjID(), // (INT)pPacket->getRace(), // pPacket->getEquipVer(), // fVector2(pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ), // true); // // if(!pOther) return PACKET_EXE_CONTINUE; // // //设置新的位置 // pOther->SetMapPosition(fVector2(pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ)); // pOther->RegisterToZone(); // //IDLE装态 // pOther->SetMotionStatus(CMS_STATUS_IDLE); // pOther->PushDebugString("GCNewPlayer"); // pOther->SetMsgTime(CGameProcedure::s_pTimeSystem->GetTimeNow()); // } // // return PACKET_EXE_CONTINUE ; // //__LEAVE_FUNCTION // // return PACKET_EXE_ERROR ; }
uint GCNewPet_MoveHandler::Execute( GCNewPet_Move* pPacket, Player* pPlayer ) { //当前流程是主流程 if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcMain) { CObjectManager* pObjectManager = CObjectManager::GetMe(); //检查位置是否合法 if(!CWorldManager::GetMe()->GetActiveScene()->IsValidPosition(fVector2(pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ))) { TDThrow("ERROR POSITION @ GCNewMonster_MoveHandler"); } if(!CWorldManager::GetMe()->GetActiveScene()->IsValidPosition(fVector2(pPacket->getTargetPos().m_fX, pPacket->getTargetPos().m_fZ))) { TDThrow("ERROR POSITION @ GCNewMonster_MoveHandler target"); } //创建玩家 CObject_PlayerNPC* pNPC = (CObject_PlayerNPC*)pObjectManager->FindServerObject( (INT)pPacket->getObjID() ); fVector3 fvGame; CGameProcedure::s_pGfxSystem->Axis_Trans( CRenderSystem::AX_PLAN, fVector3(pPacket->getWorldPos().m_fX, 0.0f, pPacket->getWorldPos().m_fZ), CRenderSystem::AX_GAME, fvGame); if ( pNPC == NULL ) { pNPC = pObjectManager->NewPlayerNPC( (INT)pPacket->getObjID() ); SObjectInit initPlayerNPC; initPlayerNPC.m_fvPos = fvGame; initPlayerNPC.m_fvRot = fVector3( 0.f, 0.f, 0.f ); pNPC->Initial( &initPlayerNPC ); } else { fVector2 mapPos(fvGame.x, fvGame.z); pNPC->SetMapPosition(mapPos); pNPC->Enable( OSF_VISIABLE ); pNPC->Disalbe( OSF_OUT_VISUAL_FIELD ); } pNPC->SetNpcType(NPC_TYPE_PET); pNPC->GetCharacterData()->Set_MoveSpeed(pPacket->getMoveSpeed()); // move to command { WORLD_POS posTarget; posTarget.m_fX = pPacket->getTargetPos().m_fX; posTarget.m_fZ = pPacket->getTargetPos().m_fZ; SCommand_Object cmdTemp; cmdTemp.m_wID = OC_MOVE; cmdTemp.m_auParam[0] = 0; cmdTemp.m_anParam[1] = pPacket->getHandleID(); cmdTemp.m_anParam[2] = 1; cmdTemp.m_apParam[3] = &posTarget; pNPC->PushCommand(&cmdTemp ); } //放入Ask队列 CObjectManager::GetMe()->GetLoadQueue()->TryAddLoadTask(pNPC->GetID(), CObject_Character::CT_MONSTER); // tempcode{ // 此版不做服务器繁忙客户端延后发消息的处理 // CGCharAskBaseAttrib msgAskBaseAttrib; // msgAskBaseAttrib.setTargetID( (INT)pPacket->getObjID() ); // CNetManager::GetMe()->SendPacket( &msgAskBaseAttrib ); // } //同步渲染层 char szTemp[MAX_PATH]; _snprintf(szTemp, MAX_PATH, "GCNewPet_Move(%.1f,%.1f)", pPacket->getWorldPos().m_fX, pPacket->getWorldPos().m_fZ); pNPC->PushDebugString(szTemp); pNPC->SetMsgTime(CGameProcedure::s_pTimeSystem->GetTimeNow()); } return PACKET_EXE_CONTINUE ; }