Mausverfolgender Bot + Anhänger
Verfasst: 30.12.2007 04:15
Verschoben von NicTheQuick: Thread stammt von "Automatische Bewegung von 2D Spielfiguren (Vorgängerpost)" aus Allgemein
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
@Forum-Team: vllt sollte man das Thema ab meinem Beitrag teilen und ins Forum für Code, Tipps und Tricks schieben
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