Fand das interessant und habe daher mal nen Code gemacht. Funktioniert zwar nich besonders, ist dafür aber 3D
Code: Alles auswählen
Structure Point3D
X.f
Y.f
Z.f
EndStructure
Structure Vector3D
Len.f ; Länge
AngleZ.f ; Winkel um die Z-Achse
AngleY.f ; Winkel um die Y-Achse
EndStructure
Global Ship.Point3D ; Schiffskoordinaten
Global Speed.Vector3D ; Schiffsbeschleunigung
Global Goal.Point3D ; Zielpunkt
Global NewList Spur.Point3D() ; Ein hübscher Kondensstreifen
Procedure ReDraw()
Protected A.f
StartDrawing(ImageOutput(0))
Box(0,0,400,400, $000000)
Circle(Goal\X, Goal\Z, 5, $FFFF00) ; Ziel anzeigen
LineXY(Ship\X + Sin(Speed\AngleY)*4, Ship\Z - Cos(Speed\AngleY)*4, Ship\X - Sin(Speed\AngleY)*4, Ship\Z + Cos(Speed\AngleY)*4, $00FFFF)
LineXY(Ship\X + Sin(Speed\AngleY)*4, Ship\Z - Cos(Speed\AngleY)*4, Ship\X + Cos(Speed\AngleY)*11, Ship\Z + Sin(Speed\AngleY)*11, $00FFFF)
LineXY(Ship\X - Sin(Speed\AngleY)*4, Ship\Z + Cos(Speed\AngleY)*4, Ship\X + Cos(Speed\AngleY)*11, Ship\Z + Sin(Speed\AngleY)*11, $00FFFF)
StopDrawing()
StartDrawing(ImageOutput(1))
Box(0,0,400,400, $000000)
Circle(Goal\X, Goal\Y, 5, $FFFF00) ; Ziel anzeigen
LineXY(Ship\X + Sin(Speed\AngleZ)*4, Ship\Y - Cos(Speed\AngleZ)*4, Ship\X - Sin(Speed\AngleZ)*4, Ship\Y + Cos(Speed\AngleZ)*4, $00FFFF)
LineXY(Ship\X + Sin(Speed\AngleZ)*4, Ship\Y - Cos(Speed\AngleZ)*4, Ship\X + Cos(Speed\AngleZ)*11, Ship\Y + Sin(Speed\AngleZ)*11, $00FFFF)
LineXY(Ship\X - Sin(Speed\AngleZ)*4, Ship\Y + Cos(Speed\AngleZ)*4, Ship\X + Cos(Speed\AngleZ)*11, Ship\Y + Sin(Speed\AngleZ)*11, $00FFFF)
StopDrawing()
SetGadgetState(0, ImageID(0))
SetGadgetState(1, ImageID(1))
EndProcedure
Procedure SetGoal(X, Y, Z)
If X <> #PB_Ignore
Goal\X = X
EndIf
If Y <> #PB_Ignore
Goal\Y = Y
EndIf
If Z <> #PB_Ignore
Goal\Z = Z
EndIf
ReDraw()
EndProcedure
Macro VekLen(AY, AZ)
(AY*AY + AZ*AZ)
EndMacro
#DAngle = 0.01
Procedure FlyToGoal()
Protected T.f, GoalAngleY.f, GoalAngleZ.f
T = VekLen(Cos(Speed\AngleY), Cos(Speed\AngleZ))
Ship\X + (Cos(Speed\AngleY) + Cos(Speed\AngleZ))* Speed\Len / T
Ship\Y + Sin(Speed\AngleZ) * Speed\Len
Ship\Z + Sin(Speed\AngleY) * Speed\Len
If Abs(Goal\X - Ship\X) < Speed\Len And Abs(Goal\Y - Ship\Y) < Speed\Len
Speed\Len = 0
EndIf
If (Goal\X - Ship\X) > 0 ; Mach ich so seltsam, da es floats sind!
GoalAngleY = ATan( (Goal\Z - Ship\Z) / (Goal\X - Ship\X) ) ; Winkel zum Ziel
GoalAngleZ = ATan( (Goal\Y - Ship\Y) / (Goal\X - Ship\X) ) ; Winkel zum Ziel
ElseIf (Goal\X - Ship\X) < 0 ; Mach ich so seltsam, da es floats sind!
GoalAngleY = ATan( (Goal\Z - Ship\Z) / (Goal\X - Ship\X) ) + #PI ; Winkel zum Ziel
GoalAngleZ = ATan( (Goal\Y - Ship\Y) / (Goal\X - Ship\X) ) + #PI ; Winkel zum Ziel
Else
GoalAngleY = #PI/2
GoalAngleZ = #PI/2
EndIf
If (Speed\AngleY - GoalAngleY) > #DAngle ; Wenn der Winkel zu groß ist
Speed\AngleY - #DAngle ; Winkel verringern
ElseIf (Speed\AngleY - GoalAngleY) < -#DAngle ; Wenn der Winkel zu klein ist
Speed\AngleY + #DAngle ; Winkel erhöhen
Else ; Wenn der Winkel (fast) passt
Speed\AngleY = GoalAngleY ; Näher kommt man eh nicht dran -> muss reichen
EndIf
If (Speed\AngleZ - GoalAngleZ) > #DAngle ; Wenn der Winkel zu groß ist
Speed\AngleZ - #DAngle ; Winkel verringern
ElseIf (Speed\AngleZ - GoalAngleZ) < -#DAngle ; Wenn der Winkel zu klein ist
Speed\AngleZ + #DAngle ; Winkel erhöhen
Else ; Wenn der Winkel (fast) passt
Speed\AngleZ = GoalAngleZ ; Näher kommt man eh nicht dran -> muss reichen
EndIf
ReDraw() ; Neu anzeigen
EndProcedure
CreateImage(0, 400,400) ; Aufsicht: x * z
CreateImage(1, 400,400) ; Seitenansicht: x * y
OpenWindow (0, 0, 0, 805, 430, "Flugbahn", #PB_Window_MinimizeGadget)
ImageGadget (0, 0, 0, 1,1, ImageID(0))
ImageGadget (1, 405, 0, 1,1, ImageID(1))
ButtonGadget(2, 300, 405, 210, 20, "Flieg an den angegebenen Punkt")
SpinGadget (3, 5, 405, 50, 20, 0, 5000, #PB_Spin_Numeric)
SetGadgetState(3, 100)
Ship\X = 200 ; Mitte
Ship\Y = 200
Ship\Z = 200
Speed\Len = 0 ; Noch nicht fliegen
Speed\AngleZ = 0 ; Standardrichtung
Speed\AngleY = 0
ReDraw()
Repeat
WEvent = WaitWindowEvent(10)
If WEvent = #PB_Event_Gadget
Select EventGadget()
Case 0 : SetGoal(WindowMouseX(0), #PB_Ignore, WindowMouseY(0))
Case 1 : SetGoal(WindowMouseX(0)-405, WindowMouseY(0), #PB_Ignore )
Case 2 : If Speed\Len > 0
Speed\Len = 0 ; Speed aus
SetGadgetText(2, "Flieg an den angegebenen Punkt")
Else
Speed\Len = GetGadgetState(3) / 1000 ; Speed ermitteln und losfliegen
SetGadgetText(2, "Flug stoppen")
EndIf
EndSelect
EndIf
If Speed\Len > 0
FlyToGoal()
EndIf
Until WEvent = #PB_Event_CloseWindow