现在的位置: 首页 > 综合 > 正文

物理模拟小球运动

2013年01月08日 ⁄ 综合 ⁄ 共 4302字 ⁄ 字号 评论关闭

本来是给兄弟做课程设计用的 可以用鼠标控制小球, 模拟重力阻力, 障碍反弹.  代码简单

源码下载地址: http://download.csdn.net/source/490690

'********************模块中**************************

Type TypePoint    '向量类型
    X As Long
    Y As Long
End Type

Type TypeBall      '小球的类型
    Pos As TypePoint   '位置
    Speed As TypePoint  '速度
    R As Long    '半径
    Color As Long   '颜色
    Box As PictureBox   
    G As Long               '重力
    Resi As Long            '阻力
    Ela As Long             '弹性
End Type

Global Ball As TypeBall

Global DownDeltaPos As TypePoint

Global OldPos As TypePoint
Global NewPos As TypePoint

Global BallDown As Boolean

'********************窗体中**************************

Private Sub cmdEla_Click()
    If Not LookUp(txtEla.Text) Then Exit Sub
    
    Ball.Ela = Int(txtEla.Text)
End Sub

Private Sub cmdG_Click()
    If Not LookUp(txtG.Text) Then Exit Sub
    
    Ball.G = Int(txtG.Text)
End Sub

Private Sub cmdResi_Click()
    If Not LookUp(txtResi.Text) Then Exit Sub
    
    Ball.Resi = Int(txtResi.Text)
End Sub

Private Sub Form_Load()
    InitBall
    Timer1.Enabled = True
    Timer2.Enabled = True
End Sub

Private Sub InitBall()   '初始化小球
    Randomize
    With Ball
        
        .R = 500
        .Color = vbGreen
        
        .Pos.X = 550
        .Pos.Y = 550
        
        .Speed.X = Int(Rnd * 150) - 75
        .Speed.Y = Int(Rnd * 150) - 75
        
        .G = 0
        .Resi = 0
        .Ela = 0
        
        Set .Box = Me.Picbox
        .Box.FillColor = .Color
        .Box.FillStyle = 0
    End With
End Sub

Private Sub Picbox_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button <> vbLeftButton Then Exit Sub
    
    Dim DeltaX&, DeltaY&
    
    DeltaX = Abs(Ball.Pos.X - X)
    DeltaY = Abs(Ball.Pos.Y - Y)
    
    If Sqr(DeltaX ^ 2 + DeltaY ^ 2) >= Ball.R Then Exit Sub
    
    BallDown = True
    
    Timer1.Enabled = False
    Timer3.Enabled = True
    
    Ball.Speed.X = 0
    Ball.Speed.Y = 0
    
    DownDeltaPos.X = Ball.Pos.X - X
    DownDeltaPos.Y = Ball.Pos.Y - Y
    
    OldPos = Ball.Pos
    
    PaintBall
End Sub

Private Sub Picbox_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Timer1.Enabled Then Exit Sub
    
    Timer2.Enabled = False
    
    Ball.Pos.X = X + DownDeltaPos.X
    Ball.Pos.Y = Y + DownDeltaPos.Y
    
    If X + DownDeltaPos.X - Ball.R < 0 Then
        Ball.Pos.X = Ball.R
    End If
    
    If X + DownDeltaPos.X + Ball.R > Ball.Box.Width Then
        Ball.Pos.X = Ball.Box.Width - Ball.R
    End If
    
    If Y + DownDeltaPos.Y - Ball.R < 0 Then
        Ball.Pos.Y = Ball.R
    End If
    
    If Y + DownDeltaPos.Y + Ball.R > Ball.Box.Height Then
        Ball.Pos.Y = Ball.Box.Height - Ball.R
    End If
    
    NewPos = Ball.Pos
    
    PaintBall
    Timer2.Enabled = True
End Sub

Private Sub Picbox_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button <> vbLeftButton Then Exit Sub
    
    If Not BallDown Then Exit Sub
    
    BallDown = False
    
    Ball.Speed.X = (Ball.Pos.X - OldPos.X) / 10
    Ball.Speed.Y = (Ball.Pos.Y - OldPos.Y) / 10
    
    Timer3.Enabled = False
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    TestG
    
    TestResi
    
    MoveBall
    
    TestBall
    
    PaintBall
End Sub

Private Sub MoveBall()
    If Ball.Pos.X - Ball.R + Ball.Speed.X <= 0 Then
        Ball.Pos.X = Ball.R
    Else
        Ball.Pos.X = Ball.Pos.X + Ball.Speed.X
    End If
    
    If Ball.Pos.X + Ball.R + Ball.Speed.X >= Ball.Box.Width Then
        Ball.Pos.X = Ball.Box.Width - Ball.R
    Else
        Ball.Pos.X = Ball.Pos.X + Ball.Speed.X
    End If
    
    If Ball.Pos.Y - Ball.R + Ball.Speed.Y <= 0 Then
        Ball.Pos.Y = Ball.R
    Else
        Ball.Pos.Y = Ball.Pos.Y + Ball.Speed.Y
    End If
    
    If Ball.Pos.Y + Ball.R + Ball.Speed.Y >= Ball.Box.Height Then
        Ball.Pos.Y = Ball.Box.Height - Ball.R
    Else
        Ball.Pos.Y = Ball.Pos.Y + Ball.Speed.Y
    End If
End Sub

Private Sub TestBall()

    If Ball.Pos.X - Ball.R <= 0 Then
        If Ball.Speed.X < 0 Then
            If Ball.Resi = 0 Then
                Ball.Speed.X = -Ball.Speed.X
            Else
                Ball.Speed.X = -Ball.Speed.X - Ball.Ela * 10
            End If
        End If
    End If
    
    If Ball.Pos.X + Ball.R >= Ball.Box.Width Then
        If Ball.Speed.X > 0 Then
            If Ball.Resi = 0 Then
                Ball.Speed.X = -Ball.Speed.X
            Else
                Ball.Speed.X = -Ball.Speed.X + Ball.Ela * 10
            End If
        End If
    End If
    
    If Ball.Pos.Y - Ball.R <= 0 Then
        If Ball.Speed.Y < 0 Then
            If Ball.G = 0 Then
                Ball.Speed.Y = -Ball.Speed.Y
            Else
                Ball.Speed.Y = -Ball.Speed.Y - Ball.Ela * 10
            End If
        End If
    End If
    
    If Ball.Pos.Y + Ball.R >= Ball.Box.Height Then
        If Ball.Speed.Y > 0 Then
            If Ball.G = 0 Then
                Ball.Speed.Y = -Ball.Speed.Y
            Else
                Ball.Speed.Y = -Ball.Speed.Y + Ball.Ela * 10
            End If
        End If
    End If
    
End Sub

Private Sub PaintBall()
    Picbox.Cls
    Picbox.Circle (Ball.Pos.X, Ball.Pos.Y), Ball.R
End Sub

Private Sub TestG()
    Ball.Speed.Y = Ball.Speed.Y + Ball.G * 10
End Sub

Private Sub TestResi()

    If Ball.Speed.X < 0 Then
        If Ball.Speed.X + Ball.Resi > 0 Then
            Ball.Speed.X = 0
        Else
            Ball.Speed.X = Ball.Speed.X + Ball.Resi
        End If
    ElseIf Ball.Speed.X > 0 Then
        If Ball.Speed.X - Ball.Resi < 0 Then
            Ball.Speed.X = 0
        Else
            Ball.Speed.X = Ball.Speed.X - Ball.Resi
        End If
    End If
End Sub

Private Function IsNumber(Text As String) As Boolean
    Dim i&, Str1$
    
    For i = 1 To Len(Text)
        Str1 = Mid$(Text, 1, 1)
        If Asc(Str1) < Asc("0") Or Asc(Str1) > Asc("9") Then
            IsNumber = False
            Exit Function
        End If
    Next
    IsNumber = True
End Function

Private Sub Timer2_Timer()
    PaintBall
End Sub

Private Function LookUp(Text As String) As Boolean
    
    LookUp = False
    
    If Not IsNumber(Text) Then
        MsgBox "只能输入数字!"
        Exit Function
    End If
    
    If Int(Text) > 10 Or Int(Text) < 0 Then
        MsgBox "只能输入0~10之间的整数!"
        Exit Function
    End If
    
    LookUp = True
End Function

Private Sub Timer3_Timer()

    Ball.Speed.X = (NewPos.X - OldPos.X) / 10
    Ball.Speed.Y = (NewPos.Y - OldPos.Y) / 10
    
    OldPos = NewPos
End Sub

抱歉!评论已关闭.