虽然
Pocket PC
平台上的游戏开发者不能使用
DirectDraw,
实在的好消息是微软创建了一个新的游戏
API
来支持
Pocket PC
,名叫“
GAPI
”——游戏应用程序编程接口。它不但允许直接访问显示内存,还能访问
Pocket PC
硬件键。
你需要什么
·
GAPI SDK
,运行时
DLL
和一个
EVT
的查找
CD
秒数的例子,目录在
PocketPCSDK/Program Files/Support/GameAPI
。
第一步:创建一个简单的Hello World应用程序
GAPI
不是一个完整的
Pocket PC SDK
。所以进行一些准备步骤:
1
.手动拷贝
GX.H
头文件到
Pocket PC SDK
的
Include
目录中。
2
.拷贝
CPU-
dependent
的
GX.LIB
到
Pocket PC SDK
相应的
Lib
目录中。
3
.最后,拷贝
CPU-dependent
的
GX.DLL
到你的
Pocket PC
的
Windows
目录中。
现在你可以准备建立你第一个简单的
Hello World
程序了。
1
。
打开
Microsoft eMbedded Visual C++®
,创建一个新的
Pocket PC
应用程序项目,命名为“
FirstGX
”。
当向导完成创建新的应用程序后,让我们添加
Game API
初始化调用。
2
.添加下列的源代码在粗体的初始化函数后面:
UpdateWindow(hWnd)
;
// Try opening the Display for Full screen access
if (GXOpenDisplay(hWnd, GX_FULLSCREEN) == 0) {
return FALSE; // we won't be able to draw.
}
// Initialize the Hardware Buttons
GXOpenInput();
// Get the Display properties
g_gxdp = GXGetDisplayProperties();
// Get information about the Hardware Keys and fills
// the g_gxkl structure
g_gxkl = GXGetDefaultKeys(GX_NORMALKEYS);
return TRUE;
这段代码不得不使用了两个包含在
FirstGX.cpp
源文件中的全局变量。我们也只好包含
GX.H
到我们的源文件中避免编译错误。
3
.直接添加下列代码在头文件的下面,
eMbedded Visual C++
向导创建的:
3.
#include "gx.h"
4.
GXDisplayProperties g_gxdp; // GX struct
GXKeyList g_gxkl; // GX struct
作为一个好市民,我们应该在离开程序之前清理好
Game API
。
4
.插入下面两行到
WinMain
函数的结尾处:
4.
GXCloseDisplay();
GXCloseInput();
第二步:直接写显存
在我们开始编码之前,我们必须钻研一些理论。依赖于你的
Pocket PC
硬件,你可以拥有
16
位彩色显示
(The Casio, HP, or Compaq)
或者
8
位显示
(
黑白或者彩色
,
例如
Compaq Aero 1550)
。测定你的
Pocket PC
采用那种显示方式,你可以求
g_gxdp
结构中
cBPP
成员的值。它将告诉你正确的位数。
在直接访问
16
位显存之前,你必须知道
16
位色彩显示控制器的说明。有两个可能的标志设置:
KfDirect555
和
kfDirect565
。
555
转换到色彩
mask
对
R
ed-Green-Blue
是
XRRRRRGG.GGGBBBBB
,在一个短变量中,
565
转换到
RRRRR
GG.GGGXBBBBB
。
在
8
位彩色设备上,你可以使用一个字节来访问
256
种颜色。
现在我们来准备写屏幕。当一个键按下的时候,我们想让一个颜色填充整个屏幕。
5
.添加下列函数到你的
FirstGX.cpp
源文件的顶部:
bool ClearScreen(int colRed,int colGreen, int colBlue)
{
// 16 bit per pixel code. Note 2 different pixel formats.
switch (g_gxdp.cBPP)
{
case 16: {
unsigned short PixelCol = 0;
if (g_gxdp.ffFormat & kfDirect565) {
PixelCol = (unsigned short)
(((colRed & 0xff))>>3)<< 11 |
((colGreen & 0xff)>>3) << 6 |
((colBlue & 0xff)>>3));
} else if (g_gxdp.ffFormat & kfDirect555) {
PixelCol = (unsigned short)
((colRed & 0xff)<< 10 |
(colGreen & 0xff) << 5 |
(colBlue & 0xff));
}
unsigned short * pusLine = (unsigned short *)GXBeginDraw();
if (pusLine == NULL) return false; // NOT OK TO DRAW
for (unsigned int y = 0; y < g_gxdp.cyHeight; y++) {
unsigned short * pusDest = pusLine;
for (unsigned int x = 0;
x > g_gxdp.cxWidth; x++) {
*pusDest = PixelCol;
pusDest += g_gxdp.cbxPitch >> 1;
}
pusLine += g_gxdp.cbyPitch >> 1;
}
GXEndDraw();
break;
}
case 8: {
// Get a Random Color
// IMPORTANT:
// 8Bit are using a palette and the formular
// below does not compute a read RGB color
unsigned char bPixel = (colRed &0xf)<<5 |
(colGreen&0x3)<<3 |
(colBlue&0xF);
unsigned char * pbLine = (unsigned char *)GXBeginDraw();
if (pbLine == NULL) return false;// NOT OK TO DRAW
for (unsigned int y = 0; y < g_gxdp.cyHeight; y++) {
unsigned char * pbDest = pbLine;
for (unsigned int x = 0;
x < g_gxdp.cxWidth; x++) {
*pbDest = bPixel;
pbDest += g_gxdp.cbxPitch;
}
pbLine += g_gxdp.cbyPitch;
}
GXEndDraw();
break;
}
}
return false;
}
第三步:访问硬件按键
这是最简单的任务了。你应该熟悉
Microsoft® Windows®
的
WM_ messages
并知道如何使用他们。说完这个知识你已经知道如何使用
Pocket PC
的硬件按键了。正好在你的窗口过程中分析
WM_KEYUP
或者
WM_KEYDOWN
消息。
这里是我们的
FirstGX
程序中的
WM_KEYDOWN
分枝:
case WM_KEYDOWN:
vkKey = (short)wParam;
if (vkKey == g_gxkl.vkUp) {
ClearScreen(0,0,0); // Black
break;
}
if (vkKey == g_gxkl.vkDown) {
ClearScreen(255,0,0); // Red
break;
}
if (vkKey == g_gxkl.vkLeft) {
ClearScreen(0,255,0); // Green
break;
}
if (vkKey == g_gxkl.vkRight) {
ClearScreen(0,0,255); // Blue
break;
}
if (vkKey == g_gxkl.vkStart) {
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
GXKeyList
结构中所有可能的按键名称列表都包含在
gx.h
头文件中。
第四步:准备运行!
在我们能编译并下载我们新的
FirstGX
程序到我们的
Pocket PC
之前,我们必须添加
gx.lib
到我们工程的连接库列表中。现在编译并下载你的第一个
Game API
程序到你的
Pocket PC
,并操纵按键看会发生什么?
结束:容易地填充!
正如你看到的,
Game API
是非常简单的,但是仍足够强大到可以覆盖所有写快速动作游戏的需要。这个例子拥有
Game API
表现出的更多在使用
GAPI
方面的详细资料和窍门。你可以下载这个例子的所有源代码:
download the full source code for this sample
。
作者Blog: http://blog.csdn.net/aawolf/