void _XWindow_TrainingSpell::Upgrade(void) { m_SuccessPoint = 0; DeleteGauge(m_SuccessPoint); // m_GaugeGradeImage->SetClipRect(0, 82, (m_SuccessPoint*19), 93); m_TrainingGrade++; SetBackground(m_WindowPosition.x, m_WindowPosition.y); ShowGrade(TRUE); ResetMousePos(); _XPlayInterfaceSound(ID_SR_INTERFACE_TRA_UP01_WAV); }
void CLFE_Input::CaptureMouse() { if(NULL == m_pMouseState) { return; } m_pMouseState->m_nRelX = 0; m_pMouseState->m_nRelY = 0; m_pMouseState->m_nRelZ = 0; DIDEVICEOBJECTDATA diBuff[MOUSE_DX_BUFFERSIZE]; DWORD entries = MOUSE_DX_BUFFERSIZE; HRESULT hr = m_pMouse->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), diBuff, &entries, 0); if( hr != DI_OK ) { hr = m_pMouse->Acquire(); while( hr == DIERR_INPUTLOST ) hr = m_pMouse->Acquire(); hr = m_pMouse->GetDeviceData( sizeof(DIDEVICEOBJECTDATA), diBuff, &entries, 0 ); if( FAILED(hr) ) { ResetMousePos(); return; } } bool axesMoved = false; for(unsigned int i = 0; i < entries; ++i ) { switch( diBuff[i].dwOfs ) { case DIMOFS_BUTTON0: if(!DoMouseClick(0, diBuff[i])) return; break; case DIMOFS_BUTTON1: if(!DoMouseClick(1, diBuff[i])) return; break; case DIMOFS_BUTTON2: if(!DoMouseClick(2, diBuff[i])) return; break; case DIMOFS_BUTTON3: if(!DoMouseClick(3, diBuff[i])) return; break; case DIMOFS_BUTTON4: if(!DoMouseClick(4, diBuff[i])) return; break; case DIMOFS_BUTTON5: if(!DoMouseClick(5, diBuff[i])) return; break; case DIMOFS_BUTTON6: if(!DoMouseClick(6, diBuff[i])) return; break; case DIMOFS_BUTTON7: if(!DoMouseClick(7, diBuff[i])) return; break; case DIMOFS_X: m_pMouseState->m_nRelX += diBuff[i].dwData; axesMoved = true; break; case DIMOFS_Y: m_pMouseState->m_nRelY += diBuff[i].dwData; axesMoved = true; break; case DIMOFS_Z: m_pMouseState->m_nRelZ += diBuff[i].dwData; axesMoved = true; break; default: break; } //end switch }//end for if( axesMoved ) { if( m_dwMouseCoopSetting & DISCL_NONEXCLUSIVE ) { //DirectInput provides us with meaningless values, so correct that POINT point; GetCursorPos(&point); ScreenToClient(m_hWnd, &point); m_pMouseState->m_nAbsX = point.x; m_pMouseState->m_nAbsY = point.y; } else { m_pMouseState->m_nAbsX += m_pMouseState->m_nRelX; m_pMouseState->m_nAbsY += m_pMouseState->m_nRelY; } m_pMouseState->m_nAbsZ += m_pMouseState->m_nRelZ; //Clip values to window if( m_pMouseState->m_nAbsX < 0 ) m_pMouseState->m_nAbsX = 0; else if( m_pMouseState->m_nAbsX > m_pMouseState->m_nWindowWidth ) m_pMouseState->m_nAbsX = m_pMouseState->m_nWindowWidth; if( m_pMouseState->m_nAbsY < 0 ) m_pMouseState->m_nAbsY = 0; else if( m_pMouseState->m_nAbsY > m_pMouseState->m_nWindowHeight ) m_pMouseState->m_nAbsY = m_pMouseState->m_nWindowHeight; //Do the move if( m_pMouseListener && m_bBuffered ) m_pMouseListener->MouseMoved(m_pMouseState); } }
BOOL _XWindow_TrainingSpell::Process(_XGUIObject*& pfocusobject) { if(!this->m_Enable) return FALSE; if(!this->m_ShowWindow) return FALSE; if(m_bComplete) { ResetMousePos(); } // TODO if((g_LocalSystemTime - m_TrainingStartTime > 1500) && m_TrainingStartTime != 0) { if(m_PrevMoveTime == 0) m_PrevMoveTime = g_LocalSystemTime; DWORD elapsedtime = g_LocalSystemTime - m_PrevMoveTime; if(m_MouseMoveStartTime > 0) { // 마우스 입력 if(!m_bFailPeriod) { MouseState* mousestate = gpInput->GetMouseState(); if(mousestate) { if(mousestate->bButton[0]) { m_LeftClickForce += m_MouseVelocity * 0.005 * elapsedtime; m_RightClickForce = 0.0f; // _XDWINPRINT("LEFT CLICK [left : %f]", m_LeftClickForce); } else m_LeftClickForce = 0.0f; if(mousestate->bButton[1]) { m_RightClickForce += m_MouseVelocity * 0.005 * elapsedtime; m_LeftClickForce = 0.0f; // _XDWINPRINT("RIGHT CLICK [right : %f]", m_RightClickForce); } else m_RightClickForce = 0.0f; } // 마우스 움직임 if(g_LocalSystemTime - m_MouseMoveStartTime <= m_MouseForceKeepTime) { if(m_MouseDir == MOUSE_DIR_LEFT) { // 왼쪽으로 FLOAT velocity = m_MouseVelocity + m_LeftClickForce - m_RightClickForce; // _XDWINPRINT("Velocity [left : %f / right : %f / total : %f]", m_LeftClickForce, m_RightClickForce, velocity); m_MousePosX = m_MousePosX - elapsedtime * 0.1f * velocity; m_CurrentMousePos.x = (int)m_MousePosX; } else { // 오른쪽으로 FLOAT velocity = m_MouseVelocity + m_RightClickForce - m_LeftClickForce; // _XDWINPRINT("Velocity [left : %f / right : %f / total : %f]", m_LeftClickForce, m_RightClickForce, velocity); m_MousePosX = m_MousePosX + elapsedtime * 0.1f * velocity; m_CurrentMousePos.x = (int)m_MousePosX; } } else { if(!m_bFailPeriod) { m_MouseMoveStartTime = 0; // Keeptime 지남, 다시 판정 m_MousePosX = m_CurrentMousePos.x; } else { if(g_LocalSystemTime - m_FailStartTime >= 1000) { _XDWINPRINT("ERROR ==============================="); } } } } BOOL bInValidArea = FALSE; if(!m_bWaitForServerRes) { // 성공, 실패 판정은 서버로부터의 답을 기다리고 있을 때는 하지 않는다. if(m_CurrentMousePos.x >= m_ValidAreaStart && m_CurrentMousePos.x <= m_ValidAreaEnd) { if(m_StaySuccessAreaTime == 0) m_StaySuccessAreaTime = g_LocalSystemTime; bInValidArea = TRUE; if(g_LocalSystemTime - m_StaySuccessAreaTime > m_StaySuccessKeepTime) { if(gApp->m_bHasFocus) DecideSuccess(); } } if(!bInValidArea) m_StaySuccessAreaTime = 0; if(m_CurrentMousePos.x >= m_MouseEndPos.x-3) { if(m_FailStartTime == 0) { _XDWINPRINT("MISS==="); DecideMiss(); m_FailStartTime = g_LocalSystemTime; m_bFailPeriod = TRUE; } if(g_LocalSystemTime - m_FailStartTime <= 1000) m_CurrentMousePos.x = m_MouseEndPos.x; else ResetMousePos(); // 다시 시작 } if(m_CurrentMousePos.x <= m_MouseStartPos.x+3) { if(m_FailStartTime == 0) { _XDWINPRINT("MISS==="); DecideMiss(); m_FailStartTime = g_LocalSystemTime; m_bFailPeriod = TRUE; } if(g_LocalSystemTime - m_FailStartTime <= 1000) m_CurrentMousePos.x = m_MouseStartPos.x; else ResetMousePos(); // 다시 시작 } } } if(m_MouseMoveStartTime == 0 && !m_bComplete) { // 인력, 지속시간, 속도 지정 DecideMouseProperty(); m_MouseMoveStartTime = g_LocalSystemTime; // _XDWINPRINT("DECIDE MOUSE PROPERTY [Dir : %d / KeepTime : %d / Velocity : %f]", m_MouseDir, m_MouseForceKeepTime, m_MouseVelocity); } m_PrevMoveTime = g_LocalSystemTime; } if(!_XWindow_Training::Process(pfocusobject)) return FALSE; return TRUE; }