📄 pig_test.cpp
字号:
LPDIRECTINPUTDEVICE8 pdidDevice = pDeviceInfos[i].pdidDevice;
InputDeviceState* pInputDeviceState = (InputDeviceState*) pDeviceInfos[i].pParam;
hr = pdidDevice->Acquire();
hr = pdidDevice->Poll();
hr = pdidDevice->GetDeviceData( sizeof(DIDEVICEOBJECTDATA),
rgdod, &dwItems, 0 );
if( FAILED(hr) )
continue;
// Get the sematics codes for the game menu
for( DWORD j=0; j<dwItems; j++ )
{
BOOL bButtonState = (rgdod[j].dwData==0x80) ? TRUE : FALSE;
FLOAT fButtonState = (rgdod[j].dwData==0x80) ? 1.0f : 0.0f;
FLOAT fAxisState = (FLOAT)((int)rgdod[j].dwData)/100.0f;
UNREFERENCED_PARAMETER( fButtonState );
switch( rgdod[j].uAppData )
{
// TODO: Handle semantics for the game
// Handle relative axis data
case INPUT_ROTATE_AXIS_LR:
pInputDeviceState->fAxisRotateLR = -fAxisState;
break;
case INPUT_ROTATE_AXIS_UD:
pInputDeviceState->fAxisRotateUD = -fAxisState;
break;
// Handle buttons separately so the button state data
// doesn't overwrite the axis state data, and handle
// each button separately so they don't overwrite each other
case INPUT_ROTATE_LEFT: pInputDeviceState->bButtonRotateLeft = bButtonState; break;
case INPUT_ROTATE_RIGHT: pInputDeviceState->bButtonRotateRight = bButtonState; break;
case INPUT_ROTATE_UP: pInputDeviceState->bButtonRotateUp = bButtonState; break;
case INPUT_ROTATE_DOWN: pInputDeviceState->bButtonRotateDown = bButtonState; break;
case INPUT_PLAY_SOUND: pInputDeviceState->bButtonPlaySoundButtonDown = bButtonState; break;
// Handle one-shot buttons
case INPUT_CONFIG_INPUT: if( bButtonState ) pUserInput->bDoConfigureInput = TRUE; break;
case INPUT_CONFIG_DISPLAY: if( bButtonState ) pUserInput->bDoConfigureDisplay = TRUE; break;
}
}
}
// TODO: change process code as needed
// Process user input and store result into pUserInput struct
pUserInput->fAxisRotateLR = 0.0f;
pUserInput->fAxisRotateUD = 0.0f;
pUserInput->bPlaySoundButtonDown = FALSE;
// Concatinate the data from all the DirectInput devices
for( i=0; i<dwNumDevices; i++ )
{
InputDeviceState* pInputDeviceState = (InputDeviceState*) pDeviceInfos[i].pParam;
// Use the axis data that is furthest from zero
if( fabs(pInputDeviceState->fAxisRotateLR) > fabs(pUserInput->fAxisRotateLR) )
pUserInput->fAxisRotateLR = pInputDeviceState->fAxisRotateLR;
if( fabs(pInputDeviceState->fAxisRotateUD) > fabs(pUserInput->fAxisRotateUD) )
pUserInput->fAxisRotateUD = pInputDeviceState->fAxisRotateUD;
// Process the button data
if( pInputDeviceState->bButtonRotateLeft )
pUserInput->fAxisRotateLR = 1.0f;
else if( pInputDeviceState->bButtonRotateRight )
pUserInput->fAxisRotateLR = -1.0f;
if( pInputDeviceState->bButtonRotateUp )
pUserInput->fAxisRotateUD = 1.0f;
else if( pInputDeviceState->bButtonRotateDown )
pUserInput->fAxisRotateUD = -1.0f;
if( pInputDeviceState->bButtonPlaySoundButtonDown )
pUserInput->bPlaySoundButtonDown = TRUE;
}
}
//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Called once per frame, the call is the entry point for 3d
// rendering. This function sets up render states, clears the
// viewport, and renders the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::Render()
{
// Clear the viewport
m_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
0x000000ff, 1.0f, 0L );
// Begin the scene
if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
{
// TODO: render world
m_pMesh->Render(m_pd3dDevice);
// Render stats and help text
//RenderText();
// End the scene.
m_pd3dDevice->EndScene();
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: RenderText()
// Desc: Renders stats and help text to the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RenderText()
{
D3DCOLOR fontColor = D3DCOLOR_ARGB(255,255,255,0);
TCHAR szMsg[MAX_PATH] = TEXT("");
// Output display stats
FLOAT fNextLine = 40.0f;
lstrcpy( szMsg, m_strDeviceStats );
fNextLine -= 20.0f;
m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
lstrcpy( szMsg, m_strFrameStats );
fNextLine -= 20.0f;
m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
// Output statistics & help
fNextLine = (FLOAT) m_d3dsdBackBuffer.Height;
sprintf( szMsg, TEXT("Left/Right Axis: %0.2f Up/Down Axis: %0.2f "),
m_UserInput.fAxisRotateLR, m_UserInput.fAxisRotateUD );
fNextLine -= 20.0f; m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
sprintf( szMsg, TEXT("World State: %0.3f, %0.3f"),
m_fWorldRotX, m_fWorldRotY );
fNextLine -= 20.0f; m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
lstrcpy( szMsg, TEXT("Use arrow keys or joystick to update input") );
fNextLine -= 20.0f; m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
lstrcpy( szMsg, TEXT("Hold 'F5' down to play and repeat a sound") );
fNextLine -= 20.0f; m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
lstrcpy( szMsg, TEXT("Press 'F3' to configure input") );
fNextLine -= 20.0f; m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
lstrcpy( szMsg, TEXT("Press 'F2' to configure display") );
fNextLine -= 20.0f; m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: Pause()
// Desc: Called in to toggle the pause state of the app.
//-----------------------------------------------------------------------------
VOID CMyD3DApplication::Pause( bool bPause )
{
// Get access to the list of semantically-mapped input devices
// to zero the state of all InputDeviceState structs. This is needed
// because when using DISCL_FOREGROUND, the action mapper will not
// record actions when the focus switches, for example if a dialog appears.
// This causes a problem when a button held down when loosing focus, and let
// go when the focus is lost. The app will not record that the button
// has been let go, so the state will be incorrect when focus returns.
// To fix this either use DISCL_BACKGROUND or zero the state when
// loosing focus.
CInputDeviceManager::DeviceInfo* pDeviceInfos;
DWORD dwNumDevices;
m_pInputDeviceManager->GetDevices( &pDeviceInfos, &dwNumDevices );
for( DWORD i=0; i<dwNumDevices; i++ )
{
InputDeviceState* pInputDeviceState = (InputDeviceState*) pDeviceInfos[i].pParam;
ZeroMemory( pInputDeviceState, sizeof(InputDeviceState) );
}
CD3DApplication::Pause( bPause );
}
//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: Overrrides the main WndProc, so the sample can do custom message
// handling (e.g. processing mouse, keyboard, or menu commands).
//-----------------------------------------------------------------------------
LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam )
{
switch( msg )
{
case WM_PAINT:
{
if( m_bLoadingApp )
{
// Draw on the window tell the user that the app is loading
// TODO: change as needed
HDC hDC = GetDC( hWnd );
TCHAR strMsg[MAX_PATH];
wsprintf( strMsg, TEXT("Loading... Please wait") );
RECT rct;
GetClientRect( hWnd, &rct );
DrawText( hDC, strMsg, -1, &rct, DT_CENTER|DT_VCENTER|DT_SINGLELINE );
ReleaseDC( hWnd, hDC );
}
break;
}
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDM_CONFIGINPUT:
m_UserInput.bDoConfigureInput = TRUE;
break;
case IDM_CHANGEDEVICE:
m_UserInput.bDoConfigureDisplay = TRUE;
return 0; // Don't hand off to parent
}
break;
}
}
return CD3DApplication::MsgProc( hWnd, msg, wParam, lParam );
}
//-----------------------------------------------------------------------------
// Name: InvalidateDeviceObjects()
// Desc: Invalidates device objects. Paired with RestoreDeviceObjects()
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InvalidateDeviceObjects()
{
// TODO: Cleanup any objects created in RestoreDeviceObjects()
m_pFont->InvalidateDeviceObjects();
SAFE_RELEASE( m_pDIConfigSurface );
m_pMesh->InvalidateDeviceObjects();
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: DeleteDeviceObjects()
// Desc: Paired with InitDeviceObjects()
// Called when the app is exiting, or the device is being changed,
// this function deletes any device dependent objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::DeleteDeviceObjects()
{
// TODO: Cleanup any objects created in InitDeviceObjects()
m_pFont->DeleteDeviceObjects();
m_pMesh->Destroy();
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: FinalCleanup()
// Desc: Paired with OneTimeSceneInit()
// Called before the app exits, this function gives the app the chance
// to cleanup after itself.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FinalCleanup()
{
// TODO: Perform any final cleanup needed
// Cleanup D3D font
SAFE_DELETE( m_pFont );
// Cleanup DirectInput
CleanupDirectInput();
// Cleanup DirectX audio objects
SAFE_DELETE( m_pBounceSound );
SAFE_DELETE( m_pMusicManager );
// Write the settings to the registry
WriteSettings();
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: CleanupDirectInput()
// Desc: Cleanup DirectInput
//-----------------------------------------------------------------------------
VOID CMyD3DApplication::CleanupDirectInput()
{
if( NULL == m_pInputDeviceManager )
return;
// Get access to the list of semantically-mapped input devices
// to delete all InputDeviceState structs
CInputDeviceManager::DeviceInfo* pDeviceInfos;
DWORD dwNumDevices;
m_pInputDeviceManager->GetDevices( &pDeviceInfos, &dwNumDevices );
for( DWORD i=0; i<dwNumDevices; i++ )
{
InputDeviceState* pInputDeviceState = (InputDeviceState*) pDeviceInfos[i].pParam;
SAFE_DELETE( pInputDeviceState );
pDeviceInfos[i].pParam = NULL;
}
// Cleanup DirectX input objects
SAFE_DELETE( m_pInputDeviceManager );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -