Pathfinding Problem

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Firstdeathmaker

Betreff: Pathfinding Problem

BeitragDo, Dez 02, 2004 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich brauche für die KI in meinen Weltraumshooter eine Art pathfinding System, das dafür sorgt dass die Computergesteuerten Raumschiffe nicht sinnlos rumfliegen sondern z.B. spezielle Routen abfliegen oder den Spieler verfolgen e.t.c.

Um das Problem zu lösen hab ich das erstmal in einem kleinen Testprogramm versucht, aber leider funktioniert nicht alles so wie ich das will. Wenn man das Schiff auf "auto_route=2" stellt, es also hinter dem Mauszeiger gerjagen lassen möchte, und man dann nach ganz oben an den Bildschirmrand geht und bevor es einen erwischt runter zieht, fängt es an Halbkreise zu ziehen und nach oben zu verschwinden.

Hier der Code:

Code: [AUSKLAPPEN]
SCREEN_X=800
SCREEN_Y=600

Graphics SCREEN_X,SCREEN_Y,16,2
SetBuffer BackBuffer()



Type nav_point
Field x
Field y
Field action;0=ende, 1= next point
End Type



Type ship
Field x#
Field y#
Field winkel#
Field max_turn#
Field speed#
Field nav_point.nav_point
Field auto_route
End Type




ship.ship=New ship
ship\x=SCREEN_X/2
ship\y=SCREEN_Y/2
ship\max_turn=1
ship\speed=1.1
ship\auto_route=2; 1= Pathfinding per Navigationspunkte, 2=Mausjagd

ship\nav_point.nav_point=New nav_point
ship\nav_point\x=100
ship\nav_point\y=100
ship\nav_point\action=1

ship\nav_point.nav_point=New nav_point
ship\nav_point\x=200
ship\nav_point\y=500
ship\nav_point\action=1

ship\nav_point.nav_point=New nav_point
ship\nav_point\x=500
ship\nav_point\y=400
ship\nav_point\action=0


ship\nav_point.nav_point=First nav_point




Repeat

If ship\auto_route=1

   x#=ship\nav_point\x-ship\x
   y#=ship\nav_point\y-ship\y
   

   winkel#=((ATan2(x,y)) Mod 360)



   If winkel>ship\max_turn+ship\winkel
      ship\winkel=ship\max_turn+ship\winkel
   ElseIf winkel<-ship\max_turn+ship\winkel
      ship\winkel=-ship\max_turn+ship\winkel
   Else
      ship\winkel=winkel
   EndIf

      ship\x=ship\x+(ship\speed*Sin(ship\winkel))
      ship\y=ship\y+(ship\speed*Cos(ship\winkel))

   If ship\x<ship\nav_point\x+1 And ship\x>ship\nav_point\x-1 And ship\y<ship\nav_point\y+1 And ship\y>ship\nav_point\y-1
      Stop
      Select ship\nav_point\action
         Case 1
            ship\nav_point=After ship\nav_point
         Case 0
            ship\auto_route=0
      End Select
   EndIf
   
ElseIf ship\auto_route=2

   x#=MouseX()-ship\x
   y#=MouseY()-ship\y


   winkel#=((ATan2(x,y)+360) Mod 360)



   If winkel>ship\max_turn+ship\winkel
      ship\winkel=ship\max_turn+ship\winkel
   ElseIf winkel<-ship\max_turn+ship\winkel
      ship\winkel=-ship\max_turn+ship\winkel
   Else
      ship\winkel=winkel
   EndIf

      ship\x=ship\x+(ship\speed*Sin(ship\winkel))
      ship\y=ship\y+(ship\speed*Cos(ship\winkel))

EndIf


Cls
For a.nav_point=Each nav_point
   Rect a\x-5,a\y-5,10,10,0
Next

Rect ship\x,ship\y,2,2
Text 10,10,ship\x+"/"+ship\y
Text 10,20,winkel
Flip
Until KeyHit(1)
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group