( 现在开始,我们绘制的时候,我将把图形块用 /\ 来表示。) ( \/ )
如果你稍微研究一下这个形状,你就会发现他们可以很容易的摆在一起。画完一个图形块时,向右走16个象素,向下走8个元素,再画下一个。于是,一个如此绘制完的屏幕就象下图所示: +-----------+ |/\/\ | |\/\/\ | |/\/\/\ | |\/\/\/\ | |/\/\/\/\ | |\/\/\/\/\ | |/\/\/\/\/\ | +-----------+
但是你如何知道那一块画在哪儿呢?再看一下屏幕,这一次放大地图的x和y轴的坐标:(上面的数字是x轴,下面的是y轴) +-------------------+ | /\ | | / 0 \ | |/\ 0 /\ | 注意: | 0 \/ 1 \ | | 1 /\ 0 /\ | / \ |\/ 1 \/ 2 \ | Y /\ X | \ 1 /\ 0 /\ | / /\/\ \ | 1 \/ 2 \/ 3 \ | /\/\/\ | 2/ \ 1 /\ 0 / \ | \/\/\/ +-------------------+
所以在一张地图中就是这样的: -X- | 0 1 2 3 Y 1 X X X | 2 X X X 3 X X X
现在看起来我们好象要向右下方画了,但是不。这并不是绘制的最佳方式。事实上,我们仍然可以从左向右,从上向下画。什么?我想你在说这个方法行不通吧。好,这里有一点不同。当我们从左向右绘制的时候,我们的图形块空出了32个象素的距离。当我们从上向下移动时,我们一次只要移8个象素。每换一行,我们先向 左移动16个象素以使它们恰好拼接在一起。于是我们绘制的屏幕就是这样了:(数字表示图形块绘制的顺序)
+-----------------+ |0 /\ 1 /\ 2 /\|3 | / \/ \/ | 4|/\ 5 /\ 6 /\ 7 | 8 | \/ \/ \/| |9 /\ 10 /\ 11 /\|12 |\/ \/ \/ | 13|/\14 /\15 /\16 |17 | \/ \/ \/| |18 /\19 /\20 / |21 +-----------------+
因为一些图形块会被屏幕的边界“切除”,我们把它们修剪掉。你会注意到每隔一行我们都会多画一个图形块。这是因为这些是预先向左移动后所画的图形块,我们需要为此做出补偿。 明白了吗?尽管这样的绘制很容易,但我们不能用这种方法来更新地图坐标。那么我们如何做呢?好吧,回去看一眼放大后的地图坐标。当你向右移动的时候,注意x和y轴的坐标。你会看到每移动一个图形块,x轴增加了1,而y轴则减少了1。从上向下则有所不同。我们象这样沿着每个垂直方向的图形块前进:
\ 0,0 \ 地图坐标: 1,0 <---- 增加x / 1,1 <-- 增加 y \ 2,1 <---- 增加 x / 2,2 <-- 增加 y
我们每移动一个垂直图形块,就需要轮流的增加x轴和y轴的值。这个方式的意思就是如果垂直方向上图形块的计数是偶数,那么当我们向下移动时,就增加地图x轴的值。如果图形块的计数是奇数,当我们向下移动时,就增加地图y轴的值。因此现在我们就知道了如何绘制屏幕和如何跟踪地图坐标以确定每个绘制的图形块。 接下来是困难部分,把这些放到程序之中使它工作起来。使用你喜欢的地图存储方式(固定数组,可变数组,链表,等等),我们将编写一个简单的绘图程序。在解说过程中,我将使用一个固定数组。我们将使用10x10的地图数组,它可以使图形块以不同的高度叠放起来。这使我们能够组合图形块并创建一个新图块。 在例子中我们需要一个墙和一个有蜡烛的墙。我们不是创建两个墙的图形块,而是创建一个墙和一个蜡烛。你绘制墙之后,再在它的顶部绘制蜡烛。如果你要在其他地方使用蜡烛,将它覆盖上去即可。 所以我们需要分配一个数组来存放图形块的编号和高度。在C语言表示如下:
struct MAP_STRUCTURE { char num_tiles; char tiles[10]; // 假设每个地图坐标上最多绘制10个图形块 char height[10]; // 也假设为10 };
以及一个地图数组:
MAP_STRUCTURE map[10][10];
我们在地图中需要三种不同的对象: 0)草 1)墙 2)高墙
看一下我们的例子地图:
0 1 2 3 4 5 6 7 8 9 0 O O O O O O O O O O 1 O . . . . . . . . O 2 O . . . . . . . . O . = 草 (0) 3 O . . o o o o . . O o = 墙 (1) 4 O . . o . . o . . O O = 高墙 (2) 5 O . . o . . o . . O 6 O . . o o o o . . O 7 O . . . . . . . . O 8 O . . . . . . . . O 9 O O O O O O O O O O
(未完 | |