贴图
另一种流行技术是使用一张贴图。一旦我们掌握了这项技术,我们就能够设计大部分的2维游戏背景。现在, 让我们看一看下面的贴图或块字符。他们都有一样的边(边长)。
<图1 - 贴图块>

贴图的这一特征可以使它能够被加入到另外的一个块壮区域中。我们能让贴图在上面生产一个游戏的背景。象illustrated bellow(我想是一个游戏)一样。
<图2 - 地图的例子>

但是我们能怎么实现它?什么是我们需要实现的?答案是贴图和一个地图数据。好,按照你在上面看到的贴图,把他们放进一幅单个的位图文件,它看起来像...
<图3-贴图的位图文件>

我们这样放置他们是为了减少位图文件的数量。如果不这样做我们将需要超过10个位图文件。为了能够区别单个的贴图文件,我们把他们划分成行和列。
地图数据是什么? 地图数据意味着用数据的手段来表示地图。 在一般的情况下,我们总是使用文本文件描述一张地图。让我们看上面位图,它使用了3行8列。我们将用字母A代表第一行第一列,B代表第一行第二列... 直到最后一块,就象下面显示的样子;
<图4 - 地图数据>
| A |
B |
C |
D |
E |
F |
G |
H |
| I |
J |
K |
L |
M |
N |
O |
P |
| Q |
R |
S |
T |
U |
W |
X |
Y |
好了我们用字符“A”代表了第一个单独的贴图,B是第二个,C,D,等等代表另外的贴图方块。使用这种方法,我们可以用任意的文本编辑器设计我们的地图。
因此,样品地图<图2>的地图数字可以这样表示;
<图5- 图2的地图数据>
"AAAAAAAAAAA"
"KRRLAOWPAAA"
"ICCJAMBAAAA"
"SQQTAXUYAAA"
"AAAAAAAAAAA"
"AAAAAAAAAAA"
"AAAAAAAAAAA"
"AAAAAAAAAAA"
"AAAAAAAAAAA"
现在,我们需要一个解码程序来解释地图数据,使得将最后的结果输出到我们的屏幕。
<我们的第三段源码>
void RenderTileMap(HDC hDC, BYTE *pMapData, int nMapCX, int nMapCY) { int a, b, c, srcX, srcY, dstX, dstY; int nTileSizeCX, nTileSizeCY;
nTileSiezCX = 30; nTileSizeCY = 30; dstY = 0;
for(a=0; a<nMapCY; a++) { dstX = 0; for(b=0; b<nMapCx; b++) { c = pMapData[a*nMapCx+b] - 'A'; srcX = (c % nMapCX) * nTileSizeCX; srcY = (c / nMapCX) * nTileSizeCY; BitBlt(hDC,dstX,dstY,nTileSizeCX,nTileSizeCY,hDCBitmap,srcX,srcY,SRCCOPY) dstX += nTileSizeCX; } dstY += nTileSizeCy; } } |
如果我们想让它移动。很简单,我们的屏幕大小是240x320,但我们将使用240x240显示游戏。如果我们有一张30
x30象素贴图。我们需要地图数据用8x8块贴图画满整个屏幕。如果我们想使他可以移动出屏幕的边界,只需要地图数据的宽与比屏幕宽些。在这个例子中我们将地图数据设置成了9行11列。
用一个整数变量来控制移动。我们声明一个[nStartPosition]变量存放地图的出发点。我们不断的增加或减少这个变量,使屏幕看上去在左右移动。 让我们试用这代码
<第四段源码>
static BYTE MapData[] = "AAAAAAAAAAA" "AAAAAAAAAAA" "AAAAAAAAAAA" "AAAAAAAAAAA" "AAAAAAAAAAA" "AAAAAAAAAAA" "AAAAAAAAAAA" "AAAAAAAAAAA" "AAAAAAAAAAA";
.... case WM_TIMER: nStartPosition += nOffset; nStartPosition = max(0,min(nMapCX-8)); RenderTileMap(hOffscreenDC,MapData+nStartPosition,11,9); UpdateDisplay(hWnd) break; case WM_KEYDOWN: if((WORD)uParam == VK_LEFT) nOffset = -1; else nOffset = 1; break; case WM_KEYUP: noffset = 0; break; .... |
程序从地图的最左方启动,当到最右方时则滚动屏幕,它会不停的循环直到你停止程序。
这个技术能有效的改进你的游戏。它能被用于许多游戏。虽然比起第一种技术它需要更多的内存,但它绝对是值得一用的技术。