Seite 2 von 2

Verfasst: 15.05.2006 16:54
von PMV
hier mal ne PB4.0 Version ... etwas abgeändert mit meiner
angesprochenden Zeitsteuerung :D

Code: Alles auswählen

#b = 3.14159265/180 
#PixperSec = 100

; Berechnet den Sichtpunkt beim Winkel (w), wenn sich die Umgebung (Px,Py) um (x,y) dreht, abei ist (sw) die Sichtweite, ob es angezeigt wird 
Global SichtPunkt_X.f, SichtPunkt_Y.f 
Procedure SichtPunkt(x.f, y.f, w.f, Px.f, Py.f, sw.l) 
  Protected r.f, t.f
  If Abs(x-Px) < sw And Abs(y-Py) < sw : 
    Wert = 1 
    r = Sqr(Pow(x-Px,2)+Pow(y-Py,2)) 
    t = ATan((y-Py)/(x-Px))/#b 
    If x-Px < 0 : t = t + 180 : EndIf 
    If x-Px = 0 : 
      If (y-Py)<0 : t = -90 : EndIf 
      If (y-Py)>0 : t = 90 : EndIf 
    EndIf 
    SichtPunkt_X = Cos((t-w-270)*#b)*r 
    SichtPunkt_Y = Sin((t-w-270)*#b)*r 
  EndIf 
  ProcedureReturn Wert 
EndProcedure 
; Gibt den errechneten relativen X-Wert zum SichtPunkt zurück 
Procedure SichtX() 
  ProcedureReturn SichtPunkt_X 
EndProcedure 
; Gibt den errechneten relativen Y-Wert zum SichtPunkt zurück 
Procedure SichtY() 
  ProcedureReturn SichtPunkt_Y 
EndProcedure 



;Hier das Testprogramm dazu : 


InitKeyboard() 
InitMouse() 
InitSprite() 

Structure Punkt 
  x.f 
  y.f 
EndStructure 
Global NewList Punkt.Punkt() 
Procedure AddPunkt(x, y) 
  AddElement(Punkt()) 
  Punkt()\x = x            
  Punkt()\y = y            
EndProcedure 

For n = 1 To 1000 : 
  AddPunkt(Random(512)+256, Random(384)+192) 
Next n 

OpenScreen(1024,768,32,"TEST") 

x.f = 512 
y.f = 384
w.f = 0

Repeat 
  FrameTime = Timer - ElapsedMilliseconds()
  Timer = ElapsedMilliseconds()

  ClearScreen(0) 
   
  StartDrawing(ScreenOutput()) 
    DrawingMode(1) 
    FrontColor(RGB(255,255,255)) 
    ResetList(Punkt()) 
    While NextElement(Punkt()) 
      SichtPunkt(x, y, w, Punkt()\x,  Punkt()\y, 1000) 
      Circle(512+SichtX(),384+SichtY(),2) 
    Wend 
    Circle(512,384,5) 
  StopDrawing() 
 
  FlipBuffers() 
           
  ExamineMouse() 
   
  ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_S)
    x = x + Cos(w*#b) * #PixPerSec * FrameTime / 1000
    y = y + Sin(w*#b) * #PixPerSec * FrameTime / 1000
  EndIf 
  If KeyboardPushed(#PB_Key_W)
    x = x - Cos(w*#b) * #PixPerSec * FrameTime / 1000
    y = y - Sin(w*#b) *  #PixPerSec * FrameTime / 1000
  EndIf 
  If KeyboardPushed(#PB_Key_D)
    w = w - #PixPerSec * FrameTime / 1000
  EndIf 
  If KeyboardPushed(#PB_Key_A)
    w = w + #PixPerSec * FrameTime / 1000
  EndIf 
 
Until KeyboardPushed(#PB_Key_Escape)
MFG PMV

Verfasst: 15.05.2006 16:57
von DarkDragon
STARGÅTE hat geschrieben:
Alves hat geschrieben:Ist Ego-Perspektive nicht, wenn man die Waffe vorne sieht, dh aus den Augen der Person guckt?
DESWEGEN JA 2D-Ego !!!
Das gibt es nicht, es heißt Vogelperspektive. Ego-Perspektive(1st Person) ist wie wenn du aus dem Auge des Spielers siehst und nicht von irgendwo anders. 3rd Person Perspektive ist wenn die Spielerfigur vor der Perspektive steht.

Verfasst: 15.05.2006 17:59
von STARGÅTE
von mir aus :roll:

Ich nenns trotzdem 2D-Ego

@ PMV

Du hast jetzt aber ein riesen Fehler drin !!!

Die Steuerung sollte so wie bei CS und andere Spielen sein.

Bei dir ist jetzt A und D drehen :?
das sollte aber seitlich bewegen sein !!!

Und die Maus zum drehen

Verfasst: 15.05.2006 18:54
von PMV
ich hab mich an dem GTA-Stiel gehalten ... das find ich interezanter ... :wink:
also ist deins falsch :mrgreen: ... ne, wir sind im programmierforum,
wenns wer anders haben will ... dann solls er doch anders machen :lol:

MFG PMV

Verfasst: 15.05.2006 20:41
von STARGÅTE
PMV hat geschrieben:ich hab mich an dem GTA-Stiel gehalten ... das find ich interezanter ... :wink:
also ist deins falsch :mrgreen: ... ne, wir sind im programmierforum,
wenns wer anders haben will ... dann solls er doch anders machen :lol:

MFG PMV
:allright:

Verfasst: 17.11.2007 03:03
von Scarabol
Moin Leute,

wie währs wenn ihr noch einen Zoom einbaut?

Gruß
Scarabol

Verfasst: 17.11.2007 12:32
von STARGÅTE
naja den kannst du ganz eicht selber einbauen, in dem du in dieser Stelle eine globale Zoom-Variable einbaust.
Ist diese 1 ist alles normal: ist sie kleiner 1 wird alles kleiner, du zommst also raus, und ist sie größer 1 wird alles größer, du zoommst also ran:

Code: Alles auswählen

...
Global ZOOM.f
Procedure SichtPunkt(x.f, y.f, w.f, Px.f, Py.f, sw.l) 
  Protected r.f, t.f 
  If Abs(x-Px) < sw And Abs(y-Py) < sw : 
    Wert = 1 
    r = Sqr(Pow(x-Px,2)+Pow(y-Py,2))*ZOOM ; <-- Hier ist die einzige änderung
    t = ATan((y-Py)/(x-Px))/#b 
    If x-Px < 0 : t = t + 180 : EndIf 
    If x-Px = 0 : 
      If (y-Py)<0 : t = -90 : EndIf 
      If (y-Py)>0 : t = 90 : EndIf 
    EndIf 
    SichtPunkt_X = Cos((t-w-270)*#b)*r 
    SichtPunkt_Y = Sin((t-w-270)*#b)*r 
  EndIf 
  ProcedureReturn Wert 
EndProcedure 
...
natürlich musst du auch die Grafiken/Objekte zoomen

Verfasst: 17.11.2007 13:45
von NicTheQuick
Also hier nochmal die Version, die Strafen (WASD) und Drehen (Cursor)
unterstützt. Außerdem Zoom (Bild hoch/runter), einige Performance-
Änderungen und Protected-Variablen. Zeitsteuerung ist natürlich auch
integriert:

Code: Alles auswählen

Structure Punkt
 x.d
 y.d
EndStructure

#PI      = 3.141592653589793238
#Deg2Rad = #PI / 180
; Berechnet den Sichtpunkt beim Winkel (w), wenn sich die Umgebung (Px,Py) um (x,y) dreht, abei ist (sw) die Sichtweite, ob es angezeigt wird
Procedure SichtPunkt(x.d, y.d, w.d, px.d, py.d, sw.d, zoom.d, *Sicht.Punkt)
  Protected xt.d, yt.d, R.d, t.d
  xt = x - px : yt = y - py
  R = Sqr(xt * xt + yt * yt)
  If R > sw : ProcedureReturn #False : EndIf
  R * zoom
  t = ATan(yt / xt) / #Deg2Rad
  If xt < 0 : t = t + 180 : EndIf
  *Sicht\x = Cos((t - w - 270) * #Deg2Rad) * R
  *Sicht\y = Sin((t - w - 270) * #Deg2Rad) * R
  ProcedureReturn #True
EndProcedure

;Hier das Testprogramm dazu :
InitKeyboard()
InitMouse()
InitSprite()

Global NewList Punkt.Punkt()
Procedure AddPunkt(x, y)
  AddElement(Punkt())
  Punkt()\x = x           
  Punkt()\y = y           
EndProcedure

For n = 1 To 1000 :
  AddPunkt(Random(1024), Random(768))
Next

OpenScreen(1024, 768, 32, "TEST")

Define x.d, y.d, w.d, Sicht.Punkt, zoom.d = 1, Timer.l, TimeMul.d
x = 512
y = 384
#PixPerSec = 100

Repeat
  TimeMul = #PixPerSec * (ElapsedMilliseconds() - Timer) / 1000
  Timer = ElapsedMilliseconds()
  
  ClearScreen(0)
 
  StartDrawing(ScreenOutput())
  DrawingMode(1)
  ForEach Punkt()
    If SichtPunkt(x, y, w, Punkt()\x, Punkt()\y, 300, zoom, @Sicht)
      Circle(512 + Sicht\x, 384 + Sicht\y, 2, $FFFFFF)
    EndIf
  Next
  Circle(512, 384, 5, $FF0000)
  StopDrawing()

  FlipBuffers()
 
  ExamineMouse()
  w + MouseDeltaX()
 
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_W) Or KeyboardPushed(#PB_Key_Up)
    x + Cos(w * #Deg2Rad) * TimeMul
    y + Sin(w * #Deg2Rad) * TimeMul
  EndIf
  If KeyboardPushed(#PB_Key_S) Or KeyboardPushed(#PB_Key_Down)
    x - Cos(w * #Deg2Rad) * TimeMul
    y - Sin(w * #Deg2Rad) * TimeMul
  EndIf
  If KeyboardPushed(#PB_Key_A)
    x + Sin(w * #Deg2Rad) * TimeMul
    y - Cos(w * #Deg2Rad) * TimeMul
  EndIf
  If KeyboardPushed(#PB_Key_D)
    x - Sin(w * #Deg2Rad) * TimeMul
    y + Cos(w * #Deg2Rad) * TimeMul
  EndIf
  If KeyboardPushed(#PB_Key_Left)  : w - TimeMul : EndIf
  If KeyboardPushed(#PB_Key_Right) : w + TimeMul : EndIf
  If KeyboardReleased(#PB_Key_PageUp) : zoom * 1.1 : EndIf
  If KeyboardReleased(#PB_Key_PageDown) : zoom / 1.1 : EndIf
Until KeyboardPushed(#PB_Key_Escape)

Verfasst: 17.11.2007 16:16
von STARGÅTE
danke ^^, ntt das du noch meine "sehr kurzen" Variablenamen beibehalten hast :lol: