斜二视图:斜视角视图( 3)

现在我们得定义图片块样子草地是最容易就是个画着草图案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轴设置为816记住在你绘制图形块的前要从坐标值中减去图形块宽度和高度
当左上地图坐标开始画时地图坐标传递给绘图我们现在开始对每个要绘制垂直图形块执行个循环个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时)


(未完)
Tags:  cad三视图 三视图课件 三视图 斜二视图

延伸阅读

最新评论

发表评论