分享
 
 
 

Visual Basic动画编程技术

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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对象中显示动画的当前帧

Image1.Picture = LoadPicture(App.Path & "ird" & ImageNo% & ".bmp")

‘移动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

五、 缩放动画

气球的膨胀或缩小是缩放动画的典型例子。在Timer事件过程中修改Image对象的Width和/或Height属性,便可实现缩放动画。但如果要表现物体的同心缩放,则还应同时还需移动Image对象。下面是模拟气球在空中缩放(同心)的例子。程序启动时,在窗体中显示一只气球,用鼠标左键点击它,则气球将开始膨胀,如碰到窗体的边界,气球将缩小,缩小到原来大小时,又将膨胀;再用鼠标左键点击气球,则气球将停止缩

放。位图文件Balloon.bmp存放在当前工程所在的目录中。在需显示动画的窗体(Form1)中设置Image对象Image1和Timer对象Timer1,并按下表设置它们的属性,未列出的属性使用缺省值。

对象

属性

设置值

Image1

Picture

...(工程文件所处路径)Balloon.bmp

Stretch

True

Timer1

Enabled

False

Interval

150

程序代码如下:

Option Explicit `变量必须先定义,才能使用

Dim IsPlaying As Boolean `动画是否启动

Dim Width0%, Height0% `气球原大小

Dim DetaX%, DetaY% `沿X、Y轴的缩放增量

Private Sub Form_Load()

IsPlaying = False

Image1.ToolTipText = "开始"

Width0% = Image1.Width ‘保存气球的初始大小

Height0% = Image1.Height

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事件

`移动Image对象,保持同心缩放

Image1.Move Image1.Left - DetaX% / 2, Image1.Top - DetaY% / 2

‘按增量缩放

Image1.Width = Image1.Width + DetaX%

Image1.Height = Image1.Height + DetaY%

`碰到边界,则缩小

If Image1.Left + Image1.Width >= Form1.Width Or _

Image1.Top + Image1.Height >= Form1.Height Or _

Image1.Left <= 0 Or Image1.Top <= 0 Then

DetaX% = -DetaX%

DetaY% = -DetaY%

End If

`缩到原大,则膨胀

If Image1.Width <= Width0% Or Image1.Height <= Height0% Then

DetaX% = -DetaX%

DetaY% = -DetaY%

End If

End Sub

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有