08-31-2006, 02:55 AM
I made a ball physics demo... hope it helps.
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