|
|
发表于 2008-9-19 19:21:00
|
显示全部楼层
Re: Ddraw游戏菜鸟群:67190884 欢迎大家进入,具体介绍请进
#include <instGameWnd.h>
#include <inst2D.h>
using namespace inst;
using namespace inst::i2d;
Bool g_bExit = False;
SmartPtr<CGameWnd> g_pMainWnd;
HWND g_hwnd;
const POS g_Width = 800, g_Height = 600;
SmartPtr<CGraphics> g;
SmartPtr<CSurf> pback;
SmartPtr<CSurf> pic_ori;
POS pic_x =0 , pic_y = 0;
Float scale = 1.0f;
void OnReset()
{
pic_ori.Recreate( L"C:\\a.bmp" );
}
void MainWnd_WinProc(UINT msg,WPARAM wparam,LPARAM lparam)
{
Switch (msg)
{
Case WM_KEYDOWN:
Switch (wparam)
{
case 'A': pic_x += 50 ;break;
case 'S': pic_y -= 50 ;break;
case 'D': pic_x -= 50 ;break;
case 'W': pic_y += 50 ;break;
case 'Q': scale*=1.05f ;break;
case 'E': scale/=1.05f ;break;
}
break;
Case WM_DISPLAYCHANGE:
g->Reset();
OnReset();
break;
Case WM_DESTROY:
g_bExit=True;
break;
}
}
void Init()
{
g_pMainWnd = new CGameWnd(L"TestWnd");
g_pMainWnd->SetCallback(&MainWnd_WinProc);
g_pMainWnd->Show();
g_hwnd = g_pMainWnd->GetHWnd();
CGraphics::CreateGraphics(g_Width,g_Height,g_hwnd);
g = CGraphics::GetGraphics();
pback = g->GetBackBuffer();
pic_ori = new CSurf();
}
void Render()
{
if( (g_pMainWnd->GetStyle()&WS_MINIMIZE) != 0 ) return;
pback->FillRect(0,0,pback->GetW(),pback->GetH(),Rgb(0,0,0));
pback->Stretch( pic_x, pic_y, pic_ori->GetW() * scale, pic_ori->GetH() * scale,
pic_ori, 0, 0, pic_ori->GetW(), pic_ori->GetH(), False);
g-> resent();
}
Bool MsgLoop()
{
if(g_bExit)return True;
::MSG msg;
ZeroMemory(&msg,sizeof(msg));
if(: eekMessage(&msg,0,0U,0U,PM_REMOVE))
{
::TranslateMessage(&msg);
: ispatchMessage(&msg);
}
Render();
return False;
}
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR CmdLine,int nShowCmd)
{
Init();
OnReset();
While (1)
if(MsgLoop())break;
return 0;
}
下面对几个重点进行说明(这些语句省略了以前的大量枯燥代码):
g_pMainWnd = new CGameWnd(L"TestWnd");
// 创建一个OverlappedWindow风格的窗口
// 然后,通过它的AdjustSize等方法可以方便地调整窗口,但本程序中,直接交给了下面的函数,真省事!
CGraphics::CreateGraphics(g_Width,g_Height,g_hwnd,[True],[True]);
// 根据传入的BackBuf尺寸,建立ddraw及前后台缓冲,
// 然后,根据客户区(==BackBuf尺寸)自动调整窗口的尺寸,调整窗口位置(居中)
// (如果可选的第4个参数(windowed)为False,则调整窗口风格为无边匡标题兰的最大化窗口)
// 当然如果不想自动调整窗口,可以把可选的第5个参数指定为False
pback->Stretch( pic_x, pic_y, pic_ori->GetW() * scale, pic_ori->GetH() * scale,
pic_ori, 0, 0, pic_ori->GetW(), pic_ori->GetH(), False);
// 拉伸Blt表面。这里会先在逻辑层进行剪裁计算,不仅保证Blt不出错,还保证贴图的位置在逻辑上正确!
g->Present();
// 根据windowed与否,以及窗口客户区大小等,进行Present. |
|