Can someone tell me why, when you uncomment the Rotation function, my collection of points does not rotate around the objects origin (point 4) as it moves left and right across the screen? It looks as though its offset from itself somehow. I don't fully understand the rotation function I'm using, which doesn't help, I guess.
Been trying for ages to get this to work properly. Any help?
Code follows...
Const KEY_F = 33
Global GFX_X = 1024
Global GFX_Y = 768
Type Vector2D
Field X#
Field Y#
Field PosX#
Field PosY#
End Type
Type VectorFrame
Field X#
Field Y#
Field Angle#
Field Width#
Field Height#
Field VectorList.Vector2D[9]
End Type
Global FPS#
Global FFPS# = MilliSecs()
Global Counter% = 0
Global bToggle% = True
Dim SinTable#(359)
Dim CosTable#(359)
Global tMyFrame.VectorFrame
Global Offset# = -2
Graphics GFX_X, GFX_Y, 16, 0
SetBuffer BackBuffer()
SeedRnd MilliSecs()
Gosub PrecalculateSine
Gosub PrecalculateCos
tMyFrame = CreateFrame(GFX_X / 2, GFX_Y / 2, 200, 200)
TranslateFrame(tMyFrame, GFX_X / 2, GFX_Y / 2, True)
While Not KeyDown(1)
Cls
If KeyHit(KEY_F) Then
bToggle% = Not bToggle%
End If
If ((tMyFrame\X# + tMyFrame\Width# / 2) >= GFX_X Or (tMyFrame\X# - tMyFrame\Width# / 2) <= 0) Then
Offset# = -Offset#
End If
TranslateFrame(tMyFrame, Offset#, 0, False)
;RotateFrame(tCharFrame, -1)
DrawFrame(tMyFrame)
Gosub CalculateFPS
Gosub PrintDetails
Flip bToggle%
Wend
End
Function CreateFrame.VectorFrame(X#, Y#, Width#, Height#)
Local tFrame.VectorFrame = New VectorFrame
tFrame\X# = X#
tFrame\Y# = Y#
tFrame\Width# = Width#
tFrame\Height# = Height#
tFrame\Angle# = 0.0
tFrame\VectorList[0] = New Vector2D
tFrame\VectorList[0]\X# = (tFrame\X# - (tFrame\Width# / 2)) - tFrame\X#
tFrame\VectorList[0]\Y# = (tFrame\Y# - (tFrame\Height# / 2)) - tFrame\Y#
tFrame\VectorList[1] = New Vector2D
tFrame\VectorList[1]\X# = (tFrame\X#) - tFrame\X#
tFrame\VectorList[1]\Y# = (tFrame\Y# - (tFrame\Height# / 2)) - tFrame\Y#
tFrame\VectorList[2] = New Vector2D
tFrame\VectorList[2]\X# = (tFrame\X# + (tFrame\Width# / 2)) - tFrame\X#
tFrame\VectorList[2]\Y# = (tFrame\Y# - (tFrame\Height# / 2)) - tFrame\Y#
tFrame\VectorList[3] = New Vector2D
tFrame\VectorList[3]\X# = (tFrame\X# - (tFrame\Width# / 2)) - tFrame\X#
tFrame\VectorList[3]\Y# = (tFrame\Y#) - tFrame\Y#
tFrame\VectorList[4] = New Vector2D
tFrame\VectorList[4]\X# = (tFrame\X#) - tFrame\X#
tFrame\VectorList[4]\Y# = (tFrame\Y#) - tFrame\Y#
tFrame\VectorList[5] = New Vector2D
tFrame\VectorList[5]\X# = (tFrame\X# + (tFrame\Width# / 2)) - tFrame\X#
tFrame\VectorList[5]\Y# = (tFrame\Y#) - tFrame\Y#
tFrame\VectorList[6] = New Vector2D
tFrame\VectorList[6]\X# = (tFrame\X# - (tFrame\Width# / 2)) - tFrame\X#
tFrame\VectorList[6]\Y# = (tFrame\Y# + (tFrame\Height# / 2)) - tFrame\Y#
tFrame\VectorList[7] = New Vector2D
tFrame\VectorList[7]\X# = (tFrame\X#) - tFrame\X#
tFrame\VectorList[7]\Y# = (tFrame\Y# + (tFrame\Height# / 2)) - tFrame\Y#
tFrame\VectorList[8] = New Vector2D
tFrame\VectorList[8]\X# = (tFrame\X# + (tFrame\Width# / 2)) - tFrame\X#
tFrame\VectorList[8]\Y# = (tFrame\Y# + (tFrame\Height# / 2)) - tFrame\Y#
Return tFrame
End Function
Function TranslateFrame(tFrame.VectorFrame, X#, Y#, bAbsolute%)
If (bAbsolute%) Then
tFrame\X# = X#
tFrame\Y# = Y#
Else
tFrame\X# = tFrame\X# + X#
tFrame\Y# = tFrame\Y# + Y#
End If
tFrame\VectorList[0]\X# = (tFrame\X# - (tFrame\Width# / 2))
tFrame\VectorList[0]\Y# = (tFrame\Y# - (tFrame\Height# / 2))
tFrame\VectorList[0]\PosX# = tFrame\VectorList[0]\X#
tFrame\VectorList[0]\PosY# = tFrame\VectorList[0]\Y#
tFrame\VectorList[1]\X# = (tFrame\X#)
tFrame\VectorList[1]\Y# = (tFrame\Y# - (tFrame\Height# / 2))
tFrame\VectorList[1]\PosX# = tFrame\VectorList[1]\X#
tFrame\VectorList[1]\PosY# = tFrame\VectorList[1]\Y#
tFrame\VectorList[2]\X# = (tFrame\X# + (tFrame\Width# / 2))
tFrame\VectorList[2]\Y# = (tFrame\Y# - (tFrame\Height# / 2))
tFrame\VectorList[2]\PosX# = tFrame\VectorList[2]\X#
tFrame\VectorList[2]\PosY# = tFrame\VectorList[2]\Y#
tFrame\VectorList[3]\X# = (tFrame\X# - (tFrame\Width# / 2))
tFrame\VectorList[3]\Y# = (tFrame\Y#)
tFrame\VectorList[3]\PosX# = tFrame\VectorList[3]\X#
tFrame\VectorList[3]\PosY# = tFrame\VectorList[3]\Y#
tFrame\VectorList[4]\X# = (tFrame\X#)
tFrame\VectorList[4]\Y# = (tFrame\Y#)
tFrame\VectorList[4]\PosX# = tFrame\VectorList[4]\X#
tFrame\VectorList[4]\PosY# = tFrame\VectorList[4]\Y#
tFrame\VectorList[5]\X# = (tFrame\X# + (tFrame\Width# / 2))
tFrame\VectorList[5]\Y# = (tFrame\Y#)
tFrame\VectorList[5]\PosX# = tFrame\VectorList[5]\X#
tFrame\VectorList[5]\PosY# = tFrame\VectorList[5]\Y#
tFrame\VectorList[6]\X# = (tFrame\X# - (tFrame\Width# / 2))
tFrame\VectorList[6]\Y# = (tFrame\Y# + (tFrame\Height# / 2))
tFrame\VectorList[6]\PosX# = tFrame\VectorList[6]\X#
tFrame\VectorList[6]\PosY# = tFrame\VectorList[6]\Y#
tFrame\VectorList[7]\X# = (tFrame\X#)
tFrame\VectorList[7]\Y# = (tFrame\Y# + (tFrame\Height# / 2))
tFrame\VectorList[7]\PosX# = tFrame\VectorList[7]\X#
tFrame\VectorList[7]\PosY# = tFrame\VectorList[7]\Y#
tFrame\VectorList[8]\X# = (tFrame\X# + (tFrame\Width# / 2))
tFrame\VectorList[8]\Y# = (tFrame\Y# + (tFrame\Height# / 2))
tFrame\VectorList[8]\PosX# = tFrame\VectorList[8]\X#
tFrame\VectorList[8]\PosY# = tFrame\VectorList[8]\Y#
End Function
Function RotateFrame(tFrame.VectorFrame, AngInc#)
tFrame\Angle# = (tFrame\Angle# + AngInc#) Mod 360
If (tFrame\Angle# < 0) Then tFrame\Angle# = tFrame\Angle# + 360
For i = 0 To 8
tFrame\VectorList[i]\PosX# = (tFrame\VectorList[i]\X# * SinTable#(Int(tFrame\Angle#)) - tFrame\VectorList[i]\Y# * CosTable#(Int(tFrame\Angle#))) + tFrame\X#
tFrame\VectorList[i]\PosY# = (tFrame\VectorList[i]\X# * CosTable#(Int(tFrame\Angle#)) + tFrame\VectorList[i]\Y# * SinTable#(Int(tFrame\Angle#))) + tFrame\Y#
Next
End Function
Function DrawFrame(tFrame.VectorFrame)
Color 255, 255, 255
For i = 0 To 8
Text tFrame\VectorList[i]\PosX#, tFrame\VectorList[i]\PosY#, i
Rect tFrame\VectorList[i]\PosX# - 10, tFrame\VectorList[i]\PosY# - 10, 10, 10
Next
End Function
.CalculateFPS
Counter% = Counter% + 1
If MilliSecs() >= (FFPS# + 1000) Then
FFPS# = MilliSecs()
FPS# = Counter%
Counter% = 0
End If
Return
.PrecalculateSine
For i = 0 To 359
SinTable#(i) = Sin(i)
Next
Return
.PrecalculateCos
For i = 0 To 359
CosTable#(i) = Cos(i)
Next
Return
Function ReturnSwitch$(bVal%)
If (bVal%) Then
Return "ON"
Else
Return "OFF"
End If
End Function
.PrintDetails
Color 100,100,100
Text 10, 10, "Program Performance (fps): " + FPS#
Text 10, 22, "Frame Angle : " + tMyFrame\Angle#
Text 10, 33, "Frame X : " + tMyFrame\X#
Text 10, 44, "Frame Y : " + tMyFrame\Y#
Text 10, GFX_Y - 20, "Press F to toggle monitor vertical sync framerate clamp. It is now: " + ReturnSwitch$(bToggle%)
Return
Rage_Matrix
|