游戏中地图的画法 |
| 作者:佚名 来源:本站整理 发布时间:2008-4-8 0:57:43 |
|
现在,让我们把一个飞碟精灵放到屏幕的底部。在屏幕上显示出的效果好象我们的飞碟正在无垠的太空中飞行。 <下面是我们的第二段源码> HBTIMAP hUFO; .... LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam) { switch(message) { case WM_WMTIMER: DrawStars(); TransparentImage(hOffscreenDC,100,300,24,20,hUFO,...); UpdateDisplay(hWnd); break; case WM_CREATE: InitOffscreen(240,320); InitStars(); hUFO = LoadBitmap(hInst,(TCHAR*)1); break; case WM_DESTROY: DeleteObject(hUFO); DeinitStars(); DeinitOffscreen(); PostQuitMessage(0); break; case WM_KEYDOWN: DestroyWindow(hWnd); break; default: DefWindowProc(hWnd, message, uParam, lParam); } return 0; } 我们还能改进这一技术,来使它看上去更加的逼真。例如,让一部分星星闪烁,画一个彗星,用一个可以产生动画效果的星星的精灵替代象素表示的星星。 这些技巧可以被用于侧滚但是这样应用好象缺乏空间的感觉。另外显得和其他游戏式样格格不入。 好了,还是让我们学习些其他的技巧吧.... 贴图 另一种流行技术是使用一张贴图。一旦我们掌握了这项技术,我们就能够设计大部分的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显示游戏。如果我们有一张30x30象素贴图。我们需要地图数据用8x8块贴图画满整个屏幕。如果我们想使他可以移动出屏幕的边界,只需要地图数据的宽与比屏幕宽些。在这个例子中我们将地图数据设置成了9行11列。 |
| [] [返回上一页] [打 印] |
|
文章评论 |



