WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程Win Mobile游戏开发游戏中地图的画法

游戏中地图的画法
作者:佚名  来源:本站整理  发布时间: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列。

上一页  [1] [2] [3]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码