static void UpdateAndDraw( HWND hwnd ) { HRESULT hr; Device->BeginScene(); IDirect3DSurface9* backBuffer=0; hr = Device->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&backBuffer); Assert(hr==D3D_OK); D3DSURFACE_DESC desc; hr = backBuffer->GetDesc(&desc); Assert(hr==D3D_OK); D3DLOCKED_RECT lockedRect; hr = backBuffer->LockRect(&lockedRect,NULL,D3DLOCK_NOSYSLOCK|D3DLOCK_DISCARD); Assert(hr==D3D_OK); NimblePixMap pixmap(desc.Width,desc.Height,32,lockedRect.pBits,lockedRect.Pitch); if( ResizeOrMove ) { GameResizeOrMove( pixmap ); ResizeOrMove = false; } GameUpdateDraw( pixmap, NimbleUpdate|NimbleDraw ); hr = backBuffer->UnlockRect(); Assert(hr==D3D_OK); backBuffer->Release(); Device->EndScene(); hr = Device->Present( 0, 0, 0, 0 ); if( hr!=D3D_OK ) { Decode(hr); } }
bool GameKeyDown( int key ) { switch(key) { case HOST_KEY_ESCAPE: HostExit(); return true; case HOST_KEY_RETURN: VisibleDialog = NULL; break; case ' ': if( CultureBeginX<=DuckX && DuckX<CultureEndX ) VisibleDialog = &WarnAwayFromCultureDialog; else // Fire airgun at Duck's feet, becaus firing airgun at surface generates wave that // mostly cancels itself. AirgunFire( DuckX, 8 ); break; case 'a': IsAutoGainOn.toggleChecked(); break; case 'f': ShowFrameRate = !ShowFrameRate; break; case 'n': if( ScoreState.isTraining() ) CreateNewArea(); else ScoreState.startNewArea(); break; case 'p': IsPaused.toggleChecked(); break; case 'g': ToggleShowGeology(); break; case 'r': ToggleShowReservoir(); break; case 's': ToggleShowSeismic(); break; #if WRITING_DOCUMENTATION case '0': IsPaused=false; WavefieldInitialize( TheGeology ); SeismogramReset( WindowWidth-PanelWidth, WindowHeight/2 ); AirgunFire( WavefieldRect.width()/2, 8 ); for( int i=0; i<70; ++i ) GameUpdateDraw(TheMap,NimbleUpdate); DuckX=0; RigX=0; IsPaused=true; break; #endif /* WRITING_DOCUMENTATION */ #if ASSERTIONS case '3': { CashMeter += 30; break; } case '4': { CashMeter -= 20; break; } case '5': { ShowSeismic = true; ShowGeology = true; ShowReservoir.setChecked(true); break; } #endif } return false; }