|
20精币
- // 头文件
- #include<windows.h>
- #include<d3d9.h>
- #include<d3dx9.h>
- #include<cstdio>
-
- #define DIRECTINPUT_VERSION 0x0800 // 使用DirectInput前需要确定DirectInput版本
- #include<dinput.h>
-
- // 库文件
- #pragma comment( lib, "d3d9.lib")
- #pragma comment( lib, "d3dx9.lib")
- #pragma comment( lib, "dinput8.lib")
- #pragma comment( lib, "dxguid.lib")
-
- // 定义的宏
- #define JCLASSNAME "优化的程序"
- #define JCAPTION "程序演示"
- #define WINDOW_WIDTH 320
- #define WINDOW_HEIGHT 240
- #define FULLSCREEN FALSE// 全屏非全屏的标识符
- #define SAFE_RELEASE( p ) if ( p ) p->Release(); p = NULL;
- #define KEYDOWN( name, key ) ( name[key] & 0x80 )
-
- // 调整编译器设置
- #pragma warning( disable: 4100 )
-
- #if FULLSCREEN // 全屏非全屏的设置
- #define WINDOW_STYLE WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE
- #else
- #define WINDOW_STYLE WS_CAPTION | WS_SYSMENU
- #endif
-
- /*----------------------------------------------------------------------------*/
- // 全局变量
- LPDIRECT3D9 g_JD3D = NULL;// D3D结构体
- LPDIRECT3DDEVICE9 g_JDevice = NULL;// D3D装置结构体
- LPD3DXFONT g_FPSFont = NULL;// 指向FPS字体的指针
- RECT g_FPSFontPos = { WINDOW_WIDTH - 100, WINDOW_HEIGHT - 15,
- WINDOW_WIDTH, WINDOW_HEIGHT};// FPS所在的矩形框
- INT g_FrameCount = 0;// 帧的计数器
- INT g_lastTime = 0;// 记录上一秒的时间
- INT g_currentTime = 0;// 记录当前的时间
- CHAR g_FPSstr[25] = { 0 };// 记录当前帧率的字符串
- IDirect3DSurface9* g_Surface = NULL;// 平面的指针
- LPDIRECT3DTEXTURE9 g_pTexture = NULL;// 图像纹理指针
- LPD3DXSPRITE g_pSprite = NULL;// 子图形指针
- RECT g_SpriteRect = { 0, 0, 0, 0 };// 子图形所在的矩形
- D3DXVECTOR3 g_vCenter( 0.0f, 0.0f, 0.0f );// 子图形中心的向量
- D3DXVECTOR3 g_vPosition( WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2, 0.0f );// 子图形位置的向量
-
- LPDIRECTINPUT8 g_JInputObject = NULL;// DirectInput8的对象
- LPDIRECTINPUTDEVICE8 g_JInputDevice = NULL;// DirectInput的设备
-
- /*----------------------------------------------------------------------------*/
- // 初始化Direct3D函数
- BOOL InitializeD3D( HINSTANCE hInst, HWND hWnd )
- {
- D3DDISPLAYMODE displayMode;
-
- //创建D3D对象
- g_JD3D = Direct3DCreate9( D3D_SDK_VERSION );
- if ( g_JD3D == NULL )
- return FALSE;
-
- // 获取显示器的模式
- if ( FAILED( g_JD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &displayMode ) ) )
- return FALSE;
-
- // D3D显示的参数
- D3DPRESENT_PARAMETERS jd3dpp;
- ZeroMemory( &jd3dpp, sizeof( jd3dpp ) );
-
- // 初始化D3DPRESENT_PARAMETERS
- jd3dpp.Windowed = !FULLSCREEN;
- jd3dpp.BackBufferWidth = WINDOW_WIDTH;
- jd3dpp.BackBufferHeight = WINDOW_HEIGHT;
- jd3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- jd3dpp.BackBufferFormat = displayMode.Format;
- jd3dpp.EnableAutoDepthStencil = TRUE;
- jd3dpp.AutoDepthStencilFormat = D3DFMT_D16;
-
- // 创建设备
- if(FAILED( g_JD3D->CreateDevice( D3DADAPTER_DEFAULT,
- D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &jd3dpp, &g_JDevice ) ) )
- return FALSE;
-
- // 设置渲染状态
- g_JDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
- g_JDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
-
- // 创建字体
- if ( FAILED( D3DXCreateFont( g_JDevice, 15, 0, 1, 1, 0, DEFAULT_CHARSET,
- OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
- "Impact", &g_FPSFont ) ) ) return FALSE;
-
- // 创建离屏平面
- if ( FAILED ( g_JDevice->CreateOffscreenPlainSurface( WINDOW_WIDTH, WINDOW_HEIGHT,
- D3DFMT_X8R8G8B8, // 平面格式
- D3DPOOL_DEFAULT, // 内存池格式
- &g_Surface, // 保存结果的缓存
- NULL) ) ) // 保留参数
- return FALSE;
-
- // 载入背景平面图像
- if ( FAILED( D3DXLoadSurfaceFromFile( g_Surface, NULL, NULL, "测试的临时用图.png",
- NULL, D3DX_DEFAULT, 0, NULL ) ) ) return FALSE;
-
- // 载入子图像(精灵图像)
- D3DXIMAGE_INFO info;
- D3DXGetImageInfoFromFile( "采用Alpha混合的精灵图.png", &info );// 提取图片信息
- if ( FAILED( D3DXCreateTextureFromFileEx( g_JDevice,
- "采用Alpha混合的精灵图.png", info.Width, info.Height, D3DFMT_FROM_FILE,
- 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_DEFAULT,
- D3DCOLOR_XRGB( 240, 194, 180 ), NULL, NULL, &g_pTexture ) ) ) return FALSE;
-
- // 设置min和mag滤波
- g_JDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
- g_JDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
-
- // 设置三角形的背面不被剔除
- g_JDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
-
- // 创建子图形
- if ( FAILED( D3DXCreateSprite( g_JDevice, &g_pSprite ) ) ) return false;
- g_SpriteRect.right = info.Width;
- g_SpriteRect.bottom = info.Height;
-
- // 创建DirectInput
- if ( FAILED( DirectInput8Create( hInst, DIRECTINPUT_VERSION, IID_IDirectInput8,
- (void**)&g_JInputObject, NULL ) ) )
- {
- MessageBox( NULL, "创建DirectInput对象失败。", "程序消息", MB_OK );
- return FALSE;
- }
-
- // 创建DirectInput设备
- if ( FAILED( g_JInputObject->CreateDevice( GUID_SysKeyboard,
- &g_JInputDevice, NULL ) ) )
- {
- MessageBox( NULL, "创建DirectInput设备失败。", "程序消息", MB_OK );
- return FALSE;
- }
-
- // 设置数据格式
- if ( FAILED( g_JInputDevice->SetDataFormat( &c_dfDIKeyboard ) ) )
- {
- MessageBox( NULL, "设置数据格式失败。", "程序消息", MB_OK );
- return FALSE;
- }
-
- // 设置合作等级
- if ( FAILED( g_JInputDevice->SetCooperativeLevel( hWnd,
- DISCL_NONEXCLUSIVE | DISCL_FOREGROUND ) ) )// 非独占有,程序前台控制有效
- {
- MessageBox( NULL, "设置合作等级失败。", "程序消息", MB_OK );
- return FALSE;
- }
-
- // 获取输入设备
- if ( FAILED( g_JInputDevice->Acquire() ) )
- {
- MessageBox( NULL, "取得输入装置失败。", "程序消息", MB_OK );
- return FALSE;
- }
-
- return TRUE;
- }
- /*----------------------------------------------------------------------------*/
- // 释放所有资源
- void ReleaseMemory( void )
- {
- SAFE_RELEASE( g_JD3D );
- SAFE_RELEASE( g_JDevice );
- SAFE_RELEASE( g_FPSFont );
- SAFE_RELEASE( g_Surface );
-
- g_JInputDevice->Unacquire();
- SAFE_RELEASE( g_JInputDevice );
-
- SAFE_RELEASE( g_JInputObject );
- }
- /*----------------------------------------------------------------------------*/
- // 程序的交互
- void GameInteraction( void )
- {
- char state[256];// 键盘的状态
-
- // 取得设备的状态
- if ( FAILED( g_JInputDevice->GetDeviceState( sizeof( state ), state ) ) )
- {
- MessageBox( NULL, "获取设备状态失败。", "程序消息", MB_OK );
- return;
- }
-
- // 检测某个按键是否按下
- if ( KEYDOWN( state, DIK_LEFT ) )
- g_vPosition.x -= 2;
- if ( KEYDOWN( state, DIK_RIGHT ) )
- g_vPosition.x += 2;
- if ( KEYDOWN( state, DIK_UP ) )
- g_vPosition.y -= 2;
- if ( KEYDOWN( state, DIK_DOWN ) )
- g_vPosition.y += 2;
- }
- /*----------------------------------------------------------------------------*/
- // 渲染屏幕
- void RenderScene( void )
- {
- // 计数器开始计数(以毫秒计)
- g_currentTime = GetTickCount();
- if ( g_currentTime - g_lastTime > 1000 )
- {
- sprintf_s( g_FPSstr, 25, "当前FPS:%d", g_FrameCount );
- g_lastTime = g_currentTime;
- g_FrameCount = 0;
- }
- else g_FrameCount++;
-
- g_JDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
- D3DCOLOR_XRGB( 0, 0, 0), 1.0f, 0);// 清除屏幕
-
- // 载入背景平面图像
- IDirect3DSurface9* backbuffer = NULL;
- g_JDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO,
- &backbuffer );// 获取后台缓存
- g_JDevice->StretchRect( g_Surface, NULL,
- backbuffer, NULL, D3DTEXF_NONE );// 将后台矩形放入前景矩形
-
- // 开始渲染
- g_JDevice->BeginScene();
-
- // 渲染Sprite
- g_pSprite->Begin( D3DXSPRITE_ALPHABLEND );// 以Alpha混合形式进行渲染
- g_pSprite->Draw( g_pTexture, &g_SpriteRect, &g_vCenter, &g_vPosition,
- D3DCOLOR_XRGB( 255, 255, 255 ) );
- g_pSprite->End();// 结束渲染
-
- g_FPSFont->DrawText( NULL, g_FPSstr, -1, &g_FPSFontPos, DT_CENTER,
- D3DCOLOR_XRGB( 255, 255, 255 ) );// 显示字体
-
- // 结束渲染
- g_JDevice->EndScene();
-
- g_JDevice->Present( NULL, NULL, NULL, NULL );
- }
- /*----------------------------------------------------------------------------*/
- // 回调函数,用来处理消息
- HRESULT CALLBACK MyAppProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- switch ( msg )
- {
- case WM_DESTROY:
- PostQuitMessage( 0 );
- return 0;
- case WM_KEYDOWN:
- if ( wParam == VK_ESCAPE ) PostQuitMessage( 0 );
- return 0;
- }
- return (HRESULT)DefWindowProc( hWnd, msg, wParam, lParam );
- };
- /*----------------------------------------------------------------------------*/
- // 程序的入口,主函数
- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmd, INT show )
- {
- // 设置Window Class结构并且注册它
- WNDCLASSEX jWndCls = { sizeof( jWndCls ), CS_CLASSDC, MyAppProc, 0L, 0L, hInst,
- NULL, LoadCursorFromFile( "自定义鼠标指针.ani" ), 0, NULL, JCLASSNAME, NULL };
- RegisterClassEx( &jWndCls );
-
- // 设置窗口并且显示窗口
- HWND hWnd = CreateWindow( JCLASSNAME, JCAPTION, WINDOW_STYLE, 100, 40,
- WINDOW_WIDTH, WINDOW_HEIGHT, GetDesktopWindow(), NULL, jWndCls.hInstance, NULL);
- if ( hWnd == NULL )
- return FALSE;
- ShowWindow( hWnd, SW_SHOWDEFAULT );
- UpdateWindow( hWnd );
-
- // 初始化设置
- if ( InitializeD3D( hInst, hWnd ) == FALSE )
- return FALSE;
-
- // 进入消息循环
- MSG msg;
- ZeroMemory( &msg, sizeof( msg ) );
- while( msg.message != WM_QUIT )
- {
- if ( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- }
- else
- {
- RenderScene();// 渲染屏幕
- GameInteraction();// 游戏的交互
- }
- }
-
- // 程序结束,释放内存所有资源
- ReleaseMemory();
-
- // 解除窗口注册
- UnregisterClass( JCLASSNAME, jWndCls.hInstance );
- return ( INT ) msg.wParam;
- }
|
最佳答案
查看完整内容
别说20块,200可能都没人理
现在有点技术的开价都是K来算
|