Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PONG - The RPG
#8
I made a ball physics demo... hope it helps. Wink


Code:
#Include Once "FBGFX.BI"
'Option Explicit
'Option Explicit is obsolete, as of fbc v.017b
Screenres 640, 480, 8, 2, 1
Screenset 0, 1

Type Vector2D
    X As Single
    Y As Single
End Type

Declare Function Vec_2D_Normal(a As Vector2D, b As Vector2D ) As Vector2D
Declare Function ClosestPointOnLine(Va As Vector2D, Vb As Vector2D,vPoint As Vector2D) As Vector2D
Declare Sub Vec_2D_Normalize(Byref v As Vector2D)
Declare Function Vec_2D_Len(V As Vector2D) As Single
Declare Function Vec_2D_Dot(a As Vector2D, b As Vector2D) As Single
Declare Function Vec_2D_Dist(vA As Vector2D, vB As Vector2D) As Single

Dim As Vector2D Pl=>(320,240), Pld=>(0,0), ipoint, normal
Dim As Single   Radius = 10, Dist
Dim As Integer  i, iAnd1, Num_Verts


Read Num_Verts
Dim Lines(Num_Verts) As Vector2D
For i = 0 To Ubound(Lines)
    Read Lines(i).X, Lines(i).Y
Next


Do
    Cls
    
    If Multikey(Sc_Left)  Then PlD.X -=.15
    If Multikey(Sc_Right) Then PlD.X +=.15
    If Multikey(Sc_Up)    Then PlD.Y -=.15
    If Multikey(Sc_Down)  Then PlD.Y +=.15    
    
    PlD.X*=.95
    PlD.Y*=.95
    
    Pl.X+=PlD.X
    Pl.Y+=PlD.Y
    
    For i=0 To Ubound(Lines)-1 Step 2
        iAnd1 = i+1
        normal = Vec_2D_Normal( Lines(i), Lines(iAnd1) )
        ipoint  = ClosestPointOnLine( Lines(i), Lines(iAnd1), PL )
        Dist = Vec_2D_Dist( Pl, ipoint )
        
        If Dist<Radius Then
            Pl.X+=( normal.X *(Radius-Dist) )
            Pl.Y+=( normal.Y *(Radius-Dist) )
        End If
        
        Line(Lines(i).X, Lines(i).Y)-(Lines(iAnd1).X, Lines(iAnd1).Y),14
        Line(ipoint.X, ipoint.Y)-(ipoint.X + (normal.X*Radius), ipoint.Y + (normal.Y*Radius)),7
    Next
    
    Circle (Pl.X, Pl.Y),Radius, 1
    Pset (Pl.X, Pl.Y), 4
    
    Wait &H3da, 8
    Flip
Loop Until Multikey(Sc_Escape)

End



Function ClosestPointOnLine( Va As Vector2D, Vb As Vector2D, vPoint As Vector2D ) As Vector2D
    Dim  As Vector2D tVector1, tVector2, vReturn
    Dim As Single d, t
    
    tVector1.X = VPoint.X - va.X
    tVector1.Y = VPoint.Y - va.Y
    tVector2.X = vb.X - va.X
    tVector2.Y = vb.Y - va.Y    
    Vec_2D_Normalize tVector2    
    d = Vec_2D_Dist( va, vb)
    t = Vec_2D_Dot( tVector2, tVector1 )
    
    If t<=0 Then Return va
    If t>=d Then Return vb
    vReturn.X = va.X + ( tVector2.X * t )
    vReturn.Y = va.Y + ( tVector2.Y * t )
    Return vReturn
End Function

Function Vec_2D_Dist( va As Vector2D, vb As Vector2D ) As Single
    Dim As Vector2D d
    Dim As Single tLen
    
    d.x = va.x - vb.x
    d.y = va.y - vb.y
    tLen = Vec_2D_Len( d )
    
    Function = tLen
End Function

Sub Vec_2D_Normalize( Byref v As Vector2D )
    Dim VecLen As Single
    
    VecLen = Vec_2D_Len ( V )
    v.x = v.x / VecLen
    v.y = v.y / VecLen
End Sub

Function Vec_2D_Len( v As Vector2D ) As Single
    Dim tLen As Single
    
    tLen = Sqr( v.x^2 + v.y^2 )
    
    If tLen = 0 Then tLen = 1
    Function = tLen
End Function

Function Vec_2D_Dot( a As Vector2D, b As Vector2D ) As Single
    Function = a.x*b.x + a.y*b.y
End Function

Function Vec_2D_Normal( a As Vector2D, b As Vector2D ) As Vector2D
    Dim VecLen As Single
    Dim As Vector2D d, n
    
    d.x = b.x - a.x
    d.y = b.y - a.y
    VecLen = Vec_2D_Len( d )
    n.x = (  d.y ) / VecLen
    n.y = ( -d.x ) / VecLen
    
    Return N
End Function



Data 21

Data 0,0
Data 0,240

Data 0,240
Data 100,340

Data 100,340
Data 125,400

Data 125,400
Data 300,450

Data 300,450
Data 450,470

Data 450,470
Data 600,370

Data 600,370
Data 550,300

Data 550,300
Data 625,250

Data 625,250
Data 500,0

Data 500,0
Data 320,50

Data 320,50
Data 0,0
Reply


Messages In This Thread
PONG - The RPG - by RADIUM-V Interactive - 08-25-2006, 06:15 AM
PONG - The RPG - by Dio - 08-25-2006, 10:21 AM
PONG - The RPG - by RADIUM-V Interactive - 08-25-2006, 07:50 PM
PONG - The RPG - by Dr_Davenstein - 08-26-2006, 01:36 AM
PONG - The RPG - by TheDarkJay - 08-26-2006, 05:24 PM
PONG - The RPG - by Dr_Davenstein - 08-27-2006, 02:41 AM
PONG - The RPG - by RADIUM-V Interactive - 08-30-2006, 09:53 PM
PONG - The RPG - by Dr_Davenstein - 08-31-2006, 02:55 AM
PONG - The RPG - by RADIUM-V Interactive - 09-01-2006, 12:30 AM

Forum Jump:


Users browsing this thread: 1 Guest(s)