KI Problem
Übersicht BlitzBasic Beginners-Corner
CykidBetreff: KI Problem |
Mi, Mai 06, 2015 22:09 Antworten mit Zitat |
|
---|---|---|
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() 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 |
Mi, Mai 06, 2015 22:45 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Mai 06, 2015 22:52 Antworten mit Zitat |
|
---|---|---|
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
Hm, ich probiere es mal mit einem annäherungsverfahren... Jetzt muss ich nur noch wissen ob der pixel ein teil der Grafik ist. |
||
SpionAtomBetreff: Zwei Prüfungen |
Mi, Mai 06, 2015 23:28 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Mai 07, 2015 10:20 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Mai 07, 2015 13:35 Antworten mit Zitat |
|
---|---|---|
Ich versteh nicht ganz wie das "pixel im rechteck des Bildes" gemeint ist.
Die Grafik hat ja keine wirkliche "Collide" Box. Die Wände sind komplett eine Grafik.. oder habe ich dich falsch verstanden? Viele Grüße |
||
SpionAtom |
Do, Mai 07, 2015 14:57 Antworten mit Zitat |
|
---|---|---|
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 |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
Cykid |
Do, Mai 07, 2015 15:07 Antworten mit Zitat |
|
---|---|---|
Ach, ich habs jetzt geschnallt
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 |
Do, Mai 07, 2015 17:00 Antworten mit Zitat |
|
---|---|---|
Edit:
Sieht zwar richtig aus, aber playerX und playerY werden niemals SX und SY... warum ist das der Fall? BlitzBasic: [AUSKLAPPEN] sx = k\x |
||
Silver_Knee |
Do, Mai 07, 2015 20:49 Antworten mit Zitat |
|
---|---|---|
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. | ||
SpionAtomBetreff: Floats sind wichtig |
Do, Mai 07, 2015 22:54 Antworten mit Zitat |
|
---|---|---|
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 |
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group