一、特技显示的技术基础
实现图像特技显示的基本思想是将图像分成不同的小块,按一定的方向或次序,分阶段显示或擦除图像块。主要四点:
1.如何划分图像块
2.确定图像块的操作次序
3.显示或清除图像块
4.在两个图像块的操作之间延时
划分图像块的方法决定了特技显示的方式;图像块操作的次序则决定了特技显示的方向或细分得依据;显示或清除图像是表现特技的基础;为了实现特技显示应该使图像的显示过程明显地表现出来,这需要在图像特技时进行延时,使用空循环可以简单地实现延时,但延时的时间不是绝对的时间值,而是依赖于机器的速度,使用timeGetTime函数,其返回值是以毫秒为单位的系统时间。
显示图像主要使用BitBlt和SetDIBitsToDevice函数。BitBlt函数的名称来源“Bit Block Transfer”,即位传送,其功能就是通过位图的位块传送来实现位图的复制或显示。SetDIBitsToDevice函数是将DIB的图像位直接传送显示设备上下文。清除图像块的常用方法是图像块区域用指定的背景景色化矩形,这需要先设置好画笔和画刷,并调用Rectangle函数。
特技显示的通用过程可描述如下:
1.获得DIB对应的DDB,设为pBitmap
2.创建和显示设备上下文DC兼容的内存设备上下文MemDC
3.将pBitmap选入MemDC
4.在DC中选取DIB的调色板
5.实现该调色板
6.循环;对所有的图像块,按确定的操作次序用BitBlt函数将MemDC中的一 个图复制到DC中,或者在MemDC的指定区域内化背景色矩形
7.延时
8.结束循环
9.恢复MemDC(DDB和调色板)
10.删除MemDC
特技清除的通用过程可描述如下:
1.创建颜色为指定背景色的画笔和画刷,在DC中选取刚刚创建的画笔和画刷
2.循环;对所有的图像块区域,按确定的操作次序用Rectangle在DC的指定区域内画矩形
3.延时
4.结束循环
5.恢复DC(画笔和画刷)
二、各种特技效果
1.扫描
扫描显示是最基本的特技显示方式,其表现时,图像一行一行或一列一列地显示出来或清除掉,很像打开卷帘或卷起卷帘的操作。根据扫描的方向不同,可分为向上、向下、向左、向右、水平平分和垂直平分6种。
向上/下扫描:
向上/下扫描显示是从图像底/顶部向上/下,一行一行地从源对象中将位图复制到目标对象中,每复制一行后都加上一定的延时。
向上下扫描清除是从图像底/顶部向上/下,一行一行地在显示设备中用背景色画矩形,每清除一行后都加上一定的延时。
向左/右扫描:
向左/右扫描显示是从右/左到左/右,一列一列地从源对象中将位图复制到目标对象中,每复制一列后都加上一定的延时。
向左/右扫描清除是从右/左到左/右,一列一列地在显示设备中用背景色画矩形,每画一次矩形后都加上一定的延时。
垂直平分扫描:
垂直平分扫描显示是从图像顶部向下,从底部向上,一行一行地从源对象中将位图复制到目标对象中,最后会合在图像的中央;每复制一行后都加上一定的延时。
垂直平分扫描清除是同时从图像顶部向下,从底部向上,一行一行地在显示设备中用背景色画矩形,最后会合在图像的中央;每复制一行后都加上一定的延时。
水平平分扫描:
水平平分扫描显示是同时从图像左端向右,从右端向左,一列一列地从源对象中将位图复制到目标对象中,最后会合在图像的中央;每画一次矩形后都加上一定的延时。
水平平分扫描清除是同时从图像左端向右,从右端向左,一列一列地在显示设备中用背景色画矩形,最后会合在图像的中央;每画一次矩形后都加上一定的延时。
2.移动
移动显示的效果很像关闭和打开推拉门,图像从边缘一步步移动出来或向边缘移走,直到完全显示或完全消失。根据移动的方向不同,可分为向上、向下、向左、向右、水平平分、垂直平分、水平交叉和垂直交叉8种。
向下移动:
向下移动的显示是从图像的底部开始,将图像一行一行地复制到目标对象的顶部。每复制一行后,复制的行数便增加一行,并加上一定的延时。
向下移动清除的实现包含向下移动显示和在显示区域的上部画不断增高的矩形。
向上移动:
向上移动的显示是从图像的顶部开始,一行一行地将图像复制到目标对象的底部。每复制一行后,复制的行数便增加一行,复制的位置向上递减一行,并加上一定的延时。
向上移动清除的实现包含向上移动显示和在显示区域的下部画不断增高的矩形。
向左移动:
向左移动的显示是从图像的左端开始,一列一列地将位图复制到目标对象的右端。每复制一列后,复制的列数便增加一列,复制的位置向左递减一列,并加上一定的延时。
向左移动清除的实现包含向左移动显示和在显示区域的右边画不断增宽的矩形。
向右移动:
向右移动的显示是从图像的右端开始,一列一列地将图像复制到目标对象的左端。每复制一列后,复制的列数便增加一列,并加上一定的延时。
向上移动清除的实现包含向右移动显示和在显示区域的左边画不断增高的矩形。
垂直平分移动:
垂直平分移动
显示将同时进行如下两种操作:
1.从图像的中央开始,将位图一行一行地复制到目标对象的顶部。每复制一行后,复制的行数便增加一行。
2.从图像的中央开始,一行一行地将位图复制到目标对象的底部。每复制一行后,复制的行数便增加一行,复制到的位置向上递减一行。
最后会合在图像的中央,每复制一行后都加上一定的延时。
垂直平分移动
清除的实现是从图像的中央开始,将图像的上半部分向上移动清除,将图像的下半部分向下移动清除。
水平平分移动:
水平平分移动
显示将同时进行如下两种操作:
1.从图像的中央开始,将图像一列一列地复制到目标对象的左端。每复制一列后,复制的列数便增加一列,并加上一定的延时。
2.从图像的中央开始,一列一列地将位图复制到目标对象的右端。每复制一列后,复制的列数便增加一行,复制到的位置向左递减一列。
最后会合在图像的中央,每复制一列后都加上一定的延时。
水平平分移动
清除的实现是从图像的中央开始,将图像的左半部分向左移动清除,将图像的右半部分向右移动清除。
垂直交叉移动:
垂直交叉移动
显示将图像分成左右两部分,同时进行如下两种操作:
1.左半部分从图像底部开始,将图像一行一行地复制到目标对象的顶部,每复制一行后,复制的行数便增加一行。
2.右半部分从图像顶部开始,一行一行地将位图复制到目标对象的底部,每复制一行后,复制的行数便增加一行,复制的位置向上递减一行。
每复制一行后都加上一定的延时。
垂直交叉移动
清除是从图像的中央开始,将图像的左半部分向下移动清除,将图像的右半部分向上移动清除。
水平交叉移动:
水平交叉移动
显示将图像分成上下两部分,同时进行如下两种操作:
1.上半部分从图像右端开始,将图像一列一列地复制到目标对象的左端,每复制一列后,复制的列数便增加一列。
2.下半部分从图像左端开始,一列一列地将位图复制到目标对象的右端,每复制一列后,复制的列数便增加一列,复制的位置向左递减一列。
每复制一列后都加上一定的延时。
水平交叉移动
清除是从图像的中央开始,将图像的上半部分向右移动清除,将图像的下半部分向左移动清除。
马赛克
马赛克显示是指图像被分割成许多小方块,它们以随机的次序显示出来,直到整幅图像完全显示为止。
实现马赛克显示需要解决两个难点,即如何产生随机的小方块序列和如何将它们显示到相应的位置上。
为解决第一个问题,首先应定义小方块的大小,并以此确定小方块的数量。解决第二个问题的关键是定义一个数组来记录每个小方块的左上角坐标,先是小方块的位置将由该数祖来保存。
这样,只要随机构造记录所有小方块左上角坐标的POINTS结构数祖,便解决了上述的两个难点,使用的伪代码算法描述如下:
只要数祖中还存在点,就进行循坏;
在数祖中随机选取一个点;
先是该店对应的小方块;
将数组中的最后一点拷贝到该点;
删除数组中的最后一个点;
结束循环;
马赛克显示是指图像被分割成许多小方块,它们以随机的次序显示出来,直到整幅图像完全显示为止。
实现马赛克显示需要解决两个难点,即如何产生随机的小方块序列和如何将它们显示到相应的位置上。
为解决第一个问题,首先应定义小方块的大小,并以此确定小方块的数量。解决第二个问题的关键是定义一个数组来记录每个小方块的左上角坐标,先是小方块的位置将由该数祖来保存。
这样,只要随机构造记录所有小方块左上角坐标的POINTS结构数祖,便解决了上述的两个难点,使用的伪代码算法描述如下:
只要数祖中还存在点,就进行循坏;
在数祖中随机选取一个点;
先是该店对应的小方块;
将数组中的最后一点拷贝到该点;
删除数组中的最后一个点;
结束循环;
马赛克清除的实现与显示的实现很类似,只要将显示小方块的语句换成画矩形的语句即可。