Seite 1 von 1

Mausverfolgender Bot + Anhänger

Verfasst: 30.12.2007 04:15
von STARGÅTE
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

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
@Forum-Team: vllt sollte man das Thema ab meinem Beitrag teilen und ins Forum für Code, Tipps und Tricks schieben

Verfasst: 30.12.2007 05:35
von Thalius
Hahaha STARGÅTE! :allright:

Wie immer eine Inspiration :)

Nochmals Gratulation zu PB4 !

Thalius

Verfasst: 30.12.2007 08:42
von lassma-asma
@ STARGATE :

AMOK ! MANN , DAS IS ECHT SAU GUT !!!! RESPEKT ! :allright: :shock: :shock: :shock: :allright:

Verfasst: 10.01.2008 22:31
von Pandorra
Wirklich gut. Woa, das ist ja mal geil...
Was man daraus alles machen könnte? (unteranderem hilft mir das bei der Bot Programmierung in meinem Spiel weiter)