⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2d.txt

📁 一个2D游戏引擎设计的完整文档
💻 TXT
📖 第 1 页 / 共 2 页
字号:

HDC(Handle of Device Context)为一个设备环境的句柄。这里用来表示显示设备。

GetDC(&hDC)函数用来取得一个显示设备然后将这个设备的句柄赋给hDC。这听起来让人糊涂,其实意思是说,用GetDC(&hDC)函数来创建一个同Windows GDI兼容的设备环境给指定页面。用变量hDC来表示这个设备环境。

SetBkColor和SetTextColor当然就是设置背景颜色和字符颜色了。它们和TextOut都是标准的Windows GDI函数,可以参考任何一本关于Windows GDI的书。其实一看便明白TextOut(hDC, 220, 200, "Yes, I did it!", 14)中,hDC当然就是前面说的显示设备,220肯定是X坐标,那么200当然就是Y坐标了,"Yes, I did it!"意思是“我成功了!”,而14则表示这个字符串有14个字符。下面的LPSTR则是Win32的字符串类型,lstrlen(lpMesg)也是Windows的标准函数用来计算字符串的长度。最后别忘了删除掉这个设备。

我好象快成长舌妇了,如果我再罗嗦下去的话,你可能会找月光宝盒逃命了。但悟空,为师不得不再说一句,千万别忘了清除掉几个全局变量,不然你可能每运行一次程序都得重启一次电脑,电脑这东西是宝物,重启会影响寿命,就算不影响寿命浪费能源也是不好的嘛......
清除变量:

if(lpDD != NULL)

{

if(lpDDPS != NULL)

lpDDPS->Release();

lpDDPS = NULL;

}

lpDD->Release();

lpDD = NULL;

}

将上面的代码整理放入上次的最简单的Windows程序就能可以运行了。但记得在VC的Project/Settings里将ddraw.lib加入连接库里。

下面是完整的程序:

#include <windows.h>
#include <ddraw.h>

LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDPS;

HWND InitWindow(HINSTANCE hInstance, int nShowCmd);
LRESULT CALLBACK WindowProc(HWND hWindow, UINT message, WPARAM wParam,
LPARAM lParam);
bool InitDDraw(HWND hWindow);
void FreeDDraw();

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
MSG msg;
HWND hWindow;

hWindow = InitWindow(hInstance, nShowCmd);
if(hWindow == FALSE)
{
DestroyWindow(hWindow);
return false;
}
if(InitDDraw(hWindow) == false)
{
MessageBox(hWindow, "Error","!" ,MB_OK);
return false;
}
while(GetMessage(&msg, NULL, 0, 0) != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

HWND InitWindow(HINSTANCE hInstance, int nShowCmd)
{
HWND hWindow;
WNDCLASS WindowClass;

WindowClass.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WindowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
WindowClass.style = CS_HREDRAW | CS_VREDRAW;
WindowClass.lpfnWndProc = WindowProc;
WindowClass.cbClsExtra = 0;
WindowClass.cbWndExtra = 0;
WindowClass.hInstance = hInstance;
WindowClass.lpszMenuName = "ClassName";
WindowClass.lpszClassName = "ClassName";

RegisterClass(&WindowClass);

hWindow = CreateWindowEx(0, "ClassName", "WindowTitle",
//WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU,
WS_POPUP,
(GetSystemMetrics(SM_CXFULLSCREEN) - 640)/2,
(GetSystemMetrics(SM_CYFULLSCREEN) - 480)/2,
640, 480,
NULL, NULL, hInstance, NULL);
if(!hWindow)
return FALSE;

ShowWindow(hWindow, nShowCmd);
UpdateWindow(hWindow);

return hWindow;
}

bool InitDDraw(HWND hWindow)
{
DDSURFACEDESC ddsd;
HDC hdc;
LPSTR lpMesg;

if(DirectDrawCreate(NULL, &lpDD, NULL) != DD_OK)
return false;

if(lpDD->SetCooperativeLevel(hWindow,
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT) != DD_OK)
return false;
if ( lpDD->SetDisplayMode(800, 600, 32) != DD_OK)
return false;

ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(lpDD->CreateSurface(&ddsd, &lpDDPS, NULL) != DD_OK)
return false;

if(lpDDPS->GetDC(&hdc) != DD_OK)
return false;
SetBkColor(hdc, RGB(0, 0, 255));
SetTextColor(hdc, RGB(255, 255, 0 ));
TextOut(hdc, 220, 200, "Yeh, I did it!", 14);
lpMesg = "Press ESC to exit";
TextOut( hdc, 280, 240, lpMesg, lstrlen(lpMesg));
lpDDPS->ReleaseDC(hdc);

return true;
} 

void FreeDDraw()
{
if(lpDD != NULL)
{
if(lpDDPS != NULL)
{
lpDDPS->Release();
lpDDPS = NULL;
}
lpDD->Release();
lpDD = NULL;
}
}


LRESULT CALLBACK WindowProc(HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hWindow, WM_CLOSE, 0, 0);
break;
}
break;
case WM_DESTROY:
FreeDDraw();
PostQuitMessage(0);
break;
}
return DefWindowProc(hWindow, message, wParam, lParam);
}

这个程序将那个史上最愚蠢的Windows程序升级为在DirectX下的全屏模式下显示两句傻兮兮的英文。我相信这足以让很多有志于做专业的游戏却又不知如何入手的人高兴上三天三夜。因为进入游戏编程的神秘殿堂似乎就在那漆黑的前方。虽然还不知道前面有多少艰苦的路要走,但起码我们已经找到了正确的方向。

我仍然强烈建议你仔细地阅读MSDN的说明,即可提高英文水平又能比较全面地理解这些代码。

今天,你学会了怎样在全屏模式下显示文字,你可以试试将它改到窗口模式下。或加入一些其它东西。不管你有什么古怪的想法,都不要害怕去实现它,只有不断地把你的电脑弄死机,你才能成为真正的高手

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -