正文

游戏编程起源(初学者)Ⅵ (四) 2006-01-28 12:20:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/mroske/9909.html

分享到:

以上就是第一个函数。下面说说第二个函数StretchBlt(),简单的说,位图实际的拉伸或压缩就是通过它来实现的。函数的一般形式如下:

BOOL StretchBlt(
    HDC hdcDest,      // handle to destination device context
    int nXOriginDest, // x-coordinate of upper-left corner of dest. rectangle
    int nYOriginDest, // y-coordinate of upper-left corner of dest. rectangle
    int nWidthDest,   // width of destination rectangle
    int nHeightDest,  // height of destination rectangle
    HDC hdcSrc,       // handle to source device context
    int nXOriginSrc,  // x-coordinate of upper-left corner of source rectangle
    int nYOriginSrc,  // y-coordinate of upper-left corner of source rectangle
    int nWidthSrc,    // width of source rectangle
    int nHeightSrc,   // height of source rectangle
    DWORD dwRop       // raster operation code
);

它比BitBlt()复杂一些,所以它比BitBlt()慢。它们的参数差不多,并且有了注释,这里就不再重复了。光栅代码也是选择SRCCOPY。现在,只剩下最后一件事情——清除。建立一个设备上下文【CreateCompatibleDC(HDC hdc)】不同于得到设备上下文【(GetDC)】,不能用ReleaseDC(),要用:

BOOL DeleteDC(HDC hdc);

参数是建立的DC的句柄。返回值是一个布尔类型,你知道布尔类型是怎么回事,对吧?All right,感觉还不坏吧。下面我们把以上步骤合并,隆重推出一个超级大包子(我觉得它有点象包子)。我事先假设你已经定义了一个全局的应用程序实例的句柄hinstance

int ShowBitmapResource(HDC hDestDC, int xDest, int yDest, int nResID)
{
    HDC hSrcDC;      // source DC - memory device context
    HBITMAP hbitmap; // handle to the bitmap resource
    BITMAP bmp;      // structure for bitmap info
    int nHeight, nWidth; // bitmap dimensions

    // first load the bitmap resource
    if ((hbitmap = (HBITMAP)LoadImage(hinstance, MAKEINTRESOURCE(nResID), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION)) == NULL)
        return(FALSE);

    // create a DC for the bitmap to use
    if ((hSrcDC = CreateCompatibleDC(NULL)) == NULL)
        return(FALSE);

    // select the bitmap into the DC
    if (SelectObject(hSrcDC, hbitmap) == NULL)
        return(FALSE);

    // get image dimensions
    if (GetObject(hbitmap, sizeof(BITMAP), &bmp) == 0)
        return(FALSE);

    nWidth = bmp.bmWidth;
    nHeight = bmp.bmHeight;

    // copy image from one DC to the other
    if (BitBlt(hDestDC, xDest, yDest, nWidth, nHeight, hSrcDC, 0, 0, SRCCOPY) == NULL)
        return(FALSE);

    // kill the memory DC
    DeleteDC(hSrcDC);

    // return success!
    return(TRUE);
}

最后一件事
你可能还不太明白,但你现在确实有足够的知识用Windows GDI在窗口里建立一个小游戏了!你能创建窗口,显示图形。游戏的逻辑同DOS下的C语言游戏逻辑一样,即使你不知道DOS下的C,你玩过游戏吧,玩过就应该有个初步的认识。你甚至能用鼠标处理产生的消息。但有一件事儿我们漏了,可能它不属于本章的范围,但我们不能不提它——键盘支持。Windows提供了一个非常好的函数GetAsyncKeyState()检测键盘的状态。它返回一个16位的值,高字节显示了一个键子是否被按下。它的原形如下:

SHORT GetAsyncKeyState(int vKey);

参数是键子的标识符。都以VK_开头,例如一些最常用的:VK_RETURNVK_ESCAPEVK_UPVK_LEFTVK_RIGHTVK_DOWN。你甚至可以用VK_LBUTTONVK_RBUTTON标识鼠标按键。多方便呀。观察高字节,如果是1,键子就是正被按下。我总是用一个宏来做这些:

#define KEYSTATE(vknum) ((GetAsyncKeyState(vknum) & 0x8000) ? TRUE : FALSE)

如果你不仔细,可能还没有注意到这个条件符号(?),在C语言中是一个三元算子——评估它左边的表达式。如果表达式的值为true,表达式就是冒号左边的值,如果false,就是冒号右边的值。明白了吗?好极了!

总结
现在,你可以做GDI基础的游戏了。

阅读(3271) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册