鼠标尾巴...

本文介绍了一种使用Visual Basic实现鼠标轨迹动画的方法。通过加载多个图像并应用物理模型,如弹簧力、重力和阻力,创建跟随鼠标移动的动态球链效果。文章详细描述了代码结构和关键函数,包括初始化参数、更新位置、计算力和动画更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,

使用此代码可以使鼠标尾巴使用某些图像。

您需要添加图像控件和计时器控件以形成表单。

加载一些图像到图像控件。

图片名称: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值