|
|

楼主 |
发表于 2007-2-24 17:06:00
|
显示全部楼层
Re: 动画控制
图片切换和动画时间控制
我们平时做图片,一般都是用图片框使用loadpicture方法做单张的切换。
但这个速度太慢。如果图片比较大的话,肯定影响读取速度。
因为图片框在不停的装载,转换图片。
为此,我们可以使用bitblt函数来做动画图片显示。
在这 ,我们使用封装了许多API函数的FX.DLL来控制动画
代码也放到附件里面 ,有兴趣的朋友请看看.
首先新建一个模块
输入以下代码用于定义引用所要用到的API函数.
Option Explicit
Public Const MERGEPAINT = &HBB0226
Public Const SRCAND = &H8800C6
Public Const SRCCOPY = &HCC0020
Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _
ByVal X As Long, ByVal Y As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, ByVal ySrc As Long, _
ByVal dwRop As Long) As Long
Public Declare Function GetTickCount Lib "kernel32" () As Long
Public Declare Function fxRotate Lib "VB6.DLL" (ByVal DestDC As Long, ByVal CenterX As Long, ByVal CenterY As Long,
ByVal SrcDC As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal SrcWidth As Long, ByVal SrcHeight As Long, ByVal
Angle As Double, ByVal TransparentColor As Long, Optional ByVal Flags As Long = 0) As Long
然后新建一个窗体文件
Option Explicit
Dim ITIMER As Long, JTIMER As Long
Dim X1 As Single, Y1 As Single
Dim P As Long, FPS As Long, BPS As Long
Dim aTIMER As Long, bTIMER As Long
Private Sub Form_Load()
Randomize Timer
Form1.Height = 480 * 15: Form1.Width = 640 * 15
X1 = 200: Y1 = 200 '坐标
BPS = 0: FPS = 120
Me.Show
aTIMER = GetTickCount() '控制动画的总时间
ITIMER = GetTickCount() '控制动画每张的时间
End Sub
Private Sub Timer1_Timer()
bTIMER = GetTickCount()
'1000等于1秒,翻2秒
If bTIMER - aTIMER > 1000 Then FPS = 2401
BitBlt Me.hDC, 0, 0, 640, 480, Picture1.hDC, 0, 0, vbSrcCopy '刷新背景
'////////////////////////////////////////////////////////////////////////
JTIMER = GetTickCount()
'1000等于1秒,现在用的100=1/10秒翻一页
If JTIMER - ITIMER > 20 Then FPS = FPS + 120: BPS = BPS + 120: ITIMER = GetTickCount()
If FPS >= 2400 Then FPS = 1 '8张图
'BitBlt Me.hDC, X1, Y1, 120, 120, PIC.hDC, FPS, 0, vbSrcCopy
fxRotate Me.hDC, X1, Y1, PIC.hDC, FPS, 0, 120, 120, 0, vbWhite
Me.Refresh
End Sub
bitblt 有一个非常大的优势在于 ,它可以截取一副图片的指定区域进入要求的场景中 , 加上FX的强大功能, 可以去除图片的边框背
景色. 只要我们就可以制作出精美无瑕疵的动画来 .
我们可以使用timer 来控制截取图片的区域 . 达到动画切换的目的 .
现在着重解释一下bitblt 这个函数
'BitBlt Me.hDC, X1, Y1, 120, 120, PIC.hDC, FPS, 0, vbSrcCopy
第一个参数 .某控件的句柄(.hdc) ,一般是显示图片的窗体页面对象.
X1,Y1. 指显示图片的左上角(横坐标,和纵座标) .
120,120 是截取图片的高度和宽度.
pic.hdc .规定显示图片的容器为picture .因为image控件,没有.hdc .
FPS,0 ,是指被截取图片的起点的(左上角) 的横座标 ,纵座标. 最后一个vbStrCopy 是个固定的参数.
下面再重点介绍一下动画中的时间控制.
首先 ,我讲一下动画中图片切换的频率控制.
就是指令隔多长的时间就切换一次图片 .
我们可以用now 函数来获取系统当前的时间 ,但是这个函数只能精确到秒 . 于是我们使用API函数 gettickcount 来获取系统当
前的时钟 . gettickcount 其实也是now 函数一样的功能, 不过他将时钟精确到了毫秒.
这样 ,我们就可以通过比较俩次时钟之间的差 . 我们指定一个时间长度() 来达到切换动画. 首先在初始化程序的时候取一次时钟,
然后在timer里面写一个时钟进行比较. timer的interval 可以设置成1. 也就是每毫秒做一次检测.这里需要指出的是使用这种方法
做时钟判断的好处.因为我们将时钟判断分离出来了, 我们不用再去考虑timer的判断周期.还有,如果有俩个频率不相同的检测就必
须使用俩个timer 而使用这种方法,以毫秒为时钟开始检测,就可以执行所有的检测了.
其次,讲一下如何控制动画的播放时间 .原理,和判断时钟频率是一样的.见以下这句
If bTIMER - aTIMER > 1000 Then FPS = 2401
我们通过比较俩个时钟标记.来判断动画执行多长的时间
以上的意思是执行1000毫秒 ,(1秒中) .当时钟超过1秒时 FPS=2401 .
2401是一个虚拟的值 , 在本代码中表示的应该是原图片的横座标 .因为图片的最大宽度是2400, 超过这个, 则自然就播放不出动画
了.
代码也放到附件里面 ,有兴趣的朋友请看看.
|
|