2D mit Ego-Perspektive

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Moin Leute,

wie währs wenn ihr noch einen Zoom einbaut?

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

danke ^^, ntt das du noch meine "sehr kurzen" Variablenamen beibehalten hast :lol:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten