Sichtfeld für NPCs
Übersicht

![]() |
garretBetreff: Sichtfeld für NPCs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group