visual basic动画编程技术
在visual basic中利用image和timer控件能很方便地实现动画。本文将介绍visual basic动画编程的基本原理和实现三种不同类型动画的编程技术。
一、 基本原理
动画是一种运动的模拟,其实现方法是在屏幕上快速地显示一组相关的图象。因此实现动画的基础是图象的显示和使图象快速、定时地移动或变化。在visual basic中,用loadpicture函数将bmp、ico和wmf格式的图象文件装入内存,并将函数返回值赋予image对象的picture属性,便能在image对象中显示图象。使图象移动或变化的基本方法有三种,即:
1. 用image对象的move方法移动图象,其left和top属性指示了image对象的当前左上角位置;
2. 调用loadpicture函数装载不同的图象,并赋给image对象的picture属性,将在对象中显示不同的图象,即实现图象变化;
3. 修改image对象的width和/或height属性可以缩放图象。使用timer控件可以实现定时控制。timer对象的interval属性设置了定时间
隔,即调用timer事件过程的时间间隔。在timer事件过程中处理控制image对象的移动或变化,便能实现动画。timer对象的interval值决定了动画的变化或移动速度,其单位是毫秒(1/1000秒)。timer对象的enabled属性决定了timer事件是否有效。设置enabled属性为true将启动timer事件(如启动动画);为false则将使timer事件无效(如停止动画)。
二、 无位移动画
无位移动画是指动画对象不移动,但图象不断变化,其典型例子是翻书。实现无位移动画的方法是,设置好image对象和timer对象后,在timer事件过程中调用调用loadpicture函数装载不同的图象,并赋予image对象的picture属性,使对象中显示不同的图象,即实现图象变化。
下面是翻书动画的例子。程序启动时,在窗体中显示一本翻开的书,用鼠标左键点击书,则将开始翻书;再用鼠标左键点击书,则书将停止翻动。位图文件book1.bmp~ book4.bmp分别表现了翻书时,正在翻的书页的不同位置,它们存放在当前工程所在的目录中。在需显示动画的窗体(form1)中设置image对象image1和timer对象timer1,并按下表设置它们的属性,未列出的属性使用缺省值。
对象
属性
设置值
image1
picture
...(工程文件所处路径)book1.bmp
timer1
enabled
false
interval
150
程序代码如下:
option explicit ‘变量必须先定义,才能使用
dim imageno% ‘当前的位图编号
dim isplaying as boolean ‘动画是否启动
private sub form_load()
isplaying = false ‘开始时,动画未启动
image1.tooltiptext = "开始" ‘鼠标移到书上时,将出现“开始”提示
imageno% = 1 ‘动画从book1.bmp开始
end sub
private sub image1_click() ‘用鼠标左键点击了书
if isplaying then ‘动画已启动,则停止
isplaying = false
timer1.enabled = isplaying
image1.tooltiptext = "开始"
else ‘动画未启动,则启动
isplaying = true
timer1.enabled = isplaying
image1.tooltiptext = "停止"‘鼠标移到书上时,将出现“停止”提示
end if
end sub
private sub timer1_timer() ‘timer事件
imageno% = imageno% + 1 ‘动画下一帧
if imageno% > 4 then ‘如果动画已到最后一帧,则
imageno% = 1 ‘再从第一帧开始
end if
`在image对象中显示动画的当前帧
image1.picture = loadpicture(app.path & "ook" & imageno% & ".bmp")
end sub
代码中app.path指定了当前应用程序所在的路径。
三、 单帧位移动画
单帧位移动画,是指同一幅图象的位置不断变化而形成的动画,其典型实例时云彩被风吹动。编制单帧位移动画的方法是在timer事件过程中调用image对象的move方法来移动图象。下面是云彩移动的例子。程序启动时,在窗体中显示一朵云,用鼠标左键点击云,则云彩将开始飘动,如碰到窗体的边界,云彩将改变移动方向;再用鼠标左键点击云,则云将停止移动。位图文件cloud.bmp存放在当前工程所在的目录中。
在需显示动画的窗体(form1)中设置image对象image1和timer对象timer1,并按下表设置它们的属性,未列出的属性使用缺省值。
对象
属性
设置值
image1
picture
...(工程文件所处路径)cloud.bmp
timer1
enabled
false
interval
150
程序代码如下:
option explicit ‘变量必须先定义,才能使用
dim isplaying as boolean ‘动画是否启动
dim detax%, detay% ‘沿x、y轴的移动位置增量
private sub form_load()
isplaying = false ‘开始时,动画未启动
image1.tooltiptext = "开始" ‘鼠标移到书上时,将出现“开始”提示
detax% = 100 ‘沿x轴的移动位置增量为100单位
detay% = 100 ‘沿y轴的移动位置增量为100单位
end sub
private sub image1_click() ‘用鼠标左键点击了书
if isplaying then ‘动画已启动,则停止
isplaying = false
timer1.enabled = isplaying
image1.tooltiptext = "开始"
else ‘动画未启动,则启动
isplaying = true
timer1.enabled = isplaying
image1.tooltiptext = "停止"
end if
end sub
private sub timer1_timer() ‘timer事件
‘移动image对象
image1.move image1.left + detax%, image1.top + detay%
‘碰到边界,则校正位置,并反向
if image1.left + image1.width >= form1.width then ‘碰到右边界
image1.move form1.width - image1.width, image1.top
detax% = -detax%
elseif image1.top + image1.height >= form1.height then‘碰到上边界
image1.move image1.left, form1.height - image1.height
detay% = -detay%
elseif image1.left <= 0 then ‘碰到左边界
image1.move 0, image1.top
detax% = -detax%
elseif image1.top <= 0 then ‘碰到下边界
image1.move image1.left, 0
detay% = -detay%
end if
end sub
注意,云彩碰到边界而反向移动,是通过改变detax%、 detay%的符号来实现的。
四、 多帧位移动画
多帧位移动画是最复杂的动画,综合了无位移动画和单帧位移动画的特点。自然界的运动大多数都具有多帧位移的特点,如小鸟的飞翔,在小鸟位置的移动的同时,其翅膀也在扇动。实现多帧位移动画需要在timer事件过程中同时处理image对象的图象更替和位置移动。
下面是小鸟飞翔的例子。程序启动时,在窗体中显示一只小鸟,用鼠标左键点击它,则小鸟将开始扇翅飞翔,如碰到窗体的边界,小鸟将改变飞翔方向;再用鼠标左键点击小鸟,则小鸟将停止飞翔。位图文件bird1.bmp~ bird4.bmp分别表现了小鸟飞翔时,其翅膀的不同位置,它们存放在当前工程所在的目录中。在需显示动画的窗体(form1)中设置image对象image1和timer对象timer1,并按下表设置它们的属性,未列出的属性使用缺省值。
对象
属性
设置值
image1
picture
...(工程文件所处路径)bird1.bmp
timer1
enabled
false
interval
150
程序代码如下:
option explicit ‘变量必须先定义,才能使用
dim imageno% ‘当前的位图编号
dim isplaying as boolean ‘动画是否启动
dim detax%, detay% ‘沿x、y轴的移动位置增量
private sub form_load()
isplaying = false
image1.tooltiptext = "开始"
imageno% = 1
detax% = 100
detay% = 100
end sub
private sub image1_click()
if isplaying then
isplaying = false
timer1.enabled = isplaying
image1.tooltiptext = "开始"
else
isplaying = true
timer1.enabled = isplaying
image1.tooltiptext = "停止"
end if
end sub
private sub timer1_timer() ‘timer事件
imageno% = imageno% + 1 ‘动画下一帧
if imageno% > 4 then ‘如果动画已到最后一帧,则
imageno% = 1 ‘再从第一帧开始
end if
`在image对象中显示动画的当前帧