Sichtfeld für NPCs

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

garret

Betreff: Sichtfeld für NPCs

BeitragSa, Aug 05, 2006 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich für mein aktuelles Projekt den NPCs ein Sichtfeld verpassen wollte, habe ich eine Funktion (InRadius) geschrieben, die überprüft, ob sich ein Gegner im Sichtradius oder genauer im Sichtfeld (Sichtkegel) befindet.

Das Beispiel verdeutlicht durch den großen Kreis den Sichtradius des Spielers, die blauen Linien begrenzen sein Sichtfeld.

Verbesserungsvorschläge und Kritik sind erwünscht.

MfG garret


Code: [AUSKLAPPEN]

Graphics 800,600,16,2 : SetBuffer BackBuffer() : HidePointer : MoveMouse 500,300

Const sichtfeld = 90, sichtradius = 150               ; in Grad
Const x = 400, y = 300                           ; in Pixeln                        
Global gx=520, gy=20, gspeed=4, sx, sy, w1, w2, sichtwinkel, gegnerwinkel


Global gstart=MilliSecs()                        ; Timer für Bewegung des Gegners

Repeat:Cls

sx=MouseX() : sy=MouseY()

If InRadius(x,y,sx,sy,sichtfeld,sichtradius,gx,gy)=1 Text 10,30,"Gegner entdeckt!"

InRadiusDemo()


Flip:Until KeyHit(1):End



Function InRadius(x,y, bx,by, sichtfeld, sichtradius, gx,gy)
;Local gegnerwinkel, sichtwinkel
;Local w1, w2   ; Grenzwinkel des Sichtfeldes, Sichtwinkel +/- Sichtfeld/2
; Diese Zeilen sind nur zu Demonstrationszwecken auskommentiert

; x/y = Spielerkoordinaten
; bx/by = Koordinaten des Bezugspunktes
; Sichtfeld = maximales Sichtfeld in Grad, Sichtkegel
; Sichtradius = Radius, in dem etwas gesehen wird
; gx/gy = Koordinaten des Ziels

gegnerwinkel = ATan2(gx-x,gy-y)                     ; errechnet Gegnerwinkel
If gegnerwinkel<0 gegnerwinkel=gegnerwinkel + 360

sichtwinkel = ATan2(bx-x,by-y)                     ; eigener Blickwinkel in Bezug zu Maus
If sichtwinkel<0 sichtwinkel=sichtwinkel + 360


w1 = sichtwinkel+sichtfeld/2                     ; Grenzwinkel des Sichtfeldes
If w1>360 w1=w1-360

If sichtwinkel <= sichtfeld/2
   w2 = sichtwinkel - sichtfeld/2 + 360            ; w2 soll nicht negativ werden
Else
   w2 = sichtwinkel - sichtfeld/2
EndIf

If (gegnerwinkel<w1 And gegnerwinkel>w2)
   If (sichtradius * sichtradius) > ( (x-gx)^2 + (y-gy)^2 ) Return 1; Ziel im Radius (Pythagoras)
ElseIf w2>w1
   If (gegnerwinkel>w2 Or gegnerwinkel<w1) And (sichtradius * sichtradius) > ((x-gx)^2+(y-gy)^2) Return 1
EndIf

End Function



Function InRadiusDemo()

; Bewegung des Gegners
If MilliSecs()-gstart>10
   gy=gy+gspeed
   If gy>580 gspeed=-gspeed
   If gy<20 gspeed=-gspeed
   gstart=MilliSecs()
EndIf

Color 0,0,255
Line x,y,x+Sin(w1)*400,y+Cos(w1)*400               ; Linien der Grenzwinkel
Line x,y,x+Sin(w2)*400,y+Cos(w2)*400

Color 255,0,0
Line x,y,x+Sin(sichtwinkel)*50,y+Cos(sichtwinkel)*50;
Oval gx-2,gy-2,4,4,0

Color 255,255,255
Oval x-2,y-2,4,4,0                              ; Spielerpunkt
Oval sx-2,sy-2,4,4,0                           ; Mauspunkt
Oval x-sichtradius,y-sichtradius,2*sichtradius,2*sichtradius,0
Line x,y,x+Sin(gegnerwinkel)*50,y+Cos(gegnerwinkel)*50

Text 10,10, "Winkel des Ziels: "+gegnerwinkel
Text 210,10, "Eigener Blickwinkel: "+sichtwinkel
Text 460,10, "Grenzwinkel des Sichtfeldes: "+w1+" / "+w2
End Function
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group