图片拼接:Tile Based Engine 中的墙壁自动拼接处理
基于 Tile 引擎中重复利用率最高图素除了地面就是墙壁了, 大家回想下恺撒III 中修筑城墙, 或是 Simcity2000 中拉扯电线, 道路,每种物体都只有十几种基本图素来拼接而交叉处理都是自动选择正确图素. 假设我们做个地图编辑器, 这个功能应该也不能少吧:-)
实际上, 这个问题早在文本模式就已经出现过. 那就是表格线处理. 文本模式下, 不能绘制直线, 我们需要绘制表格时, 就需要利用 ASCII 来拼接出需要图形. 成功文本编辑器, 都具有绘制制表线功能. 其中最需要解决问题就是表格线交叉时, 如何正确选择合适 ASCII 码.
如果采用多层条件判断是很愚蠢思路方法. 最简洁是将拼接用图素按定次序 (序号 2 进制形式可以反映周围连接状态) 排列. 然后通过简单公式计算出正确元素. 具体就是说, 将上下左右连接用 4 位 2 进制数表示出来. 通过读取当前图素上下左右图素是否有连接来生成个数字, 查表得到正确图素. :-)
下面附有个小, 可以完成上述功能, 感兴趣朋友可以读读 :-)
/*
墙壁交叉 Tile 处理. 类似于文本方式制表符处理,
我们需要针对制表线交叉输出正确 ASCII 码.如果
采用多层条件判断是很愚蠢思路方法. 最简洁是将
拼接用图素按定次序 (序号 2 进制形式可以
反映周围连接状态) 排列. 然后通过简单公式计算
出正确元素.
如下演示了这算法, 其输出结果如下
┏━━┳━━━┳━┓
┃ ┃ ┃ ┃
┃ ┃ ┗━┫
┃ ┃ ┃
┃ ┏┻━┓ ┃
┃ ┃ ┃ ┃
┃ ┗━━╋━━━┫
┃ ┃ ┃
┃ ┃ ┃
┗━━━━┻━━━┛
没有注释, 但应当很容易理解. 如有问题, 可以联系
作者 [email protected]
Homepage: http://member.netease.com/~cloudwu
云风作于 1999 年 9 月 20 日
*/
#
# MAX 12
char wall[32]=\"·┃━┗┃┃┏┣━┛━┻┓┫┳╋\";
char map[MAX][MAX]={
\"............\",
\".oooooooooo.\",
\".o..o...o.o.\",
\".o..o...ooo.\",
\".o..o.....o.\",
\".o.oooo...o.\",
\".o.o..o...o.\",
\".o.oooooooo.\",
\".o....o...o.\",
\".o....o...o.\",
\".oooooooooo.\",
\"............\"
};
{
i,j,id;
for (i=1;i) {
for (j=1;j)
(map[i][j]\'.\') prf(\" \");
{
id=(map[i][j-1]\'o\')<<3|(map[i+1][j]\'o\')<<2|(map[i][j+1]\'o\')<<1|(map[i-1][j]\'o\');
prf(\"%c%c\",wall[id*2],wall[id*2+1]);
}
prf(\"\\n\");
}
0;
}
延伸阅读
最新评论