大家好,
使用此代码可以使鼠标尾巴使用某些图像。
您需要添加图像控件和计时器控件以形成表单。
加载一些图像到图像控件。
图片名称:ImgBall
索引:0(重要)
在timercontrol下使用此代码
Private Sub Timer1_Timer()
Animate
End Sub
在表单加载事件下添加此代码::::
Private Sub Form_Load()
Call MUSICSND
Dim I As Integer
For I = ImgBall.UBound + 1 To 7
Load ImgBall(I)
ImgBall(I).Visible = True
ImgBall(I).Top = ImgBall(I - 1).Top + 11
Next I
ImgBall(0).Visible = False
Call InitVal
Call InitBall
Timer1.Interval = 20
Timer1.Enabled = True
End Sub
在窗体mousemove事件下添加此代码
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
MoveHandler CLng(X), CLng(Y)
Animate
End Sub
现在添加一个模块,并将此代码写入模块:::::
Option Explicit
Public Type Vec2D
X As Long
Y As Long
End Type
Public Type AnimBall
Vec As Vec2D
dx As Double
dy As Double
Img As Image
End Type
Dim nBalls As Integer
Dim Xpos, Ypos
Dim DeltaT As Double
Dim SegLen
Dim SpringK
Dim Mass
Dim Gravity
Dim Resistance
Dim StopVel As Double
Dim StopAcc As Double
Dim DotSize As Long
Dim Bounce As Double
Dim bFollowM As Boolean
Dim balls() As AnimBall
Function InitVal()
' Some of the variables are still unknown to me
nBalls = 7 ' numbers of ball
Xpos = Ypos = 0 ' evaluate position
DeltaT = 0.01 '
SegLen = 10# ' it seem like the distance between the
' mouse pointer and the ball
' it's quite intersting to change the value
' and see the effect
SpringK = 11 ' spring constant,
' if large, the longer and higher the tail
' will swing
Mass = 1 'mass of the ball
Gravity = 40 ' gravity coeff,
' if large, the balls are more difficult
' to move upward
Resistance = 9 ' resistivity of the ball to move itself
' from a location, the larger the more difficult to
' move
StopVel = 0.1
StopAcc = 0.1
DotSize = 11 ' the size of the ball in pixel
Bounce = 0.95 ' bouncing coeff,
bFollowM = True ' animation flag
End Function
' must only be called after load all imgBall
Function InitBall()
Dim I As Integer
ReDim balls(nBalls)
For I = 0 To nBalls
balls(I) = BallSet(MAINPAGE.ImgBall(I))
Next I
For I = 0 To nBalls
balls(I).Img.Left = balls(I).Vec.X
balls(I).Img.Top = balls(1).Vec.Y
Next I
End Function
' initialize a ball
Function BallSet(Img As Image) As AnimBall
BallSet.Vec.X = Xpos
BallSet.Vec.Y = Ypos
BallSet.dx = BallSet.dy = 0
Set BallSet.Img = Img
End Function
' initialize a vector variable
Function VecSet(X As Long, Y As Long) As Vec2D
VecSet.X = X
VecSet.Y = Y
End Function
' update position when mouse move
Function MoveHandler(X As Long, Y As Long)
Xpos = X
Ypos = Y
End Function
' calculate the spring force of the balls chain
Function SpringForce(I As Integer, J As Integer, ByRef spring As Vec2D)
Dim tempdx, tempdy, tempLen, springF
tempdx = balls(I).Vec.X - balls(J).Vec.X
tempdy = balls(I).Vec.Y - balls(J).Vec.Y
tempLen = Sqr(tempdx * tempdx + tempdy * tempdy)
If (tempLen > SegLen) Then
springF = SpringK * (tempLen - SegLen)
spring.X = spring.X + (tempdx / tempLen) * springF
spring.Y = spring.Y + (tempdy / tempLen) * springF
End If
End Function
' main routine of this animated balls
' call on mouse move or every 20ms
Function Animate()
Dim iH, iW
Dim start As Integer
Dim I As Integer
Dim spring As Vec2D
Dim resist As Vec2D
Dim accel As Vec2D
' enable the animation
If (bFollowM) Then
balls(0).Vec.X = Xpos
balls(0).Vec.Y = Ypos
start = 1
End If
For I = start To nBalls
spring = VecSet(0, 0)
If (I > 0) Then
Call SpringForce(I - 1, I, spring)
End If
If (I < (nBalls - 1)) Then
Call SpringForce(I + 1, I, spring)
End If
resist = VecSet(-balls(I).dx * Resistance, -balls(I).dy * Resistance)
accel = VecSet((spring.X + resist.X) / Mass, _
(spring.Y + resist.Y) / Mass + Gravity)
balls(I).dx = balls(I).dx + DeltaT * accel.X
balls(I).dy = balls(I).dy + DeltaT * accel.Y
If (Abs(balls(I).dx) < StopVel And _
Abs(balls(I).dy) < StopVel And _
Abs(accel.X) < StopAcc And _
Abs(accel.Y) < StopAcc) Then
balls(I).dx = 0
balls(I).dy = 0
End If
balls(I).Vec.X = balls(I).Vec.X + balls(I).dx
balls(I).Vec.Y = balls(I).Vec.Y + balls(I).dy
' checking for boundary conditions
iW = MAINPAGE.ScaleWidth
iH = MAINPAGE.ScaleHeight
' check bottom
If (balls(I).Vec.Y >= iH - DotSize - 1) Then
If (balls(I).dy > 0) Then
balls(I).dy = Bounce * (-balls(I).dy)
End If
balls(I).Vec.Y = iH - DotSize - 1
End If
' check right
If (balls(I).Vec.X >= iW - DotSize) Then
If (balls(I).dx > 0) Then
balls(I).dx = Bounce * (-balls(I).dx)
End If
balls(I).Vec.X = iW - DotSize - 1
End If
' check left
If (balls(I).Vec.X < 0) Then
If (balls(I).dx < 0) Then
balls(I).dx = Bounce * (-balls(I).dx)
End If
balls(I).Vec.X = 0
End If
' check top
If (balls(I).Vec.Y < 0) Then
If (balls(I).dy < 0) Then
balls(I).dy = Bounce * (-balls(I).dy)
End If
balls(I).Vec.Y = 0
End If
balls(I).Img.Left = balls(I).Vec.X
balls(I).Img.Top = balls(I).Vec.Y
Next I
End Function
问候
>> ALI <<
From: https://bytes.com/topic/visual-basic/insights/779483-mouse-tail