Pocket PC之Game API入门

Game API入门<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

虽然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 SDKInclude目录中。

2.拷贝CPU- dependentGX.LIBPocket PC SDK相应的Lib目录中。

3.最后,拷贝CPU-dependentGX.DLL到你的Pocket PCWindows目录中。

现在你可以准备建立你第一个简单的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位色彩显示控制器的说明。有两个可能的标志设置:KfDirect555kfDirect565555转换到色彩maskRed-Green-BlueXRRRRRGG.GGGBBBBB,在一个短变量中,565转换到RRRRRGG.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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值