Sichtfeld bei KI

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

ke^kx

Betreff: Sichtfeld bei KI

BeitragMi, März 23, 2005 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich arbeite gerade an einer KI. Sie soll aber nur Informationen über den Spieler erhalten, wenn dieser vor ihr ist. Dafür habe ich folgenden Code geschrieben:

BlitzBasic: [AUSKLAPPEN]

Graphics 640, 480, 16, 2
SetBuffer BackBuffer ()

Dim RoboW(359)

Global x1, x2, y1, y2, winkel1, winkel2, w, w1, w2

x2 = 300
y2 = 300

TFormFilter 0

For i = 0 To 359

RoboW(i) = LoadImage (\"Robo1.bmp\")

MidHandle RoboW(i)

RotateImage RoboW(i), i

MaskImage RoboW(i), 0, 0, 0

Next

Repeat

Cls

Bewegen ()

Wertekorrigieren ()

DrawImage RoboW(winkel1), x1, y1
DrawImage RoboW(winkel2), x2, y2

anzeiger= Sichtfeld ()
Drehen_zu ()

Flip

Until KeyDown (1)

End

Function Sichtfeld ()

w = (ATan2(y2 - y1, x2 - x1) + 360) Mod 360
w = (w - 90) Mod 360

w1 = w - 85
w2 = w + 85

If w1 < winkel2 And w2 > winkel2 Then

Return 1

EndIf

End Function

Function Drehen_zu ()

winkel =ATan2(y1 -y2, X1 - X2)+90

If winkel < 0 Then winkel = winkel+360


If winkel2 > Winkel And winkel2-180 < Winkel Then winkel2= winkel2-1
If winkel2 > Winkel And winkel2-180 > Winkel Then winkel2= winkel2 +1
If winkel2< Winkel And winkel2+180 < Winkel Then winkel2= winkel2-1
If winkel2< Winkel And winkel2+180 > Winkel Then winkel2= winkel2+1
If winkel2= Winkel -180 Or winkel2-180 = Winkel Then winkel2= winkel2+1

End Function

Function Bewegen ()

If KeyDown (200) Then Vorwaerts ()

If KeyDown (208) Then Rueckwaerts ()

;Drehen

If KeyDown (205) Then Drehen_Rechts ()

If KeyDown (203) Then Drehen_Links()



End Function

Function Drehen_Links ()

winkel1 = winkel1 - 1

End Function

;-----------------------------------------------------------------------------------------------------

Function Drehen_Rechts ()

winkel1 = winkel1 + 1

End Function

;-----------------------------------------------------------------------------------------------------

Function Rueckwaerts ()

x1 = x1 - Sin(Winkel1) * 2

y1 = y1 + Cos(winkel1) * 2

End Function

;-----------------------------------------------------------------------------------------------------

Function Vorwaerts ()

x1 = x1 + Sin(Winkel1) * 2

y1 = y1 - Cos(winkel1) * 2

End Function

Function WerteKorrigieren ()

If winkel1 > 359 Then winkel1 = 0
If winkel1 < 0 Then winkel1 = 359

If winkel2 > 359 Then winkel2 = 0
If winkel2 < 0 Then winkel2 = 359

If x1 > 630 Then x1 = 630
If x1 < 10 Then x1 = 10

If y1 > 470 Then y1 = 470
If y1 < 10 Then y1 = 10

End Function


Vorne beim Bild ist oben.

So kann ich schonmal einschränken, was die KI "sieht". Aber man soll sich ja auch hinter Gegenständen verstecken können. Das wollte ich mit einem änlichen Code machen, aber ich benötige dafür ja zusätzlich die Breite des Objekts aus der Sicht der KI (eigentlich ist es für 3D). Wie kann ich diese herausfinden? Oder gibt es eine komplett andere Lösungsmöglichkeit (vorallem ein Ansatz).

Danke schonmal im Vorraus,
Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

Alfadur

BeitragMi, März 23, 2005 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, ich hab nen sehr miesen lösungsansatz...

du könntest raycasting benutzen, also von der gegnerposition per for-schleife ein paar (unsichtbare) strahlen aussenden und schauen mit was die kollidieren ... wenn du direkt vor dem gegner stehst kollidieren sie mit dir, wenn du hinter irgendeiner mauer stehst dann kollidieren sie mit der mauer und treffen dich nicht ... dann bist du versteckt. das geht bei 2d noch einigermaßen schnell, bei 3d weiß ich nichs, da ja die dritte dimension auch noch abgefragt werden muß ... erhöht sich also um ein vielfaches und bei vielen gegnern.... aua.

mies, aber mir fällt nix besseres ein.
A Cray is the only computer that runs an endless loop in less than four hours.
 

ke^kx

BeitragMi, März 23, 2005 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich mir schon überlegt, aber das verbraucht schon bei einer KI in 2D enorm viel Rechenzeit, weil diese Strahlen ja immer um höchstens einen Pixel verlängert werden dürfen.

Danke trotzdem, das du darüber nachgedacht hast,
Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

Alfadur

BeitragMi, März 23, 2005 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
hab von 3d keine ahnung, versuche mich da gerade reinzufinden und ein partikelsystem an mein mesh zu pappen, geht irgendwie nich. aber ich bin über das entityinview gestolpert... wenn du für den gegner ne camera kreierst... weiß nich ob das geht... aber dann könnte man das abfragen... denke ich mal. weiß aber auch nich genau...
A Cray is the only computer that runs an endless loop in less than four hours.
 

ke^kx

BeitragMi, März 23, 2005 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, so könnte es gehen. Ich probiers mal aus. Aber auch das ist leider sehr umständlich, da ich alle Objekte in einem Dim-Feld speichern müsste.

Wen jemanden noch eine andere Lösungsansatz parat hat, trotzdem bitte posten.

Danke @Alfadur,
Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

maximilian

BeitragDo, März 24, 2005 2:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Verstehe das Problem nicht ganz. Nimm doch Types. Smile


BlitzBasic: [AUSKLAPPEN]

Type enemey
Field id
Field x, y, z
End Type


So kannst du wunderbar alle Gegner verwalten, und fragst einfach ab, ob sie dich sehen. Dann kannst du sogar noch Sachen wie Waffen, Energie und Spezialeffekt hinzufügen.

LordChaos
Variety is the spice of life. One day ignore people, next day annoy them.

Lord_Vader

BeitragDo, März 24, 2005 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit sinus und cosinus. Dann kannste mit AND in einer IF anweisung nen bereich eingrenzen. Ist schneller als jeden punkt durchzugehen.
 

ke^kx

BeitragDo, März 24, 2005 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@LordChaos:
Witzbold, ich müsste die Meshes in dims oder Types speichern und das würde den Zugriff nicht gerade erleichtern. Außerdem speichere ich diese ganzen Daten sowieso schon in Dim-Feldern (macht ja keinen unterschied zu Types).

@Lord_Vader:
Den Bereich habe ich ja bereits eingegrenzt, mir fehlt ja eigentlich nur die Breite des im weg stehenden objektes.

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

Lord_Vader

BeitragDo, März 24, 2005 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wirf ein pivot oder aehnliches von dem spieler zu der box und zaehle ab!

BladeRunner

Moderator

BeitragDo, März 24, 2005 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, als Ansatz (allerdings vor allem für 2D):

Voraussetzung: eine idealerweise als Dim gespreicherte karte mit den hindernissen (sprich: ne tilekarte).
Nun lässt du ein a*-Pathfinding von Ki zu dir stattfinden, unterscheidet es sich auch nur in einem Schritt vom direkten Weg ist ein Hindernis vorhanden.

der zeitaufwand hält sich noch einigermassen in Grenzen, v.a. wenn ja nur innerhalb der Sichtweite geprüft werden musst und du a+ und Vergleich in eine Routine baust, also abgebrochen wird sobald das erste Hindernis erkannt wird.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

ke^kx

BeitragDo, März 24, 2005 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@Lord_Vader:
Wie meinst du dass, welche Box? Und wie kann ich das Abzählen? (Tut mir Leid, dass ich heute etwas schwer von Verstand bin, komme gerade aus dem Urlaub zurück^^)

@Bladerunner:
Ja, so köntte es gehen. Aber das funktioniert in 3D leider nur, wenn man auf Boden steht, denn sonst hat man übelste Probleme (3D a-Pathfinding^^)

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

maximilian

BeitragDo, März 24, 2005 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
o_O Wenn du keine Types benutzt, wie willst du sonst alle benötigeten Sachen speichrn. Bei Dims hast du immer den Nachteil der festen Begrenzung und ohne ist es ja praktisch unmöglich.

Und sonst ist es ja noch wichtig zu wissen, ob es nun 2D oder 3D sein soll. Euer Endprodukt wäre ja eh 3dimensional, also lohnt es sich nicht, würde ich sagen, jetzt eine komplizierte 2D-Lösung zu schreiben wenn Blitz eh schon alles parat hat. Wink

LordChaos
Variety is the spice of life. One day ignore people, next day annoy them.
 

ke^kx

BeitragDo, März 24, 2005 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie hat Blitz diese Lösung denn parat? Ich bin immer noch nicht ganz zurück^^

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

maximilian

BeitragDo, März 24, 2005 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Na es gab doch dieses EntityInView. Du erstellst für eine Camera und prüfst dann für jeden Gegner ob sie den Spieler sehen. Danach kannst du die Cam wieder löschen. Ich denke, so zeitaufwenig ist das nicht. Wenn eine Camera aber wirklich nur so 16 Bytes wegnimmt (wahrscheinlich entity_id, entity_x, entity_y und entity_z), kannst du sie auch gleich eingepspeichert lassen.

Also sowas:

BlitzBasic: [AUSKLAPPEN]

ai_cam = CreateCamera()

For enemey = Each enemy
PositionEntity ai_cam, enemey\x, enemey\y, enemey\z
If EntityInView(player\mesh, ai_cam) Then
found_player = True
End If
Next

DeleteCam ai_cam (oder was auch immer, ich habe keinen blassen Dunst von 3D, progge ja nur 2D ^^)


Das ist jetzt natürlich nur so pie mal Daumen geschrieben, wie gesagt, benutze kein B3D.

LordChaos
Variety is the spice of life. One day ignore people, next day annoy them.

YellowRider

Ehemaliger Admin

BeitragDo, März 24, 2005 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Besser wärs aber mit DeltaYaw und DeltaPitch (http://www.blitzbase.de/befehle3d/deltapitch.htm, http://www.blitzbase.de/befehle3d/deltayaw.htm)

edit:
Hier beträgt das sichtfeld 45°

BlitzBasic: [AUSKLAPPEN]
If Abs(DeltaYaw(enemy,player))<45 And Abs(DeltaPitch(enemy,player))<45
enemyseeyou=1
EndIf
 

ke^kx

BeitragDo, März 24, 2005 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@LordChaos:
Ja, so mach ich es jetzt. Danke für deine Geduld^^

@YellowRider:
Das würde aber auch wieder nur das grundsätzliche Sichtfeld festlegen. Auch hier fehlt mir wieder die breite der Hindernisse. Danke trotzdem, so werde es wahrscheinlich im äußersten Bereich des Sichtfeldes machen, da die KI dafür weniger Informationen bekommen soll (aus dem Augenwinkel halt).

Danke nochmal an alle, die hier gepostet haben,
Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM
  • Zuletzt bearbeitet von ke^kx am Fr, März 25, 2005 12:57, insgesamt 2-mal bearbeitet

wunderkind

BeitragDo, März 24, 2005 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Jiriki hat Folgendes geschrieben:
@LordChaos:@Wunderkind:
Das würde aber auch wieder nur das grundsätzliche Sichtfeld festlegen. Auch hier fehlt mir wieder die breite der Hindernisse. Danke trotzdem, so werde es wahrscheinlich im äußersten Bereich des Sichtfeldes machen, da die KI dafür weniger Informationen bekommen soll (aus dem Augenwinkel halt).


Was habe ich gesagt? Und wo?
 

ke^kx

BeitragFr, März 25, 2005 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, habe mich natürlich geirrt^^

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group