Mausverfolgender Bot + Anhänger

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Mausverfolgender Bot + Anhänger

Beitrag 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
Zuletzt geändert von STARGÅTE am 25.04.2010 13:44, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

Hahaha STARGÅTE! :allright:

Wie immer eine Inspiration :)

Nochmals Gratulation zu PB4 !

Thalius
"...smoking hash-tables until until you run out of memory." :P
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag von lassma-asma »

@ STARGATE :

AMOK ! MANN , DAS IS ECHT SAU GUT !!!! RESPEKT ! :allright: :shock: :shock: :shock: :allright:
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Pandorra
Beiträge: 124
Registriert: 10.02.2007 12:15

Beitrag 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)
Benutze PB v 4.40 Beta 3
Antworten