Da ich ja nun auch 4.x Benutzer bin hier mal die neuste 4er Version, mit n paar änderungen und erklärungen:
Außerdem habe ich (weil so lustig aussieht ^^) noch EXTRA mit eingebaut, und ein paar angehängte Wagen ...
... Ich wette einer von euch baut daraus eine Snake-Variation ^^
Verbesserter Bot + (unbegrenzte) Anhänger
Code: Alles auswählen
InitSprite()
InitKeyboard()
InitMouse()
xP = 800
yP = 600
; Berichtigt den unechten Winkel zu einem echten (0°-360°) Winkel
Procedure.f Winkelkorrektur(Winkel.f)
If Winkel < 0
ProcedureReturn (Winkel/360-Int(Winkel/360)+1)*360
Else
ProcedureReturn (Winkel/360-Int(Winkel/360))*360
EndIf
EndProcedure
; Berechnet den Winkel
Procedure.f Winkel(x.f,y.f)
Winkel.f
If x = 0
If y < 0 : Winkel = -90 : EndIf
If y >= 0 : Winkel = 90 : EndIf
Else
Winkel = ATan(y/x)/#PI*180
If x < 0 : Winkel + 180 : EndIf
EndIf
ProcedureReturn Winkel
EndProcedure
; Berechnet die Diagonale
Procedure.f Diagonale(x.f,y.f)
r.f = Sqr(x*x+y*y)
ProcedureReturn r
EndProcedure
#b = #PI/180
OpenWindow(0, 0, 0, xP, yP, "Bot der der Maus folgt", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, xP, yP, 0, 0, 0)
SetFrameRate(70)
Bot_x.f = xP/2 ; xPosition
Bot_y.f = yP/2 ; yPosition
Bot_v.f = 0 ; Geschwindigkeit
Bot_a.f = 0 ; Beschleunigung
Bot_w.f = 0 ; Winkel (Laufrichtung)
Bot_dw.f = 0 ; Winkelgeschwindigkeit
a.f = 0.05 ; Beschleunigungsfaktor
max_v.f = 5 ; maximale Geschwindigkeit
max_dw.f = 2 ; maximale Winkelgeschwindigkeit
ZielAbweichung.f = 3 ; Korrekturwert für die Entfernung zum Ziel
; (durch diesen Wert wird verhindert, dass
; der Bot über das Ziel hinausschießt)
; Anhängervariante:
Anhaenger = 6
Laenge = 30
Structure Anh
x.f
y.f
w.f
EndStructure
NewList Anh.Anh()
For n = 1 To Anhaenger
AddElement(Anh())
Anh()\x = xP/2-Laenge*n*2
Anh()\y = yP/2
Anh()\w = 0
Next n
Repeat
ExamineMouse()
MouseX = MouseX()
MouseY = MouseY()
WindowEvent()
ClearScreen(0)
StartDrawing(ScreenOutput())
DrawingMode(1)
; Bewegungen
; Bot
Bot_x + Cos(Bot_w*#b) * Bot_v
Bot_y + Sin(Bot_w*#b) * Bot_v
Bot_v + Bot_a
If Bot_v < 0 : Bot_v = 0
ElseIf Bot_v > max_v : Bot_v = max_v : EndIf
Bot_w + Bot_dw
Bot_w = Winkelkorrektur(Bot_w)
deX.f = MouseX-Bot_x
deY.f = MouseY-Bot_y
Zielrichtung.f = Winkel(deX, deY)
Unterschied.f = Zielrichtung-Bot_w
If Unterschied > 180 : Unterschied = Unterschied - 360 : EndIf
If Unterschied < -180 : Unterschied = Unterschied + 360 : EndIf
If Unterschied >= -180 And Unterschied <= 180 : Bot_dw = Unterschied/10 : EndIf
If Bot_dw > max_dw
Bot_dw = max_dw
ElseIf Bot_dw < -max_dw
Bot_dw = -max_dw
EndIf
AbstandZumZiel.f = Diagonale(deX,deY)-ZielAbweichung
If Bot_v*(1+a) > Sqr(AbstandZumZiel*2*a)-Abs(Unterschied)/10
Bot_a = -a ; Abbremsen
ElseIf Bot_v*(1+a) < Sqr(AbstandZumZiel*2*a)-Abs(Unterschied)/10
Bot_a = a ; Gasgeben
EndIf
; Anhänger
xAnh.f = Bot_x-Cos(Bot_w*#b)*Laenge
yAnh.f = Bot_y-Sin(Bot_w*#b)*Laenge
ResetList(Anh())
While NextElement(Anh())
d.f = Diagonale(xAnh-Anh()\x,yAnh-Anh()\y)
Anh()\w = Winkel(xAnh-Anh()\x, yAnh-Anh()\y)
xAnh = Anh()\x-Cos(Anh()\w*#b)*Laenge
yAnh = Anh()\y-Sin(Anh()\w*#b)*Laenge
If Abs(d-Laenge) > 1 :
Anh()\x = Anh()\x + Cos(Anh()\w*#b)*(d-Laenge)
Anh()\y = Anh()\y + Sin(Anh()\w*#b)*(d-Laenge)
EndIf
Wend
; Anzeige
; Bot
Circle(Bot_x, Bot_y, 10, RGB(255,255,255))
Circle(Bot_x+Cos(Bot_w*#b)*Laenge/2, Bot_y+Sin(Bot_w*#b)*Laenge/2, 5, RGB(255,255,255))
LineXY(Bot_x, Bot_y, Bot_x+Cos(Bot_w*#b)*Laenge, Bot_y+Sin(Bot_w*#b)*Laenge, RGB(255,255,255))
LineXY(Bot_x, Bot_y, Bot_x-Cos(Bot_w*#b)*Laenge, Bot_y-Sin(Bot_w*#b)*Laenge, RGB(255,255,255))
; Anhänger
ResetList(Anh())
While NextElement(Anh())
Circle(Anh()\x, Anh()\y, 10, RGB(0,255,255))
LineXY(Anh()\x, Anh()\y, Anh()\x+Cos(Anh()\w*#b)*Laenge, Anh()\y+Sin(Anh()\w*#b)*Laenge, RGB(0,255,255))
LineXY(Anh()\x, Anh()\y, Anh()\x-Cos(Anh()\w*#b)*Laenge, Anh()\y-Sin(Anh()\w*#b)*Laenge, RGB(0,255,255))
Circle(Anh()\x+Cos(Anh()\w*#b)*Laenge, Anh()\y+Sin(Anh()\w*#b)*Laenge, 5, RGB(0,255,0))
Wend
; Maus
Circle(MouseX, MouseY, 5, RGB(128,128,128))
StopDrawing()
FlipBuffers()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Escape) : End : EndIf
ForEver