|
现在我们得定义图片块的样子。草地是最容易的,就是一个画着草图案的16x15的图形块。墙是一个16x50的图形块。既然我们用叠放的方法绘制,高墙就是两个墙。一个比另一个要高。 因此现在我们这样将数据放入我们的地图数组:(图形块0 = 草,图形块1 = 墙)
map[0][0].num = 2; map[0][0].tile[0] = 1; map[0][0].height[0] = 0; map[0][0].tile[1] = 1; map[0][0].height[1] = 50; ... map[1][1].num = 1; map[1][1].tile[0] = 0; map[1][1].height[0] = 0; ...
现在得到了这个方法。我们的绘图循环将在地图中遍历数组每一个元素,根据num来决定在那里绘制多个图形块。 另外,因为每个图形块可以在宽度和高度上有不同的大小,我们需要建立一个对于所有图形块都相同的操作位置。右下角是个不错的位置。只要在绘制之前,将宽度和高度屏幕x和y的位置中减去。
在C里,方法是这样的: (注意,这不是斜视角的绘制方法,它只是帮助你理解叠放绘制的方法)
for(i=0;i<10;i++) { for(j=0;j<10;j++) { for(k=0;k<map[i][j].num;k++) { tile_to_draw = map[i][j].tile[k]; height_to_draw = map[i][j].tile[k]; width = block_width(tile_to_draw); height = block_height(tile_to_draw); block_draw(tile_to_draw,x-width,y-height-height_to_draw); } } }
你所有需要做的是应用上面所学的方法根据地图坐标来得到斜视角视图。你会注意到当你从上向下,从左向右绘图时,这个方法自动的盖过所有的图形块,根本不需要什么zbuffer或是类似的东西。
绘制斜视角的地图时,按如下方法来做: 一开始将当前屏幕的x轴和y轴设置为8,16。记住在你绘制图形块之前,要从坐标值中减去图形块的宽度和高度。 当左上地图坐标开始画时,地图的坐标传递给绘图程序。我们现在开始对每个要绘制的垂直图形块执行一个循环。一个320x200的屏幕可以垂直绘制25个图形块。我们实际需要画得多些,因为较高的图形块将被修剪掉 ,所以我们大约要垂直画35个。我们现在要建立一个保存地图坐标的临时坐标(因为它们将被搞乱)。我们检查垂直循环是否是一个奇数,如果是,预先将屏幕的x轴向左移动16个象素。现在开始执行一个水平绘制的循环。一共可以绘制12个图形块(每隔一个垂直行为13个)。用图形块来绘制地图。 用上面的结构方法来绘制图形块。向右移动32个象素点,在临时地图坐标x上增加1,在临时地图坐标y上减去1。完成水平循环。现在向下移动8个象素点。如果这是一个偶数行,则在地图的x轴上加上1,否则在y轴上加上1。完成垂直循环。瞧,现在屏幕就画好了。 当你得到这个工作引擎后,你会发现当你在任意方向上移动的时候,它会“跳动”32或16个象素点,而不是“平滑”的滚动。好的,这个非常容易改变。 ·· 我们仍然是一个10x10的地图,象这样:
-X- 0123456789 | 0 .......... Y 1 .......... | 2 .......... 3 .......... 4 .......... 5 .......... 6 .......... 7 .......... 8 .......... 9 ..........
但是现在,我们将每个地图坐标的大小增加到16x16:
X0 X1 ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ Y ................ ................ 0 ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................ ................
地图依旧是10x10,但我们可以在每个坐标的内部移动时依旧提留在它内部。这给了我们一个160x160的范围。我们把这称作精美坐标系统(fine cordinate system)。 注意一点:我们在使用精美坐标时不能使用奇数,因为这会造成一些跳跃性的移动。以后你可以试一试,看一看究竟怎么回事。
现在我们对我们的引擎做了以下改变: - 取得我们需要绘制在屏幕左上的x和y轴的位置,这可以在0-160之间变化,我们将之叫作vx和vy。
- 将这两个数除以16来获得我们所处的地图坐标,我们把这叫作mx和my。 - mx = vx / 16 my = vy / 16
- 我们需要建立一些变量来预步进(prestep)我们要画的图形块,以得到平滑滚动的效果。我们把它叫做prestep_x和prestep_y。我们还需要一些临时变量,我们称为x_off和y_off。 来计算下面这些: -将vx和vy与15进行位与操作:x_off = vx & 15 y_off = vy & 15 -我们计算预步进: prestep_x = x_off - y_off prestep_y = (x_off / 2) + (y_off / 2) (这些函数与你的图形块大小相关,这里是当输出的图形块为32x15时)
(未完)
| | | |