@ 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:
Type TLevel = Class
Private
Public
end;
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.
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:
..
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;
..
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.
Ich hoffe das gibt euch eine Grobe Idee, für weitere Fragen stehe ich natürlich gerne zur verfügung.