bool InputWrapper::IsMouseButtonReleased(eMouseButtons aButton) const { if ((MOUSEBUTTONDOWN(aButton, myPreviousMouseState)) && (MOUSEBUTTONUP(aButton, myMouseState))) { return true; } return false; }
bool InputWrapper::IsMouseButtonDown(eMouseButtons aButton) const { if (MOUSEBUTTONDOWN(aButton, myMouseState)) { return true; } else { return false; } }
void MoonScene::GetMouseInput(DIMOUSESTATE* MouseState, float fElapsedTime) { // if the rightbutton of mouse is down if(MOUSEBUTTONDOWN(MouseState->rgbButtons[MOUSEBUTTON_RIGHT])) { MoonShowCursor(false); int tempx = MouseState->lX%2000; int tempy = MouseState->lY%2000; D3DXVECTOR3 pos, up, look; _Camera->yaw(tempx/200.0f); // 将上下旋转的范围控制在一定程度,当摄像机从头顶上往下看时,此时再接收正向输入(即tempy>0),摄像机就会从头顶上这一边 // 滑到另一边。而当摄像机从脚底往上看时,再接收负向输入,摄像机就会从脚底这一边滑到另一边,因此这两情况都要阻止发生。此外 // 还不能让摄像机没入地形下。 _Camera->getPosition(&pos); _Camera->getUp(&up); _Camera->getLook(&look); if(((pos.y-2.0f) <= _theTerrain->getHeight(pos.x, pos.z)) && (tempy <= 0)) ;//在摄像机快要没入地形下时不再接收tempy的负向输入 else if((up.y <= 0.02f) && (look.y > 0.0f) && (tempy <= 0)) ;//在摄像机快要完全朝上时不再接收tempy的负向输入 else if((up.y <= 0.02f) && (look.y < 0.0f) && (tempy >= 0)) ;//在摄像机快要完全朝下时不再接收tempy的正向输入 else _Camera->pitch(tempy/200.0f); } else { MoonShowCursor(true); } if(_Camera->getType() == MoonCamera::RPG && MouseState->lZ != 0) { // 要将视距的远近控制在一定范围内 float distance = _Camera->getDistance(); if(distance >= 6.0f && distance <= 80.0f) _Camera->adjustDistance(MouseState->lZ/30.0f); distance = _Camera->getDistance(); if(distance > 80.0f) _Camera->setDistance(80.0f); else if(distance < 6.0f) _Camera->setDistance(6.0f); } }
HRESULT MoonChildApp::FrameMove(void) { POINT pos; GetCursorPos(&pos); bool bTemp; if(MOUSEBUTTONDOWN(m_MouseState.rgbButtons[0])) bTemp = true; else bTemp = false; if(m_bWindowed) { int ntemp = (m_rcWindowBounds.right-m_rcWindowClient.right-m_rcWindowBounds.left)/2; pos.x-=(ntemp+m_rcWindowBounds.left); pos.y+=(m_rcWindowClient.bottom-m_rcWindowBounds.bottom+ntemp); } if(_AppState == MAINMENU && _StartPanel) { DWORD value = _StartPanel->Test(pos.x,pos.y,bTemp); if(value == ID_EXIT) { SendMessage( m_hWnd, WM_CLOSE, 0, 0 ); } else if(value == ID_OK) { _AppState=LOADING; /*g_data.theapp=this; g_data.state = INSCENE; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)LoadScene, NULL, 0, NULL);*/ } else if(value == ID_ABOUT) { _AppState=ABOUT; } } else if(_AppState == INSCENE) { if(theScene) { if(theScene->GetKeyboardInput(m_KeyboardState, m_fElapsedTime)==ID_EXIT) { theScene->InvalidateDeviceObjects(); theScene->DeleteDeviceObjects(); theScene->Cleanup(); _AppState=GAMETOMENU; return S_OK; } theScene->GetMouseInput(&m_MouseState, m_fElapsedTime); theScene->FrameMove(m_fElapsedTime, m_fTime); } } else if(_AppState == LOADING) { _StartPanel->Destroy(); theScene->Initialize(&m_d3dCaps, _scnname.c_str()); theScene->InitDeviceObjects(m_pDevice); theScene->RestoreDeviceObjects(); _AppState = INSCENE; } else if(_AppState == GAMETOMENU) { if(m_bWindowed) { _StartPanel->Create(m_pDevice,"start.pnl",m_rcWindowClient.right,m_rcWindowClient.bottom,_Font); } else { _StartPanel->Create(m_pDevice,"start.pnl",m_cMoonSetting.m_nWidth,m_cMoonSetting.m_nHeight,_Font); } _AppState = MAINMENU; } else if(_AppState == ABOUT) { if(_AboutPanel->Test(pos.x,pos.y,bTemp)==ID_EXIT) _AppState = MAINMENU; } return S_OK; }