Game API入门

虽然 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值