hinter wand in deckung gehen [3d]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mas93

Betreff: hinter wand in deckung gehen [3d]

BeitragFr, Okt 12, 2007 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute,
Ich habe nun das Grundgerüst meines Spiels fertig und möchte nun einen Gegner einbauen, der
mich angreift und aber auch in deckung gehen kann.

Das 2. ist im moment mein Problem.

Ich habe folgende Situation:
user posted image

die rote Linie ist der gegner, und der blaue punkt ist sein ziel.
Wie mache ich nun am besten, dass der gegner zu dem Punkt läuft und um die Wand herumläuft?

Welche befehle benutze ich am besten?
Da es das erste mal ist, dass ich einen KI in 3d progge, kenne ich einige Befehle noch nicht.

Dashier war mein Ansatz:
Code: [AUSKLAPPEN]
Function updategegner()
   For g.gegner=Each gegner
      If g\status=1 Then ;Wenn gegner im angriffs modus ist
         For c.cpoint=Each cpoint
            If c\nummer=g\point Then
               li=LinePick(EntityX(g\entity),EntityY(g\entity),EntityZ(g\entity),c\x,c\y,c\z)
               If li=0 Then
                  AlignToVector g\entity,c\x,c\y,c\z,x
                  MoveEntity g\entity,0,0,1
                  If Int(EntityX(g\entity))=c\x Then g\status=2
                  If Int(EntityZ(g\entity))=c\z Then g\status=2
                  
                  Else g\status=2
               EndIf
            EndIf
         Next
      EndIf
      
      If g\status=2 Then ;wenn gedrerht wird
         For c.cpoint=Each cpoint
            turn=1
            li=LinePick(EntityX(g\entity),EntityY(g\entity),EntityZ(g\entity),c\x,c\y,c\z)
            If li=0 Then g\status=1
            
            If turn=1 Then
               TurnEntity g\entity,0,-0.5,0
            EndIf
            If turn=2 Then
               TurnEntity g\entity,0,1,0
            EndIf
            
                          MoveEntity g\entity,0,0,1 :w=0
         Next
      EndIf
   Next
End Function


Ich habe den Befehl linepick gefunden, aber ich habe auch relativ schnell bemerkt, dass er mir nicht sehr viel hilft, da ich eher überprüfen sollte, ob sich in der aktuellen Drehrichtung des gegners eine Wand befindet, und nicht ob sich in der Luftlinie(gegner,Ziel) eine Wand befindet.

Könnt ihr mir hier ein paar Tipps geben?
Wäre nett, wenn ihr mir da helfen könntet.

mfg
mas93

P.S.: Ich weiss, dass der code noch nicht soviel bringt, den ich gepostet habe.
Er soll lediglich zeigen, das ich schon etwas versucht habe und nicht einfach so frage...
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

The_Nici

BeitragFr, Okt 12, 2007 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir Pathfinding an. Solltest per SuFu vieles finden.

Willi die Rübe

BeitragFr, Okt 12, 2007 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstelle eine Linie zwischen dem Ziel und dem Gegner, die du dann aber um einen dritten Punkt erweiterst(also ein Dreieck). Diesen Punkt bewegst du dann im rechten Winkel solange von der Hypothenuse weg, bis die zwei Kathetenlinien das Hindernis nicht mehr durchkreuzen. Dann erstellst du an diesem Punkt einen Pivot und lässt den Gegner dorthin laufen. Wenn er angekommen ist, dürfte er dich dann im Blickwinkel haben Very Happy

Edit: Allerdings funktioniert das auch nur wenn sich nur ein Hindernis im Weg befindet, bei mehreren Hindernissen ist Pathfinding besser, aber auch komplizierter.
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

mas93

BeitragFr, Okt 12, 2007 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, ich werde mir pathfinding mal anschaun. Stimmt, das war der Begriff über den ich dauernd rätsle^^

@Willi die Rübe: Ich weiss nur in etwa, wie du das jetzt meinst.
Wäre nett wenn du das nochmal erklären könntest.

Ich habe nämlich Probleme mit den Begriffen Hypothenuse.
Ich weiss zwar, was das c.a ist aber mehr auch nicht^^

Wäre nett wenn du das nochmal für mich erklären könntest.


mfg
mas93
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Willi die Rübe

BeitragFr, Okt 12, 2007 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Merk dir einfach, dass die Hypothenuse die Basis, also die längste Seite im Dreieck ist. Die Katheten die 2 Anderen. Ich hab dir mal ein Beispiel in 2D gecodet, dass das Prinzip verdeutlicht. Allerdings Achtung, versuche nicht diesen Code in 3D umzusetzten oder in 2D damit rumzuspielen, da er eben nur den Zweck hat dir das Prinzip zu verdeutlichen, da der Code nicht wirklich nach den Grundsätzen die ich oben genannt habe, geht(hatte keine Lust die ganzen Berechnungen durchzuwurschdeln, sollte aber in 3D einfacher sein). Laughing


Code: [AUSKLAPPEN]
Graphics 800, 600, 16, 2

SetBuffer BackBuffer()


HidePointer()

Repeat
   Cls
   

   Color 255,255,255
   Line 320,295,480,295
   

   linienkreuzensich=Linescross(MouseX(),MouseY(),400,400, 320,295,480,295,0)
   
   If linienkreuzensich Then
         ax=Linescross(MouseX(),MouseY(),400,400, 320,295,480,295,1)
         ay=Linescross(MouseX(),MouseY(),400,400, 320,295,480,295,2)
         bx=ax

      While a=0
         ax=ax+20
         bx=bx-20

         l1=Linescross(MouseX(),MouseY(),ax,ay,320,295,480,296,0)
         l2=Linescross(ax,ay, 390,390, 320,295,480,296,0)
         
         l3=Linescross(MouseX(),MouseY(),bx,ay,320,295,480,296,0)
         l4=Linescross(bx,ay, 390,390, 320,295,480,296,0)
         
         If l1=0 And l2=0 And (l3=1 Or l4=1) Then a=1
         If l3=0 And l4=0 And (l2=1 Or l1=1) Then a=2 : ax=bx
         
      Wend
      
         Oval ax,ay,5,5
      
         Color 150,150,150
         Line MouseX(),MouseY(),ax,ay
         Line ax,ay, 400,400

         Color 255,0,0
         a=0
   Else
      Color 255,255,255
   EndIf
   
   Line MouseX(),MouseY(),400,400
   
   Color 0,0,255
   Oval 390,390,20,20,1

   Color 255,0,0
   Oval MouseX()-5,MouseY()-5,10,10   
   
   Flip
Until KeyHit(1)
End



Function LinesCross#(x0#,y0#, x1#,y1#, x2#,y2#, x3#,y3# ,typ )   
   n# = (y0#-y2#)*(x3#-x2#) - (x0#-x2#)*(y3#-y2#)
   d# = (x1#-x0#)*(y3#-y2#) - (y1#-y0#)*(x3#-x2#)
   
   If Abs(d#) < 0.0001

      Return False
   Else

      Sn# = (y0#-y2#)*(x1#-x0#) - (x0#-x2#)*(y1#-y0#)

      AB# = n# / d#
      If AB#>0.0 And AB#<1.0
         CD# = Sn# / d#
         If CD#>0.0 And CD#<1.0
                  int_X# = x0# + AB#*(x1#-x0#)
                  int_Y# = y0# + AB#*(y1#-y0#)
            If typ=1 Then Return int_X#
            If typ=2 Then Return int_Y#
            If typ=0 Then Return True
         End If
      End If
   

   EndIf


   Return False

End Function

Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

FireballFlame

BeitragSa, Okt 13, 2007 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
(Hypotenuse heißt es nur im rechtwinkligen Dreieck) Wink
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group