本系列文章由sky编写,转载请注明出处。 http://blog.csdn.net/qq573011406/article/details/8145569
作者:袁全伟 邮箱: qq573011406@126.com 欢迎邮件交流编程心得
引子:
图1就是RMXP中的自动元件的Title图,可以看到我用小格子把图一分成了48份。并且给每个格子分配一个数字编号(从0到47)。我们以后把这些小格子称为小元件。每个小元件的大小为16*16。在RMXP中绘制自动元件时,是以一个32*32的单元格为单位的,我们这里称这种单元格为大元件,4个小元件可以组成一个大元件。
为了方便以后的研究,我们给每一个小元件按照它的功能起一个名字。我把这些小元件分成了4大类。分别是边,外角,内角和中心。
边:由图一可以看出共有四条边,我们按照其所在的位置称之为上边,下边,左边,右边
每条边由两个角边和一个中边组成,角边就是靠近角的那个部分的边。被用红色圈起来的那个就是一个角边。
中边,顾名思意,它是一条边的中间部分。略有不同的它由两个小元件组成,编号为14,15的小元件就可以组成一条中边。
![](https://img-my.csdn.net/uploads/201211/04/1352006125_2197.png)
图中用红色圈出来就是外角。可以看出共有四个外角,按照它所在的位置,我们分别成之为:左上外角,右上外角,左下外角,右下外角。
内角:
图中用红色圈出来的就是内角。同样,按照所在位置,它们分别是左上内角,右上内角,左下内角,右下内角。
中心:
图中用红色圈起来的就是中心,它由四个小元件组成
原理推导:
RMXP在渲染自动元件单元格时,会根据该单元格的周围8个方向单元格的状态来决定,此单元格应该如何绘制.
为了研究方便,我们给单元格周围8个方向的单元格分别起一个名字.
我们把上,下,左,右.四个方向的边,称为单元格的边. 分别是上边,下边,左边,右边.
把单元格左上,右上,左下,右下,成为单元格角.分别为左上角,右上角,左下角,右下角.
我们把要绘制的单元格分成四个块(前面已经提过,一个大元件由四个小元件组成,PS:以后把要绘制的单元格成为目标格)
分别为 LT :左上
LB:左下
RT:右上
RB:右下
边的绘制 :一:中边
我们先来看一下在什么情况下,目标格会绘制边
首先我们去掉了目标格的上边:
发现RMXP在目标格的LT和RT位置绘制了一条上中边
我们再分别试试其他的边.得到一下的结果
因此可以总结出:
规律1:
如果缺少某方向的边,则在大元件的相同方向的位置绘制某方向的中边..
设缺边方向为X则,如果X为垂直方向(上/下)则B为左,D为右,否则B为上,D为下.
在大元件的XB位置绘制X中边,由于X中边占用两格所以XD位置也被占用了.
二:角边
那么在什么情况,会绘制角边呢.这次我们去掉目标格的两条边试试.
我们分别去掉,上下边.. 和左右边. 下图是结果.
可以看出目标格上并没有被绘制出角边..
我们去掉其他两边试试.
这次我们去掉了,左边,下边, 下边,右边, 左边,上边和上边,右边..
根据上图我们发现,只有去掉的两边为临边的情况下,才会在目标格子上绘制角边.
规律2:
如果所缺的两个边相邻,假设缺边的方向为X,Y
假设X的向对方向为A,Y的相对方向为B,如缺少X边和Y边,则将X边的Y角边绘制在大元件的XB位置
将Y边的X角边绘制在大元件的AY位置
例如:设X为左,Y为下,则A为右,B为上,如缺少左边和下边,则将左边的下角边绘制在大元件的左上位置
将下边的左角边绘制在大元件的右下位置
角的绘制 :
一:外角
绘制外角所需要的条件其实与在绘制角边的时候情况相同,但是以后在写程序时,要保证相应的绘制顺序,否则会出现覆盖的情况,从而得不到正确的情况.
依然拿这张图来讲,看以看到,如果目标格构成某个角的两边同时缺少的话,就会在目标格相应位置上绘制相应的外角.
例如左上角,如果同时缺少左边,和上边.则会在目标格的LT位置绘制左上角.
规律3:检测某个方向角的两边是否同时缺少,是.则在该方向绘制相应的外角
即如果XY角同时缺少X边和Y边,则在大元件的XY位置绘制XY角.
例如X为左,Y为上.
则如果同时缺少左边和上边,则在大元件的左上位置绘制左上角
二:内角
通过上图我们看出,当目标格缺少某个角时,就会在目标格的相应位置绘制相应的内角.
但是当我们去掉构成所缺角的其中一边.上边的就不成立了.
因此,
规律4:如果缺少某方向的角,且不缺少构成该角的任何一边,则
则在大元件相应方向位置上绘制相应的内角
例如:如果缺的是左上角且不缺少左边和上边则在大元件的左上位置绘制左上内角
在程序中绘制自动元件 :
在程序中绘制自动元件时的流程应该是:
- 绘制边
- 绘制外角
- 绘制内角
下面提供一个绘制的例子:
最终结果:
LT:左上角
LB:左下角
RT:上边的左角边
RB:下边的左角边
左上角(缺少)|上 边(缺少) |右上角(缺少)
左 边(缺少)|中 心 |右边(不缺)
左下角(缺少)|下 边(缺少) |右下角(不缺)
绘制流程:
1.画边:
(1)检测到缺少上边,并检测到同时缺少左边
LT:
LB:
RT:上边的左角边
RB:左边的上角边
(2)检测到缺少下边,且同时缺少左边
LT:左边的下角边
LB:
RT:上边的左角边
RB:下边的左角边
(3)检测到缺少左边
重复(1)(2)
LT:左边的下角边
LB:
RT:上边的左角边
RB:下边的左角边
2.画外角
(1)检测到同时缺少左上角左边和上边
LT:左上角
LB:
RT:上边的左角边
RB:下边的左角边
(2)检测到左下角同时缺少左边和下边
LT:左上角
LB:左下角
RT:上边的左角边
RB:下边的左角边
3.画内角
(1)没有检测到符合条件的元件
小结 :
如果理解了上面的那些规律,会很容易就写出相应的代码来.我这里已经用C写好了一个.这是运行结果图
我把写好的代码打包放在了CSDN下载里,里面还包含了一个简单的demo.
Demo用的是Allgero游戏引擎,如果你想知道如何使用该引擎的话,请看我前面的教程.
另外压缩包还有我推导绘制原理时的笔记等。
下载地址:http://download.csdn.net/detail/qq573011406/4730729