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

2D mit Ego-Perspektive

Beitrag von STARGÅTE »

Tachchen,

hier mal ein netter hilfreicher CODE für leute die ein Rollenspiel oder so machen wollen wechel zwar nur in 2D ist aber die Spielfigur trotzdem immer nach vorne Schaut und die Umgebung sich dreht

Das hier ist/sind die Prosedure(n) mit einem MINI-TESTPROGRAMM als demo.

Steuerung ist "W,A,S,D" und Maus ist Sichtwinkel

Code: Alles auswählen

; 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 b.f = #PI/180
Global SichtPunkt_X.f, SichtPunkt_Y.f
Procedure SichtPunkt(x.f, y.f, w.f, Px.f, Py.f, sw.l)
If Abs(x-Px) < sw And Abs(y-Py) < sw :
  Wert = 1
  r.f = Sqr(Pow(x-Px,2)+Pow(y-Py,2))
  t.f = 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 = 512
y = 384

Repeat

ClearScreen(0)

StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor($FFFFFF)
  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() 
w = w + MouseDeltaX()/5

ExamineKeyboard()
If KeyboardPushed(#PB_Key_W) :
  x = x + Cos(w*b)*5
  y = y + Sin(w*b)*5
EndIf
If KeyboardPushed(#PB_Key_S) :
  x = x - Cos(w*b)*5
  y = y - Sin(w*b)*5
EndIf
If KeyboardPushed(#PB_Key_A) :
  x = x + Sin(w*b)*5
  y = y - Cos(w*b)*5
EndIf
If KeyboardPushed(#PB_Key_D) :
  x = x - Sin(w*b)*5
  y = y + Cos(w*b)*5
EndIf

Until KeyboardPushed(#PB_Key_Escape)
Bei Fragen einfach posten ^^
Zuletzt geändert von STARGÅTE am 06.02.2010 19:51, insgesamt 1-mal geändert.
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
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag von Alves »

Dankeschön für den Code!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Alves hat geschrieben:Dankeschön für den Code!
Gut das er verwendung findet ^^
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 »

werd den code frühestens morgen testen ... aber für so was wäre ne
Zeitsteuerung interezant ... Anfänger werden den Code sicher einfach so
nutzten und am ende sich beschweren, warums denn auf veschiedenen
PCs unterschiedlich läuft. :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ist schon nicht schlecht :? Aber der Held hätte ruhig ne andere Farbe haben können /:->

Für so einen relativ kurzen Code ist es schön schnell
und vielseitig nutzbar.


:twisted: Nach einiger Überlegung fällt mir da was ein:

:twisted: PureGTA :shock:

Gruß, Folker :allright:
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Habe erst vor kurzem die Vorteile von TranzformSprite3D() gesehen

Man braucht nur die 4 Punkte platzieren und fertig.

Das noch als Tip für den Code :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
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag von Alves »

Ist Ego-Perspektive nicht, wenn man die Waffe vorne sieht, dh aus den Augen der Person guckt?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Alves hat geschrieben:Ist Ego-Perspektive nicht, wenn man die Waffe vorne sieht, dh aus den Augen der Person guckt?
DESWEGEN JA 2D-Ego !!!
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
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag von Alves »

Ach vestehe war woanders. :roll:
Antworten