Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
您现在的位置: 天极网 > 开发频道 > 在Pocket PC上编写游戏之七
全文

在Pocket PC上编写游戏之七

2004-04-08 19:19 作者: 雷神编译 出处: vchelp 责任编辑:方舟
  贴图

  另一种流行技术是使用一张贴图。一旦我们掌握了这项技术,我们就能够设计大部分的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列。

  用一个整数变量来控制移动。我们声明一个[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;
....

  程序从地图的最左方启动,当到最右方时则滚动屏幕,它会不停的循环直到你停止程序。

  这个技术能有效的改进你的游戏。它能被用于许多游戏。虽然比起第一种技术它需要更多的内存,但它绝对是值得一用的技术。

共3页。 9 1 2 3 :
共3页。 9 1 2 3 :
网友关注
最新上市
编辑推荐
文章阅读排行
周排行
月排行
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml