📄 pig_test.cpp
字号:
GetCurrentDirectory( MAX_PATH, szPath );
m_pMusicManager->SetSearchDirectory( szPath );
// TODO: load the sounds from resources (or files)
m_pMusicManager->CreateSegmentFromResource( &m_pBounceSound, _T("BOUNCE"), _T("WAVE") );
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: ConfirmDevice()
// Desc: Called during device initialization, this code checks the display device
// for some minimum set of capabilities
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS9* pCaps, DWORD dwBehavior,
D3DFORMAT Format )
{
UNREFERENCED_PARAMETER( Format );
UNREFERENCED_PARAMETER( dwBehavior );
UNREFERENCED_PARAMETER( pCaps );
BOOL bCapsAcceptable;
// TODO: Perform checks to see if these display caps are acceptable.
bCapsAcceptable = TRUE;
if( bCapsAcceptable )
return S_OK;
else
return E_FAIL;
}
//-----------------------------------------------------------------------------
// Name: InitDeviceObjects()
// Desc: Paired with DeleteDeviceObjects()
// The device has been created. Resources that are not lost on
// Reset() can be created here -- resources in D3DPOOL_MANAGED,
// D3DPOOL_SCRATCH, or D3DPOOL_SYSTEMMEM. Image surfaces created via
// CreateImageSurface are never lost and can be created here. Vertex
// shaders and pixel shaders can also be created here as they are not
// lost on Reset().
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
// TODO: create device objects
m_pMesh->Create(m_pd3dDevice,"tiger.x");
// Init the font
m_pFont->InitDeviceObjects( m_pd3dDevice );
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: RestoreDeviceObjects()
// Desc: Paired with InvalidateDeviceObjects()
// The device exists, but may have just been Reset(). Resources in
// D3DPOOL_DEFAULT and any other device state that persists during
// rendering should be set here. Render states, matrices, textures,
// etc., that don't change during rendering can be set once here to
// avoid redundant state setting during Render() or FrameMove().
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
// TODO: setup render states
HRESULT hr;
m_pMesh->RestoreDeviceObjects(m_pd3dDevice);
// Setup a material
D3DMATERIAL9 mtrl;
D3DUtil_InitMaterial( mtrl, 1.0f, 0.0f, 0.0f );
m_pd3dDevice->SetMaterial( &mtrl );
// Set up the textures
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
// Set miscellaneous render states
m_pd3dDevice->SetRenderState( D3DRS_DITHERENABLE, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xff000fff );
// Set the world matrix
D3DXMATRIX matIdentity;
D3DXMatrixIdentity( &matIdentity );
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matIdentity );
// Set up our view matrix. A view matrix can be defined given an eye point,
// a point to lookat, and a direction for which way is up. Here, we set the
// eye five units back along the z-axis and up three units, look at the
// origin, and define "up" to be in the y-direction.
D3DXMATRIX matView;
D3DXVECTOR3 vFromPt = D3DXVECTOR3( 0.0f, 0.0f, -5.0f );
D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
D3DXMatrixLookAtLH( &matView, &vFromPt, &vLookatPt, &vUpVec );
m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
// Set the projection matrix
D3DXMATRIX matProj;
FLOAT fAspect = ((FLOAT)m_d3dsdBackBuffer.Width) / m_d3dsdBackBuffer.Height;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, fAspect, 1.0f, 100.0f );
m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
// Set up lighting states
D3DLIGHT9 light;
D3DUtil_InitLight( light, D3DLIGHT_DIRECTIONAL, -1.0f, -1.0f, 2.0f );
D3DXVECTOR3 VecDir;
ZeroMemory(&light,sizeof(light));
light.Type=D3DLIGHT_DIRECTIONAL;
//light.Diffuse=D3DCOLOR_RGBA(1.0,1.0,1.0);
light.Diffuse.r=1.0f;
light.Diffuse.g=1.0f;
light.Diffuse.b=1.0f;
/**/light.Ambient.r=1.0f;
light.Ambient.g=0.0f;
light.Ambient.b=1.0f;
light.Specular.r=1.0f;
light.Specular.g=1.0f;
light.Specular.b=1.0f;
light.Falloff=200;
light.Theta=36;
//light.Ambient=D3DCOLOR_RGBA(1.0,1.0,0.0);/**/
VecDir=D3DXVECTOR3(cosf(timeGetTime()/100.0f),0.0f,sinf(timeGetTime()/100.0f));
D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction,&VecDir);
light.Range=1000.0f;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING,false );
m_pd3dDevice->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_RGBA(255,0,0,10));
//m_pd3dDevice->VertexFormat = CustomVertex.PositionNormalColored.Format;
// Restore the font
m_pFont->RestoreDeviceObjects();
if( !m_bWindowed )
{
// Create a surface for configuring DInput devices
if( FAILED( hr = m_pd3dDevice->CreateOffscreenPlainSurface( 640, 480,
m_d3dsdBackBuffer.Format, D3DPOOL_DEFAULT,
&m_pDIConfigSurface, NULL ) ) )
return DXTRACE_ERR( "CreateOffscreenPlainSurface", hr );
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: StaticConfigureInputDevicesCB()
// Desc: Static callback helper to call into CMyD3DApplication class
//-----------------------------------------------------------------------------
BOOL CALLBACK CMyD3DApplication::StaticConfigureInputDevicesCB(
IUnknown* pUnknown, VOID* pUserData )
{
CMyD3DApplication* pApp = (CMyD3DApplication*) pUserData;
return pApp->ConfigureInputDevicesCB( pUnknown );
}
//-----------------------------------------------------------------------------
// Name: ConfigureInputDevicesCB()
// Desc: Callback function for configuring input devices. This function is
// called in fullscreen modes, so that the input device configuration
// window can update the screen.
//-----------------------------------------------------------------------------
BOOL CMyD3DApplication::ConfigureInputDevicesCB( IUnknown* pUnknown )
{
// Get access to the surface
LPDIRECT3DSURFACE9 pConfigSurface = NULL;
if( FAILED( pUnknown->QueryInterface( IID_IDirect3DSurface9,
(VOID**)&pConfigSurface ) ) )
return TRUE;
// Render the scene, with the config surface blitted on top
Render();
RECT rcSrc;
SetRect( &rcSrc, 0, 0, 640, 480 );
POINT ptDst;
ptDst.x = (m_d3dsdBackBuffer.Width-640)/2;
ptDst.y = (m_d3dsdBackBuffer.Height-480)/2;
LPDIRECT3DSURFACE9 pBackBuffer;
m_pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
m_pd3dDevice->UpdateSurface( pConfigSurface, &rcSrc, pBackBuffer, &ptDst );
pBackBuffer->Release();
// Present the backbuffer contents to the front buffer
m_pd3dDevice->Present( 0, 0, 0, 0 );
// Release the surface
pConfigSurface->Release();
return TRUE;
}
//-----------------------------------------------------------------------------
// Name: FrameMove()
// Desc: Called once per frame, the call is the entry point for animating
// the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FrameMove()
{
// TODO: update world
// Update user input state
UpdateInput( &m_UserInput );
// Respond to input
if( m_UserInput.bDoConfigureInput && m_bWindowed ) // full-screen configure disabled for now
{
// One-shot per keypress
m_UserInput.bDoConfigureInput = FALSE;
Pause( true );
// Get access to the list of semantically-mapped input devices
// to delete all InputDeviceState structs before calling ConfigureDevices()
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;
}
// Configure the devices (with edit capability)
if( m_bWindowed )
m_pInputDeviceManager->ConfigureDevices( m_hWnd, NULL, NULL, DICD_EDIT, NULL );
else
m_pInputDeviceManager->ConfigureDevices( m_hWnd,
m_pDIConfigSurface,
(VOID*)StaticConfigureInputDevicesCB,
DICD_EDIT, (LPVOID) this );
Pause( false );
}
if( m_UserInput.bDoConfigureDisplay )
{
// One-shot per keypress
m_UserInput.bDoConfigureDisplay = FALSE;
Pause(true);
// Configure the display device
UserSelectNewDevice();
Pause(false);
}
// Update the world state according to user input
D3DXMATRIX matWorld;
D3DXMATRIX matRotY;
D3DXMATRIX matRotX;
if( m_UserInput.fAxisRotateLR )
m_fWorldRotY += m_fElapsedTime * m_UserInput.fAxisRotateLR;
if( m_UserInput.fAxisRotateUD )
m_fWorldRotX += m_fElapsedTime * m_UserInput.fAxisRotateUD;
D3DXMatrixRotationX( &matRotX, m_fWorldRotX );
D3DXMatrixRotationY( &matRotY, m_fWorldRotY );
D3DXMatrixMultiply( &matWorld, &matRotX, &matRotY );
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
// Play the sound every so often while the button is pressed
if( m_UserInput.bPlaySoundButtonDown )
{
m_fSoundPlayRepeatCountdown -= m_fElapsedTime;
if( m_fSoundPlayRepeatCountdown <= 0.0f )
{
m_fSoundPlayRepeatCountdown = 0.5f;
if( m_pBounceSound )
m_pBounceSound->Play();
}
}
else
{
m_fSoundPlayRepeatCountdown = 0.0f;
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: UpdateInput()
// Desc: Update the user input. Called once per frame
//-----------------------------------------------------------------------------
void CMyD3DApplication::UpdateInput( UserInput* pUserInput )
{
if( NULL == m_pInputDeviceManager )
return;
// Get access to the list of semantically-mapped input devices
CInputDeviceManager::DeviceInfo* pDeviceInfos;
DWORD dwNumDevices;
m_pInputDeviceManager->GetDevices( &pDeviceInfos, &dwNumDevices );
// Loop through all devices and check game input
for( DWORD i=0; i<dwNumDevices; i++ )
{
DIDEVICEOBJECTDATA rgdod[10];
DWORD dwItems = 10;
HRESULT hr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -