我们现在有了我们的预步进坐标。当我们准备用mx和my来从地图中绘制图形块时,我们向左移动prestep_x个象素点,向上移动prestep_y个象素点。
OK,我们现在得到了一个平滑滚动。可以考虑加入精灵的问题了。你不能用这个技术绘制一个精灵,因为他们不可能排布在一个16x16的地图内。一个精灵可能会被别的绘制的图形块覆盖的。所以我们需要的是能够在任意坐标位置上绘制我们的精灵。我们所要做的就是给我们的引擎加入能在层上绘图的能力。 这里加入一个图形块的绘制顺序。你首先绘制平整的地面对象,比如草地。然后回来绘制它上面的东西,等等。注意那些大的对象,诸如高墙,需要画在同一层里,因为它们被当作同一个对象。看起来这很难考虑,但如果你不想保留一个zbuffer,那么这的确是需要的。就用一位来工作,你最终会理解它的。
所以我们现在得在我们的结构上加入一个层:
struct MAP_STRUCTURE { char num_tiles; char tiles[10]; // 假设每个地图坐标上最多绘制10个图形块 char height[10]; // 也假设为10 char layer[10]; // 同上 }; MAP_STRUCTURE map[10][10];
现在把下面这些加到地图数据中:
map[0][0].layer[0] = 1; map[0][0].layer[1] = 1; ... map[1][1].layer[0] = 0; ...
现在使用一个这样的循环来绘制:(C语言)
current_layer = 0; max_layers = 0;
while(1) { for(i=0;i<10;i++) { for(j=0;j<10;j++) { for(k=0;k<map[i][j].num;k++) { if(map[i][j].layer == current_layer) { // 绘制图形块 }
if(map[i][j].layer > max_layers) max_layers = map[i][j].layer; } } } current_layer++; if(current_layer >= max_layers) break; }
现在你所要做的一切就是将你要在特定层上绘制的精灵的地图坐标和屏幕坐标联系起来,并绘制它。你可以通过比较当前绘制的图形块坐标和精灵的地图坐标x和y来实现: (sprite_x和sprite_y是所要绘制的精灵的精美坐标) (mx和my是当前要绘制的地图坐标)
if(mx == sprite_x / 16 && my == sprite_y / 16) {
然后你只要在这个位置上绘制精灵之前将精灵偏移一个位置就行了:
xo = sprite_x & 15; yo = sprite_y & 15; xx = xo - yo; yy = (xo/2) + (yo/2); block_draw(sprite_num,screenx-32+xx,screeny-16+yy);
好了,现在就留给你们去得到你们在斜视角视图中新发现的知识了。如果你有任何问题或建议,请发EMAIL或者慢信给我。
Jim Adams Game Developers Network, Inc 1200 N Lamb Ste#124 Las Vegas, NV 89110 EMAIL: tcm@accessnv.com
(完)
|