KI Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Cykid

Betreff: KI Problem

BeitragMi, Mai 06, 2015 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Communtiy =)
Ich brauche mal eine Idee... meine Map besteht aus 2 Grafiken, den Boden, und alles was nicht begehbar ist.

Nun möchte ich das meine KI sich zum spieler dreht, wenn die Distanz kleiner als 500 px zwischen KI Objekt und Spieler ist. Das ist auch nicht das Problem, sondern ich möchte ganz gerne das die KI erkennt das eine Wand zwischen Spieler und KI ist...

Aktuell sieht die Logik so aus:

BlitzBasic: [AUSKLAPPEN]
Function KISoldierLogic()
For k.KI = Each KI
If k\IDType = 2 Then

;Abstandsberechnung zum spieler
dif = Sqr((playerX-k\x)^2 +(playerY-k\y)^2)

;Nähert der Spieler sich auf 500 pixel
If dif < 500 Then
k\winkel = ((ATan2((k\y-playerY),(k\x-playerX))+(360-90))Mod 360)
If k\winkel < 0 Then k\winkel = 359
If k\winkel > 359 Then k\winkel = 0
EndIf


;Schuss

For b.bullets = Each bullets

If ImagesCollide(soldierImage(k\winkel),k\x,k\y,0,bImage,b\x,b\y,0) Then


k\live = k\live - rifleDamage
Delete b.bullets
Exit

EndIf

Next

;Tot
If k\live <= 0 Then
Delete k.KI
Exit
EndIf

EndIf
Next
End Function


Vlt. eine unsichtbare Linie oder eine Pixel zu pixel annäherung.. aber das ist unglaublich langsam oder?

Könnt ihr mir mit einer Idee aushelfen?

Viele Grüße, Cykid

Silver_Knee

BeitragMi, Mai 06, 2015 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
bei dif<500 reden wir ja von maxial 500 Pixeln. Wenn dein Level wirklich eine Pixelgenaue Grafik ist, bleibt dir auch nix übrig als die Sicht Pixel für Pixel zu Prüfen. Das ist mit ein Grund, warum so viele Spiele Tiles einsetzen, wenn auch vielleicht nur im Hintergrund.

Mit LockBuffer / UnlockBuffer und ReadPixelFast kannst du sicherlich relativ flott die Farbe checken. Die Koordinaten kannst du wie beim rastern einer Linie abgehen.

Ansonsten kannst du dir überlegen auch ein Tileset zu verwenden. Eventuell auch um Kollisionen zu vereinfachen. Man muss das auch nicht sehen aber im Hintergrund wird z.B. mit einem Dim-Array für jedes Feld eine 1 für blockiertes Feld und eine 0 für freies Feld abgespeichert. Der Sicht-Test bleibt quasi der gleiche, nur sind es weniger Schritte, je größer deine Tiles sind.

Cykid

BeitragMi, Mai 06, 2015 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, man müsste dann nur beim zeichnen mit einem raster arbeiten, und davon wollte ich mich lösen da ich dachte das ich max. 1920 * 1080 anzeigen lassen also ist es von der Geschwindigkeit her zu machen Very Happy

Hm, ich probiere es mal mit einem annäherungsverfahren...

Jetzt muss ich nur noch wissen ob der pixel ein teil der Grafik ist.

SpionAtom

Betreff: Zwei Prüfungen

BeitragMi, Mai 06, 2015 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Um zu prüfen, ob ein Punkt pixelgenau im Bild liegt:
1. Prüfen, ob der Punkt im Rechteck des Bild liegt, falls nicht, kann die Prüfung abgebrochen werden
2. Prüfen, ob der Punkt sich mit einem sichtbaren Pixel des Bildes deckt, indem man
- die relativen Koordinaten des Prüfpunktes zum Bildpunkt ausrechnet
relX = Px - Bildx
relY = Py - Bildy
- mit readpixelfast(relX, relY, imagebuffer(...)) den Pixel ausliest und auswertet


Readpixelfast

Ich weiß nicht genau, ob ImagesCollide dasgleiche macht, denn dann könnte man das eine Bild einfach durch ein Ein-Pixel-Bild ersetzen. Die Benutzung dieses Befehls wird nicht empfohlen...
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

DAK

BeitragDo, Mai 07, 2015 10:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz wichtig bei sowas: Damit die Sichtlinie gut funktioniert sollte man hier den Bresenham-Algo zur Linienberechnung verwenden. Der ist ziemlich einfach.
Gewinner der 6. und der 68. BlitzCodeCompo

Cykid

BeitragDo, Mai 07, 2015 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh nicht ganz wie das "pixel im rechteck des Bildes" gemeint ist.

Die Grafik hat ja keine wirkliche "Collide" Box.

user posted image

Die Wände sind komplett eine Grafik.. oder habe ich dich falsch verstanden?

Viele Grüße

SpionAtom

BeitragDo, Mai 07, 2015 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit "Rechteck des Bildes" ist die Position des Bildes gemeint, und das Rechteck, das sich aus Höhe und Breite ergibt.
Tatsächlich könnte man auf so eine Vorprüfung auch verzichten, aber das drückt verdammt auf die Performance.

Statt "Rechteck des Bildes" kann man auch eine andere Vorauswahl treffen. Zum Beispiel, ob der Punkt in einem gewissen Radius ist.

Das ist aber alles egal bei dir, weil du einfach ein Riesenbild hast und der Punkt daher immer innerhalb dieses Rechtecks liegt. Außerdem sind bei dir die relativen Koordinaten auch egal, wenn sich dein Wändebild nie bewegt und immer an der Position 0|0 liegt.

Für dich sollte reichen:
Code: [AUSKLAPPEN]

Für alle Punkte auf der Linie von A nach B
   Lies den Pixel mit: readpixelfast(PunktX, PunktY, imagebuffer(Wändebild))
   Prüfe, ob die ausgelesene Farbe Wand ist, falls ja, gibt es eine Kollision und die Schleife kann abgebrochen werden

Wir schreiben uns dann wieder, wenn die ersten Performanceprobleme kommen Wink
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Cykid

BeitragDo, Mai 07, 2015 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach, ich habs jetzt geschnallt Very Happy

Ich schau mal wie "smooth" sich das umsetzen lässt, ich werde eh nie viele KI "feindliche" KI'S Haben... denk ich^^


Ich bedanke mich vielmals für eure schnelle Hilfe =)

Cykid

BeitragDo, Mai 07, 2015 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Edit:

Sieht zwar richtig aus, aber playerX und playerY werden niemals SX und SY... warum ist das der Fall?

BlitzBasic: [AUSKLAPPEN]
sx = k\x
sy = k\y
winkel = ((ATan2((k\y-playerY),(k\x-playerX))+(360-90))Mod 360)
If winkel < 0 Then k\winkel = 359
If winkel > 359 Then k\winkel = 0


While(Not sx = playerX And sy = playerY)
ReadPixelFast(PunktX, PunktY, ImageBuffer(walls))

sx = sx + (Sin(winkel)*2)
sy = sy - (Cos(winkel)*2)

Color 0,0,0
Cls
Color 255,0,0
Rect sx,sy,200,200
Text 200,200,winkel
Flip

Wend

Silver_Knee

BeitragDo, Mai 07, 2015 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
sind sx und sy floats? ansonsten kann es sein, dass du ewig abrundest und nicht zn nächsten Pixel kommst. Kannst auch mal Stop vor die Schleife schreiben und im Debug-Modus dir in der Schleife die Variablen anschauen.

SpionAtom

Betreff: Floats sind wichtig

BeitragDo, Mai 07, 2015 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Jep, Floats sollten es sein, wenn man mit Sinus und Cosinus arbeitet

Code: [AUSKLAPPEN]
Graphics 640, 480, 0, 2
SetBuffer BackBuffer()

   Local sx# = 50, sy# = 50, tx# = GraphicsWidth() - 50, ty# = GraphicsHeight() - 50, steps#
   reset

   Repeat
   If MouseHit(1) Then tx = MouseX(): ty = MouseY(): reset
               
               Win = Winkel(sx, sy, tx, ty)
               steps = 10
               d = Distanz(sx, sy, tx, ty)
               If d < steps Then steps = d ;vorletzten Schritt so groß machen, dass man genau auf dem Punkt landet
               If d < 1 Then steps = 0: reachedEnd(tx, ty) ;ist der Abstand < 1, ist man fertig
               sx = sx - (Sin(Win) * steps)
               sy = sy - (Cos(Win) * steps)
               
               Color 100, 200, 100
               Oval tx - 5, ty - 5, 10, 10, 0
                  Color Rand(31, 255), 0, 0
                  Plot sx, sy
               AppTitle(sx + ", " + sy)

               Flip
   Until KeyDown(1)
   End

Function reachedEnd(tx, ty)
   Color 255, 255, 255
   Text tx, ty - 16, "Ziel erreicht"
End Function

Function reset()
   Cls
   Color 255, 255, 255
   Text 0, 0, "Linksklick für neues Ziel"
End Function

;Berechnet den Winkel zwischen der X-Achse und einer Geraden durch zwei Punkte
Function Winkel#(x1#,y1#,x2#,y2#)
   Return (360+ATan2(x1#-x2#,y1#-y2#)) Mod 360
End Function

;Berechnet den Abstand zwischen zwei Punkten
Function Distanz#(x1#, y1#, x2#, y2#)
   Return Sqr((x1-x2)^2 + (y1-y2)^2)
End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group