天极IT资讯短信服务 电脑小技巧
|
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。 | |
游戏中的大多数物体不是矩形,但是一个位图却是矩形,因此我们必须找到一个方法来绘制物体真正的形状而不是矩形。
图片 如果我们在游戏编程中谈及图片,通常指的是光栅图象或位图。我会假定你已经了解有关的知识,但下面仍然给出少许解释。
位图或者光栅图象是一种以数字格式储存照片或图片的方法。它将照片每行每列的象素转化为二进制数据的矩阵。矩阵每个单元格的数据代表图片显示的一个象素。因此,一个位图必然是矩形的。如:
00 01 10 FF FE 12 15 11 11 12 11 16 18 90 11 C0 00 00 01 02 03 04 05 06 11 12 11 15 16 D0 ED DD 00 01 10 FF FE 12 15 11 11 12 11 16 18 90 11 C0 00 00 01 02 03 04 05 06 11 12 11 15 16 D0 ED DD |
象素的格式和单元格的大小是依赖于它所采用的颜色坐标体系。我们知道位图有几种不同的文件格式。但是它们都是基于一些相同的概念。
这里,我只是告诉你“位图是矩形的”,因为我们这个章节使用Windows的位图。但是,我并不想深入讨论位图的内部格式。
精灵
通常,有两种流行的技术来完成精灵的绘制工作。关键色和alpha 通道。关键色技术是一种非常著名的精灵绘制方法,因为它非常简单而且容易理解。现在,让我们多了解一些这两种技术。
现在,让我们看看下面这个飞碟的图片:
此主题相关图片如下:

请注意图片中围绕着飞碟的白色部分,如果我们将10个飞碟图片都画到屏幕上一个接近的区域。结果就是下面这个样子,图片的白色部分也会覆盖飞碟的图象,而不是我们所需要的正确结果:
此主题相关图片如下:

关键色是指将图片绘制到图形表面时,忽视图片中所指定的颜色。这有些象蓝屏技术(就是在电视和电影制作中使用蓝色的背景,在后期合成时将所有蓝色的内容替换成其他的背景视频或虚拟场景)。但是,我们使用的这个技术更简单一些,因为它并不判断相近的颜色,只是将相同的颜色忽略。
我们将关键色填充到图片中非物体的区域。在下面标记为紫红色RGB(255,0,255)。
此主题相关图片如下:

上图中,紫红色的区域都不是飞碟的部分,因此我们采用它做关键色。当将图片中的每个象素绘制到屏幕上时,我们忽略关键颜色颜色RGB(255,0,255)。代码如下:
for(nRow=0; nRow<NHEIGHT;&NBSP;NROW++) { for(nCol=0; nCol<NWIDTH;&NBSP;NCOL++) { dwPixel = GetPixel(hMemDC,nCol,nRow); if(dwPixel != dwTransparentColor) SetPixel(hDC,nPosX+nCol,nPosY+nRow,dwPixel); } } |
Alpha通道或掩码图方式使用另外的方法来区分图片中物体和非物体的部分。它使用一个另外的黑白位图,通常被称为掩码位图。掩码位图中白色的象素表示物体的部分。下图则是原图和它的掩码位图。
此主题相关图片如下:

这种方法的优点是,它同样适用与Alpha混合方式。这种方式用不同的灰度值代表图片象素和目的象素的混合程度,而白色恰好代表图片象素完全取代屏幕象素,黑色代表完全忽略图片象素。我不打算在这里介绍这种方式,如果你更倾向于GKS(图形内核系统)的概念,你可用这样的两个位图按用下面的步骤完成精灵的绘制:
1 一个带掩码位图的图片
2 反转掩码位图
3 将掩码位图中的象素与目的表面的象素按位与
4 将原始图片中的象素与目的表面的象素按位或
用Win32的代码描述如下:
void PutSprite(HDC hDC, int nPosX, int nPosY, int nCX, int nCY, HBITMAP hObj,HBITMAP hMask) { HDC hMemDC, hMaskDC; hMemDC = CreateCompatibleDC(hDC); hMaskDC = CreateCompatibleDC(hDC); SelectObject(hMemDC,hObj); SelectObject(hMaskDC,hMask); BitBlt(hMemDC,0,0,nCX,nCY, hMask,0,0,SRCAND); PatBlt(hMaskDC,0,0,nCX,nCY,DSTINVERT); BitBlt(hDC,nPosX,nPosY,nCX,nCY, hMaskDC,0,0,SRCAND); BitBlt(hDC,nPosX,nPosY,nCX,nCY, hMemDC,0,0,SRCPAINT); DeleteDC(hMemDC); DeleteDC(hMaskDC); } |
Windows中的位图资源
我们可以在我们的可执行文件中储存位图,方法就是用内部资源。使用这个方法,可以很容易的使用位图,当然你要先创建资源描述的源文件。否则,你将需要从外部文件装载位图。
想要更多的了解这个资源描述的文件格式,可以查看Win32的
程序员手册。下面是一个简单的例子,如果你需要在可执行文件中储存一个位图,你可以新建一个文件,写入如下代码:
#include <windows.h> 1 BITMAP yourfile.bmp |
第一行是包含windows头文件,这里面包含所有必须的预定义符号。第二行分成三个部分:资源ID,资源类型和资源文件名。将这个文件保存为后缀为.rc的文件,然后加入整个工程(方法是在工程环境窗口的工程名字上点右键,选择Add to Project,然后选择你刚才保存的rc文件)。完成这一切后,你就可以在你的程序中使用LoadBitmap函数装载位图了。代码如下:
HBITMAP hBmp; hBmp = LoadBitmap(hInstance,MAKEINTRESOURCE(1)); Having used the bitmap, you can remove it from memory by using the DeleteObject(...) function. DeleteObject(hBmp); |