![]() |
Re: 3D Spiel
@ Cöster
Tutorials gibts da leider keins, zumindest kenne ich keine. Balanced ist nicht mein erstes Spiel das ich schreibe, von daher habe ich schon ein wenig erfahrung im Leveleditor schreiben gehabt. Ich fange eigentlich immer gleich an. Als erstes wird ne Klasse TLevel gebastelt.
Delphi-Quellcode:
Dann überlege ich mir was für ein Leveltyp ich haben will und wie ich die elemente im Level speichere, was für Proceduren Tlevel unbedingt haben mus und welche auf keinen Fall.
Type TLevel = Class
Private Public end; Im 2D- Bereich habe ich da bisher fast immer 2D-Arrays als Platzhalter der Koordinaten genommen. In Balanced ( 3D ) habe ich Dynamische Arrays gemacht, da ein 3D-Array in den größen die es in meinem Game gibt ziemlich gewaltig werden würde. Als nächsten wichtigen Punkt das Zeichnen / Rendern Tlevel mus auf alle Fälle eine Zeichen Routine haben die du von deiner Anwendung aufrufen kannst ohne dir gedanken machen zu müssen. D.h. in Balanced gibts Tlevel.render die Rendert mir dann einfach alles was es zum Level gibt. Der Leveleditor beginnt dann schnell zu wachsen. Ich bin beim Balanced Leveleditor ja immer noch nicht fertig. Immer wieder baue ich neue Elemente ein. Weitere Proceduren die es dann so gibt sind in Ballanced :
Delphi-Quellcode:
Wie du sehen kannst gibts jede menge I/O schnittstellen. Ganz zu schweigen von den 96 Add Proceduren die ich hier mal nicht kopiert habe um den Post nicht unnötig auf zu blähen.
..
Procedure DeleteObject(x, y, z: integer); Procedure RotateCoord(x, y, z, Angle: integer); Procedure Render; Procedure RenderSky; Procedure SaveToFile(Filename: String; viewer: Tviewer; Cursor3d: TCursor3d; bc: Boolean); // Still Gelegt Procedure SaveToFile2(Filename: String; viewer: Tviewer; Cursor3d: TCursor3d; bc: Boolean); Procedure LoadFromFile(Filename: String; Var viewer: Tviewer; Var Cursor3d: TCursor3d; Var BC: Boolean); // Still Gelegt Procedure LoadFromFile2(Filename: String; Var viewer: Tviewer; Var Cursor3d: TCursor3d; Var BC: Boolean); Procedure Loadhighscores(Filename: String); Procedure ClearLevel; Procedure Setnewton(Const Newtonworld: Pnewtonworld); Procedure UnsetNewton(Const Newtonworld: Pnewtonworld); Procedure Collision(PlayerPos: TVector3f; PlayerMat: shortint); Procedure Restart(Const Newtonworld: Pnewtonworld); Procedure ResetLevel(Const Newtonworld: Pnewtonworld); Procedure resetHighscore; Procedure setBarierGroup(ID: Gluint; Const Newtonworld: Pnewtonworld); Procedure SetCoordText(x, y, z: integer; Value: String); Function Coordid(x, y, z: integer): String; .. Ich hoffe das gibt euch eine Grobe Idee, für weitere Fragen stehe ich natürlich gerne zur verfügung. |
Re: 3D Spiel
Danke für den Einblick in deine Level-Editoren. Wenn ich dich richtig verstehe, speicherst du die Welt also 3-dimensional in Arrays und zur Darstellung rechnest du sie dann wahrscheinlich unter Berücksichtigung von Blickwinkel und Kameraposition in ein 2D-Bild um, welches du dann immer wieder neu auf dem Bildschirm. Ist das korrekt oder wie schaffst du die Darstellung?
|
Re: 3D Spiel
@ Cöster
NEIN, Wenn ich das so machen würde wärs heftig. 1. Speichere ich nur die Opbjecte diese sind alle in einem eindimensionalen Array gespeichert. Jedes Element hat eine Variable Position. Für alle neugierigen hier die Basisklasse von der alle Objecte im spiel abgeleitet wurden.
Delphi-Quellcode:
Und alles was zum Zeichnen benutzt wird macht OpenGL für mich.
TBalancedObject = Class
private FTexture: GLuint; // Pointer auf die Graphik unseres Steines. Fposition: TVector3f; FSchwerpunkt: TVector3f; Fpoints: Array Of TVector3f; Froty: Integer; Function FgetRotationY: integer; Procedure Setschwerpunkt; public Property RotationY: integer read FgetRotationY; Property Texture: gluint read Ftexture; Function Position: TVector3f; Constructor create(Pointcount: Integer); Destructor destroy; override; Procedure RotateY(Angle: Integer); virtual; End; D.h. seit dem Frustumculling nicht mehr alles, aber fast.( für einen Anfänger macht man alles und versteht irgendwann wie's geht und baut dann das Frustumculling ein, oder so) was du mit Blickwinkel und gruscht meinst bruache ich nicht machen. OpenGL ist genau wie Form1.canvas Es gibt Zeichenroutinen die benutze ich, nur eben das alles 3D ist. Den ganzen Optischen gruscht macht dann das OpenGL für mich. Das Rendern eines Rechtecks passiert bei mir im Spiel z.b. so
Delphi-Quellcode:
Wenn man es ganz scharf betrachtet kann man die Procedure DrawQuadPolygon schon als Engine Bezeichnen.
Procedure DrawQuadPolygon(LeftTop, RightTop, RightBottom, LeftBottom: TVector3f; Texture: gluint = 0);
Begin // Einbinden der Graphik If Texture <> 0 Then glBindTexture(GL_TEXTURE_2D, Texture); // Öffnen des Quad Modus glbegin(GL_QUADS); // Zeichnen Links unten glTexCoord2f(0.0, 0.0); glVertex3f(LeftBottom.X, LeftBottom.y, LeftBottom.z); // Zeichnen Rechts unten glTexCoord2f(1.0, 0.0); glVertex3f(RightBottom.X, RightBottom.y, RightBottom.z); // Zeichnen Rechts Oben glTexCoord2f(1.0, 1.0); glVertex3f(RightTop.X, RightTop.y, RightTop.z); // Zeichnen Links Oben glTexCoord2f(0.0, 1.0); glVertex3f(LeftTop.X, LeftTop.y, LeftTop.z); // Beenden des Quad Modus glend; End; |
Re: 3D Spiel
Zitat:
|
Re: 3D Spiel
@Corpsman:
Mit 1 Jahr Schuldelphi und ansonsten keinerlei Programmiererfahrung ist das wohl noch nix führ mich. Vielleicht sollte ich mir erstmal auf ![]() @vlees91: Was wär denn konkret so ein Beispiel, bei dem das Buch deiner Meinung nach nicht genug erklärt hat? |
Re: 3D Spiel
Hm, ich weiß nicht, ich hab ja selbst die bücher empfohlen. Klar ist bei glScene der einstieg leichter, aber(ich finde) man hat bei genesis3d später wesentlich mer möglichkeiten. Von Mathematischer seite her hatte ich keine großen Probleme.
|
Re: 3D Spiel
Genesis ist einfach nur schwer. Irrlicht ist viel leichter, wenn man einen Wrapper hat.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz