| dStart command button. This enables the timer, and the sprite will start moving.
The code to move the sprite is in the Timer event of the Timer control:
Private Sub TimerMove_Timer() Static X As Long Static Y As Long
X = X + 1 Y = Y + 1
''''Keep the ball of the edge If X > Me.ScaleWidth Then X = 0 End If
If Y > Me.ScaleHeight Then Y = 0 End If
BitBlt Me.hDC, X, Y, SpriteWidth, SpriteHeight, picMask.hDC, 0, 0, vbSrcAnd BitBlt Me.hDC, X, Y, SpriteWidth, SpriteHeight, picSprite.hDC, 0, 0, vbSrcPaint
End Sub
We have two static variables, X and Y, which will be used as our drawing point on the form. These are increased by 1 each time the event is fired. After incrementing the variables, we check to see if they have gotten past the edge of the form. If they are out of bounds they are reset to 0. Each time this is done, we will draw the sprite using the BlitBlt function.
Try to run the program, it does not look pretty. All you see is a long blue line being drawn on the form. The reason for this behavior is obvious if we think about it. We draw the sprite repeatedly but we do not erase the previous drawn sprite, so it will still be there when the timer event is fired. To deal with this we can insert a Me.Cls call, which will clear the form. Modify the code so it looks like this:
Private Sub TimerMove_Timer() Static X As Long Static Y As Long
X = X + 1 Y = Y + 1
''''Keep the ball of the edge If X > Me.ScaleWidth Then X = 0 End If
If Y > Me.ScaleHeight Then Y = 0 End If
Me.Cls BitBlt Me.hDC, X, Y, SpriteWidth, SpriteHeight, picMask.hDC, 0, 0, vbSrcAnd BitBlt Me.hDC, X, Y, SpriteWidth, SpriteHeight, picSprite.hDC, 0, 0, vbSrcPaint
End Sub
Now the Sprite moves as a single ball over the form. The animation isn''''t too pretty since it flickers and 憌obbles?as it moves along. Depending on the power of your computer, you might also see the black mask ball a few times. Why does it do this? The answer is that we do not synchronize our drawing operation with the redrawing of the form after each Cls operation. So when we draw our sprite we might just be unlucky enough to have drawn it, after the form was finished with redrawing itself. This will result in a form momentarily without our sprite. Since these drawing operations are so fast you will not actually see the sprite missing, but instead just a quick flicker. It''''s as if you had a movie and cut out several frames at random, the action would seem jerky whenever you got to the missing frame.
So what we need is a way to update the form just after we have drawn the sprite, and not during the actual drawing process. This can be achieved with the Refresh method of the form. This method Refreshes (Updates) the form when it is called, which is exactly what we need. But this is not quite enough, since the refresh method will draw the display of the form as it appears in memory. Since we have not stored the sprite in the display memory of the form, it will not be drawn automatically when the Refresh method is called. To store the current display of the form in memory, which would include our sprite, we have to set the Autoredraw property of the form to True. This will store the visual appearance of the form, just the way we want it. The code will then look like this:
Private Sub TimerMove_Timer() Static X As Long Static Y As Long
X = X + 1 Y = Y + 1
''''Keep the ball of the edge If X > Me.ScaleWidth Then X = 0 End If
If Y > Me.ScaleHeight Then Y = 0 End If
Me.Cls BitBlt Me.hDC, X, Y, SpriteWidth, SpriteHeight, picMask.hDC, 0, 0, vbSrcAnd BitBlt Me.hDC, X, Y, SpriteWidth, SpriteHeight, picSprite.hDC, 0, 0, vbSrcPaint Me.Refresh
End Sub
If you try it now, the sprite should move slowly down the form, in a very stately manner.
End of Part I of the three part Drawing and Animation Tutorial by Burt Abreu & S鴕en Skov.
上一页 [1] [2] [3] |