Entwickler-Ecke

Open Source Units - Engine - Fear2D


F34r0fTh3D4rk - Sa 01.07.06 14:54
Titel: Engine - Fear2D
2D Engine

Fear2D (Namensähnlichkeiten zu kommerziellen Spielen sind rein zufällig, der Name Fear stammt von meinem Nickname "F34r0fTh3D4rk") ist eine kleine 2D Engine die ich für ein kommendes Projekt
geschrieben habe. Sie ist noch im Anfangsstadium, einige Units dienen momentan
nur als Platzhalter.

Die grafische Ausgabe wird mittels OpenGL realisiert, dessen Initialsierung
von der Engine übernommen wird.
Das gleiche gilt für die BASS.DLL, welche ich für die Soundausgabe verwende.

Die Bass.dll sowie die ebenfalls benötigte bass.pas sind hier zu finden:

http://www.un4seen.com/

Man muss sich nicht weiter mit der Bass.dll auseinandersetzen, die bedienung über die
Engine geht leicht von der Hand.
Ewähnenswert ist jedoch, dass man für die kommerzielle Nutzung der Bass.dll eine Lizenz erwerben muss, deshalb habe ich die DLL auch nicht in mein Projekt direkt integriert, da die BASS.dll nicht OpenSource ist.

Der Download Der Engine befindet sich am Anhand, dort sind auch diese beiden Dateien unter dem Namen (externals.zip) zu finden, die dglOpenGL.pas und die glBitmap.pas

http://wiki.delphigl.com/index.php/DGLOpenGL.pas
http://www.dev-center.de/index.php?cat=header&file=glbitmap

Ein Template liegt dem Download bei, Demos gibt es leider noch nicht, aber ich werde hier mal einige Beispiele aufführen (viele Sachen lassen sich auch durch Kommentarlesen herausfinden ^^):


Delphi-Quelltext
1:
  Engine: TEngine;                    


kann als Teil des Formulars oder (wie in meinem Template) als globale Variable deklariert werden.

Das Formular muss dann noch über ein:

Delphi-Quelltext
1:
    procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);                    

erweitert werden, das OnCreate sieht dann so aus:

Delphi-Quelltext
1:
2:
3:
  Engine := TEngine.Create;
  Engine.Init(self);
  Application.OnIdle := ApplicationEventsIdle;

Im Destroy ganz einfach:

Delphi-Quelltext
1:
  Engine.Free;                    


soweit zur initialisierung, jetzt fehlt noch die OnIdle Prozedur:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TMainForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
  Engine.DoBegin;
  Engine.DoEnd;
  Done := false;
end;

Das Wäre vorerst alles, eigentlich sollte jetzt schon ein schwarzes Formular zu sehen sein.

Per Engine.FPS lassen sich die Frames per Second abfragen und per Engine.Timestep die Zeitdifferenz zum letzten Frame (delta t)
man siehe auch: http://wiki.delphigl.com/index.php/Timebased_Movement

Ein einfaches Objekt kann so erstellt werden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  Obj: TSimpleObject;
{...}
begin
  Obj := TSimpleObject.Create;
  with Obj do 
  begin
    position.x := clientwidth / 2;
    position.y := clientheight / 2;
    z := 0;
    size.x := 50;
    size.y := 50;
    texture := 'mytex';
    usealpha := true;
    alpha := 255 div 2;
  end;
end;


nunja, im quelltext sieht man eine textur: 'mytex' diese muss vorher jedoch
erst einmal geladen werden (kann auch danach geschehen, hauptsache vor dem zeichnen)

Dies geht mit:

Delphi-Quelltext
1:
  Engine.TextureManager.AddTexture                    

oder

Delphi-Quelltext
1:
  Engine.TextureManager.AddTexturesInDir                    

Beim ersten wird der DateiName, sowie der Name der Textur erwartet, über den später auf die Textur zugriffen wird (in unserem Beispiel 'mytex').

Die zweite Methode erlaubt das hinzufügen sämtlicher Texturen eines Ordners, wobei der Name dann immer dem Dateinamen entspricht. Heißt die Datei zB 'grass.bmp' heißt die Textur 'grass'.

Gezeichnet wird das ganze zwischen Engine.DoBegin und Engine.DoEnd folgendermaßen:

Delphi-Quelltext
1:
  Obj.Draw(Engine, true);                    

Der 2. Parameter gibt an, ob die Textur verwendet werden soll, ansonsten wird nur die Farbe verwendet. Die Farbe kann außerdem in Kombination mit der Textur und somit vermischt werden.

Möchte man ein Objekt Transparent zeichnen, muss man usealpha auf true setzen und alpha einen wert zwischen 0 und 255 verpassen.

alphatest lässt den alphakanal eines bildes (zB tga) transparent werden.

Wer animierte Objekte braucht, sollte auf die Klassen TAnimation und TAnimObj zurückgreifen.

Per Angle lässt sich ein Winkel definieren, sodass das Bild gedreht ausgegeben wird.

In TAnimation gibt man eine Textur und die Anzahl der Bilder auf der Horzontalen / Vertikalen Achse an, sowie mit Duration, die Dauer der Animation in Millisekunden.

TAnimObj ist dann das eigentliche Objekt was gezeichnet wird, dort kann man Animationen hinzufügen und per with GetAnimation(NAME) do darauf zugreifen.
mit Play lässt sich dann eine Animation abspielen.

Ich wollte eigentlich nicht zu weit ausschweifen ^^ aber die Klasse TTile ist auch noch erwähnenswert. Mit ihr kann man auf ein Tileset (TTileSet) zugreifen und somit mehrere Texturen in einer Textur verwalten. Die Textur wird im TileSet angegeben, dort ebenfalls die Anzahl der Waagerechten und Senkrechten Texturen. Dann muss noch beim Zeichnen das gewünschte TileSet angegeben werden und schon ist das Tile auf dem Schirm ;)

Der BugTracker loggt automatisch (nicht)geladene Sounds und Texturen, wo wir beim Thema Sound wären:

Delphi-Quelltext
1:
  Engine.SoundManager.AddSound                    

sowie

Delphi-Quelltext
1:
Engine.SoundManager.AddSoundsInDir                    

arbeiten genauso, wie ihre Brüder beim TextureManager.
Mit PlaySound wird ein Sound gespielt.
Loop gibt an, ob ein Sound wiederholt werden soll und wait, ob gewartet werden soll,
bis der sound fertig gespielt hat (bei potentiellen Mehrfachaufrufen ganz Sinnvoll)
PauseSound pausiert einen Sound und StopSound.

Falls noch Fragen sein sollten, einfach hier ins Forum, per pm, oder per eMail. Ich werde demnächst einige Demos schreiben und würde mich auf Feedback freuen. Je mehr Feedback, desto mehr Features und mehr Demos ;)

Ach ja, die benötigten uses kann man dem Template entnehmen :P

Text anzeigen geht leider noch nicht, das musste ich wegen einige Fehler rausnehmen.
Entwickeln kann man pixelgenau unter jeder Auflösung, das Bild wird dann automatisch für andere Auflösungen gestreckt und Objekte müssen im Destroy freigegeben werden.

So das wars ;)


AKTUELLSTE VERSION HIER:

[url]http://www.martoks-place.de/delphi/opengl/fear2d/[/url]

(Version die von Martok noch eine Textunit und andere Feinheiten spendiert bekommen hat.)


mfg


LLCoolDave - Sa 01.07.06 15:59

Klingt sehr interessant, gäbe es jedoch noch die Möglichkeit die Engine auf Framebasis zu erweitern? D.h. eine Target Framerate, die sogut wie möglich eingehalten werden sollte, die Ergänzung der TAnimation Klasse (oder entsprechend eine alternative, ist ja egal) die Animationen nicht nach Zeit sondern nach Frames durcharbeitet, sowie wenn möglich eine Interne Framecounter klasse die die frames mitzählt (mit start stop, und auslese funktion).

Ich komme nämlich zum einen eher aus der Konsolenwelt, wo zum Großteil framebasierende Bewegung angesagt ist, und ausserdem hat timebased bei Spielen mit Highscores auch des öfteren seltsame Effekte, da sich das Spiel bei niedriger Framerate doch des öfteren anders verhält als bei hoher Framerate.

Ansonsten finde ich die Idee klasse =)


F34r0fTh3D4rk - Sa 01.07.06 16:32

naja du kannst das ganze natürlich auch in einen timer packen, dann muss du vielleicht die duration anders wählen, da der timestep (also delta t) dann statisch ist, aber im grunde sollte das trotzdem funktionieren. (ich glaube auch, dass die duration nicht einmal verändert werden muss, das sollte afaik auch so gehen). einfach mal in einem timer mit interval 33 testen, das wären dann statische 30fps.

EDIT: Man muss Duration durch das Timer Interval teilen, dann funktioniert's

es gibt bei der animation ohnehin am ende noch so ein flackern, das muss noch behoben werden.

Das Problem ist, dass auch dort Schwankungen auftreten können und du somit wieder auf timestep zurückgreifen musst, was du dann aber auch lieber gleich machen kannst, aber dann mit der vollen anzahl an fps.


GTA-Place - So 02.07.06 09:08

*verwirrt* Es gibt genau eine *.pas in dem Ordner Template und die ist etwas leer. Wo sind die ganzen Units?


F34r0fTh3D4rk - So 02.07.06 10:17

sorry, kA woher es kam, aber jetzt stimmt es ;)


F34r0fTh3D4rk - So 02.07.06 15:15

Ich habe im ersten Beitrag mal eine kleine Demo angehängt, der Code ist nicht der beste, aber er zeigt einige Möglichkeiten:

* Animation + Transparenz
* Roter + Blauer Schläger, obwohl nur eine Textur vorhanden ist (färben)
* Sound

Man kann im OnCreate clientwidth und clientheight benutzen, während der Laufzeit sollte man jedoch auf Engine.width und Engine.height zurückgreifen, da es sonst bei anderen Auflösungen zu Problemen kommt.

Weiterhin habe ich einen Bug gefunden, und zwar werden Animationen bei größerer Auflösung langsamer abgespielt, ich hoffe, das bald fixen zu können, die genaue Ursache ist mir noch nicht bekannt (falls sie jemand kennt....), die betroffene Unit ist UObjects.pas


mfg

und hier noch einmal pong im binärformat:
(Man sollte einfach mal nen Ball durchlassen, dann sieht man eine Explosion am Kollisionspunkt ;) - das spiel ist auch nicht ganz bugfrei, ist halt nur ne demo die ich eben geschrieben habe, das ganze wird noch erweitert, vielleicht ein hintergrund aus tiles oder so, mal schauen, erstmal bugs fixxen ;))

//EDIT: Bug gefixt, neue version der engine oben, demnächst wird's von der demo auch ne neue version (bin + source) geben, mit ohne bugs und mehr features ;)


JayEff - Di 04.07.06 17:35

Super sache, ich benutze die Engine, um mein "Fangen" spielchen zu überarbeiten ^^ Funktioniert schon fein, nur, kann ich einem TSimpleObject eine transparenz bekommen? Also, in einem Spiel treffen sich Bälle, deren Texturecken schwarz sind und sich überlappen. Dadurch sieht man in einem der Bälle plötzlich ne schwarze ecke und das is .. nicht fein.
Ausserdem, wie könnte ich wohl am besten eine Textausgabe regeln? Mit TSimpleObjects für jeden Buchstaben? -.-


F34r0fTh3D4rk - Di 04.07.06 17:43

Textausgabe hat noch net so recht gefunzt, alphatest machst du so:

Delphi-Quelltext
1:
2:
  SO.alphatest := true;
  SO.alphatolerance := 0.8// mal biss rumprobieren, mit 0.8 sollte es auf jedenfall gehEN, am besten weniger nehmen, aber sobald man einen weißen rand sieht, ist der wert zu tief


dabei muss das bild einen alpha kanal haben (tga oder so)

farbalpha gibts noch nicht, dann müsste ich für die texturen eine oop variante benutzen, wird es vielleicht in der übernächsten version geben ;)


JayEff - Di 04.07.06 17:52

Danke werds probieren. Und danke auf, für diese tolle engine, die so verdammt leicht zu bedienen ist! (wow) Ich bleib up-to-date und hoffe, du schaffst das mit der Textausgabe, denn irgentwie muss ich bissl was ausgeben... Kleine frage hätt ich noch: ..Mir liegts auf der zunge.. wtf.. ach ja. warum müssen sämtliche Texturen im Power-of-two Format sein und warum hab ichs nich hinbekommen, kleinere texturen als 256x256 zu basteln? Wie kann ich dann rechteckige objekte darstellen, ohne dass deren textur verzerrt oder so ist? Bsp: will ein Menü mit Buttons machen, die sind rechteckig. Liegen als jpg vor. Auf den buttons steht dann eine Beschriftung. Die wird aber dann wohl verzerrt, weil die jpg ja in einem quadratischen Format vorliegen muss...?

Edit: Ab einer alphatolerance von 0.998 wird das Objekt entweder komplett schwarz oder unsichtbar. Alles (inklusive werte unter 0) haben keinerlei einfluss. 8(
Edit2: Ich depp ^^ Ok habs kapiert. wenn ich transparenz will: TGA benutzen -.-


F34r0fTh3D4rk - Di 18.07.06 14:51

So, neue Version

Was sich geändert hat:


Delphi-Quelltext
1:
Engine := TEngine.Create(false);                    


Der Paramter gibt an, ob das Programm im DEV Modus gestartet werden soll oder nicht, also ob eine Log Datei geführt wird oder nicht. (später werden dadurch wohl noch fehlermeldungen etc verwaltet werden)

Animationen sollten jetzt Fehlerfrei funktionieren und aussehen (bitte testen ;) ich hab nur einen Rechner)

ja und mit Engine.DoFullscreen kann man in den Vollbildmodus wechseln,
vielleicht kann mir jemand sagen, warum er die beiden befehle borderstyle und das formstyle net mag, weil dann zeichnet er nichts mehr, ansonsten muss diese prozedur genommen werden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TEngine.DoFullscreen;
begin
  with Form do
  begin
    //Ecke oben links
    top := 0;
    left := 0;
    //Volle Größe
    clientwidth := screen.width;
    clientheight := screen.height;
    //Status maximiert
    Windowstate := wsMaximized;
  end;
end;

dann ist das fenster aber nicht stayontop und der rahmen ist auch noch da

Besonderen Dank an GTA-Place, er hat die units besser Strukturiert und mir dadurch erheblich Arbeit gespart.

Eine neue Version ist schon in Arbeit, dort wurden ein paar Vererbungen getätigt, um alles was doppelt war auszurotten. an ner particle engine, sowie einem selektionsmodus hab ich mich schon versucht, aber das hat beides bisher noch nicht ganz glatt funktioniert, aber das wird noch ;)

Ach ja, eine StateMachine (fertig) wird auch ein bestandteil der nächsten version sein (lässt einen zwischen beliebigen modi unterscheiden, zB menu, ingame, credits, highscore)

ebenfalls wird es möglich sein, auf einfache weise, texturen zu kacheln

beim nächsten release werde ich hoffentlich auch gleich ein ganzes paket an beispielen hinzupacken können, da das release erst erfolgt wenn alles stabil läuft und text auch funktioniert.

die vollbild funktion wird im nächsten release auch funzen

mfg


F34r0fTh3D4rk - Mo 31.07.06 21:02

ok das erste mal, dass die partikel engine so halbwegs korrekt läuft, bzw das erste mal sieht man was ^^ da kann ich auch gleich als kleines preview mal was posten:

http://exec-dev.de/explo.zip


oern - Mo 31.07.06 22:27

Sieht nett aus nur find ich 15 FPS auf meiner 2 GHz Maschine etwas gering...


F34r0fTh3D4rk - Di 01.08.06 09:43

ja es werden zu viele partikel, weil die dinger einfach net verrecken, aber ich habe das bereits gefixt, und bald kommt (wohl heute noch) eine richtige demo raus, bei der man mit dem partikel system ein wenig rumspielen darf ;)


F34r0fTh3D4rk - Di 01.08.06 11:30

wie versprochen, ist die Demo fertig und lässt sich hier herunterladen:

http://exec-dev.de/ParticleEngine_DEMO.zip

einen screenshot gibt es auf der hauptseite zu sehen:

http://www.exec-dev.de/


oern - Di 01.08.06 19:55

Jetzt läuft es vernüftig (30 FPS) Screenshots sehen super aus, und auch meine partikel gefallen mir :D


F34r0fTh3D4rk - Di 01.08.06 21:00

screenshots kann man btw mit f5 auch selbst machen, nur muss das zeichenfenster den fokus haben. mit anderen texturen lassen sich noch ganz andere effekte erstellen, das ist ja nur ein ganz kleiner ausschnitt :P


F34r0fTh3D4rk - Sa 23.09.06 14:40

da die engine sich schon lange in diesem stadium (leider immernoch ohne textanzeige) befindet und ich nicht die Zeit finde, demos und eine Dokumentation zu schreiben, hänge ich hier mal die aktuellste version an. hoffe mit der stimmt soweit alles.

größte neuerung ist wohl die partikel engine, hier eine Demo:
http://exec-dev.de/ParticleEngine_DEMO.zip

mit ihr lassen sich ansehnliche effekte erzeugen:

user defined image

user defined image

user defined image

Screenshot und Vollbildfunktion sind jetzt auch Fehlerfrei integriert.

hier noch andere neuerungen die ich vor einiger zeit mal im ee-lemmings forum gepostet habe:
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:

...
Das Koordinatensystem beginnt wieder oben links ^^

sinnvoll wäre das einbinden folgender units:

Delphi-Quelltext
1:
2:
3:
4:
5:
  F2D_Core,
  F2D_Objects,
  F2D_Vectors,
  F2D_ParticleEngine,
  F2D_Text;  //ist noch ziemlich leer ^^



Delphi-Quelltext
1:
2:
var
  Engine: TEngine;


Erstellen / Initialsieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TMainForm.FormCreate(Sender: TObject);
begin
  Engine := TEngine.Create(false);  //true für das schreiben einer logdatei

  with Engine do
  begin
    Init(self);
    TextureManager.AddTexture(extractfilepath(paramstr(0)) + 'tex\Fire.bmp''fire');
    SoundManager.AddSound(extractfilepath(paramstr(0)) + 'sound\music.mp3''music');
  end;
{...}


//Zeichnen Etc

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TMainForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
  Engine.DoBegin;

  obj.Draw(true);
  Emitter.Render;

  MainForm.Caption := 'FPS: ' + inttostr(round(Engine.FPS)) + ' | Particle Count: ' + inttostr(Emitter.NumParticles);
  Engine.DoEnd;
  Done := false;
end;


die objekt sortierung ist erstmal wieder draußen, wer alpha nutzen will, muss dann seine objekte auch in der richtigen reihenfolge zeichnen um den gewünschten effekt zu erzielen

mit Engine.x y kann man die kameraposition verschieben, mit Engine.zoom ist auch zoom möglich.

UPDATE: ich hab der SoundUnit noch ein paar kleine random funktionen verpasst, um die musik später per zufall abspielen zu können.

UPDATE: die soundengine um 2 weitere funktionen und eine property erweitert count getsoundindex und getsoundname


EDIT: So am Anhang jetzt auch eine Demo mit Quelltext, viel Spass damit.

mfg


JayEff - Sa 23.09.06 15:13

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:

Das Koordinatensystem beginnt wieder oben links ^^

Heist das, ich muss mein Progamm umschreiben, wenn ich die Engine update? :crying: Die Partikel würd ich schon gern einbauen... mal sehn, ich werd erstmal die alten Engine daten Backupen bevor ich update... ^^

edit: Alle nicht in Kompilierter Form forliegenden Units erzeugen bei der Demo "Datei nicht gefunden: UTools.dcu", genauso wie F2D_Math.dcu, die scheints neu dazu gekommen ist >.< was für nen shice. Nun muss ich die meisten Dateien einzeln einbinden und dadurch kompilieren..

Edit:
Hab nun bisschen rumgespielt und eine kleine aber hübsche Spielerei zu stande gebracht. Wenn man die Endung in .scr ändert, kann man sogar nen Bildschirmschoner draus machen, hab aber kein Optionsmenü oder sowas drin, genausowenig wie eine Parameterabfrage, also nicht wundern. Ist nur zum angucken gedacht ^^
Hoppla, ich sollte meinem Anhang vll noch die bass.dll und spark.bmp hinzufügen... fixed.
edit: kleiner bug wurde geändert, Farben auch. sieht jetzt schöner aus ^^


F34r0fTh3D4rk - So 24.09.06 09:13

das mit dem koordinatensystem ergab sich aus der struktur von TBitmap und dem Lemmingsprojekt, und eine völlige Konfusion meinerseits ^^ ich musste auch ein ganzes Stück umschreiben, aber ich hoffe es klappt alles.

noch eine kleinigkeit zur demo, mit f2 kann man reinzoomen und mit f1 wieder raus, mit f5 macht man einen screenshot.


WOW JayEff, das sieht einfach nur beeindruckend aus, wie ein trichter :shock: teilweise auch richtig schöne welleneffekte. ich hab grad auch schon wieder ein paar schicke ideen bekommen ;) zb die eingangs / ausgangsfarben zur laufzeit zufällig zu blenden oder ein feuerwerk zu machen. die möglichkeiten sind halt groß. graviation werde ich vielleicht noch mal einbauen, beliebige keyframes dann wohl als nächstes. aber ich denke nicht, dass es attraktoren oder reflektoren oder so geben wird, denn ich wüsste nicht, wie ich das am geschicktesten implementiere...

naja durch andere texturen lassen sich auch nochmal andere effekte erzielen (rauch) da macht es sinn zwischendrin den emissionswinkel zufällig zu wählen (zb bei jedem durchlauf)

mfg


JayEff - So 24.09.06 14:51

Auf die art kann ich bei FangenV2 viel geilere Effekte machen, wenn du z.B. ein Extra eingesammelt hast! :shock: idee! :D


Fabian E. - Do 28.09.06 16:39

Schon geil die Efeekte aber ich habe ein problem: weiß nich ob ich mich einfach zu dumm anstelle oder was aber es geht jedenfalls nich so wirklich!
Könnt euch den screenshot ja ma angucken!
Glaub es liegt an der onIdle prozedur bin mir aber nicht ganz sicher!
Danke!


JayEff - Fr 29.09.06 01:11

Sorry aber mit der Fehlermeldung können wir genausowenig anfangen wie du. Die Frage wäre der Code, der sie auslöst... Übrigens kannst du dazu einen eigenen Thread machen ;) die Mods sehen es nicht gern, wenn so verwirrende Threads entstehen die halb Programmvorstellung halb Frage sind.


F34r0fTh3D4rk - Fr 29.09.06 15:23

wenn du ne log datei mit erstellst kannst du in der gucken ob vor einem dateinamen ein X ist, dann kann er die datei net finden, ansonsten guck mal, ob du die bass.dll reingepackt hast, und ob du die aktuelle version von fear2d besitzt, ebenso, gibt es für die neue version kein template, dafür gibt es eine demo für die partikel engine.

mfg


Schüler - Fr 29.09.06 15:49

könntest du vieleicht mir einmal die Ganzen funktionen erkären wie ich etwas erstelle und so weiter? wäre echt nett.
Edit: habe noch ein Problem wenn ich die Template starte (habe noch nichts eigefügt) sagt er
[Fataler Fehler] F2D_Core.pas(14): Datei nicht gefunden: 'dglOpengl.dcu'


F34r0fTh3D4rk - Fr 29.09.06 16:18

die dglopengl.pas, bass.pas. bass.dll und glbitmap.pas müssen noch eingefügt werden.

und mal eben alle funktionen zu erklären, ist net so leicht, ich wollte eigentlich zu allem mal eine kleine demo schreiben und eine gesamt dokumentation, sowie tutorials, aber ich komme net dazu, vor allem, da ich jetzt erstmal noch dran arbeite ;)


Schüler - Fr 29.09.06 16:28

ok und wo finde ich die oben genannten sachen?


F34r0fTh3D4rk - Fr 29.09.06 16:36

steht alles im ersten beitrag, oder in der readme, in der version von meiner page

hier eine demo, die die kommende version der partikel engine zeigt:

http://www.exec-dev.de/particle_demo_2.zip


JayEff - Sa 30.09.06 00:41

Sieht gut aus - aber die alte art von partikelemmission wirds auch noch geben, oder? also einfach nur kreisförmig um einen Punkt herum. Am besten sollte man zwischen beiden wechseln können ^^


F34r0fTh3D4rk - Sa 30.09.06 10:29

probiers doch aus, stelle doch mal width auf 0


Danny87 - So 01.10.06 03:36

ich hab en kleines problem.
beim compilieren meldet er mir in der F2D_Core.pas
Zitat:
[Fatal Error] F2D_Core.pas(20): File not found: 'F2D_StateMachine.dcu'


eine ahnung wie ich die erstellen lassen kann?

//EDIT: Sorry, war doof. Habs schon hingekriegt

Gruss
Daniel


F34r0fTh3D4rk - So 01.10.06 13:40

Ich hab zur Demo der Partikel Engine mal einen extra Thread aufgemacht:

http://www.delphi-forum.de/viewtopic.php?t=65023

mfg


Leuchtturm - So 01.10.06 17:54

Hi,
Erstmal ein großes Lob an dich.
Aber:
Bei mir kommen die Fehler:
Fehler in F2D_SoundFX.pas hat folgendes geschrieben:
[Fehler] F2D_SoundFX.pas(200): Undefinierter Bezeichner: 'BASS_ChannelSetFlags'
[Fehler] F2D_SoundFX.pas(203): Undefinierter Bezeichner: 'BASS_ChannelPlay'

bei dem Code(also wenn ich die Engine initialisiert habe):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
unit fear2d;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, F2D_Core;

type
  TForm1 = class(TForm)
  procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Engine: TEngine;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Engine := TEngine.Create;
  Engine.Init(self);
  Application.OnIdle := ApplicationEventsIdle;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Engine.Free;
end;

procedure TMainForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
  Engine.DoBegin;
  Engine.DoEnd;
  Done := false;
end;

end.


Bass.dll ist im Ordner und auch im Delphi-Bibliothespfad
An was liegt das?
Leuchtturm


F34r0fTh3D4rk - So 01.10.06 17:58

die bass.pas auch ?


Leuchtturm - So 01.10.06 18:03

Danke
Nein die war nicht drin jetzt gehts soweit.


Fabian E. - So 01.10.06 21:11

So, hab en bissel rumgemacht un festgestellt dass es eindeutig an dem befehl

Delphi-Quelltext
1:
Emitter.Render                    

liegt!
Ka warum! Vllt kann mir ja jemand helfen!Werd auf jeden mal ne log-datei schreiben lassen.


F34r0fTh3D4rk - Mo 02.10.06 10:53

dann wird er wohl eine textur net geladen haben und beim zeichnen probleme bekommen ;) check mal die log datei


JayEff - Mo 02.10.06 12:55

user profile iconBigboss hat folgendes geschrieben:
So, hab en bissel rumgemacht un festgestellt dass es eindeutig an dem befehl

Delphi-Quelltext
1:
Emitter.Render                    

liegt!
Ka warum! Vllt kann mir ja jemand helfen!Werd auf jeden mal ne log-datei schreiben lassen.

Soweit ich weis produziert die Fear2D engine auf jeden fall eine Log datei... Aber um etwas genauer auszuführen, was Fear schreibt: Wenn du Engine.TextureManager.AddTexture machst, wird nicht überprüft ob die datei existert. erst, wenn sie benutzt wird, also in der Emitter.Render; procedure, bemerkt er, dass was nicht stimmt. vielleicht hast du die Texturdatei falsch getippt, vielleicht eine falsche Pfadangabe (Fear lagert die Texturen immer in tex\datei.jpg aus)?


F34r0fTh3D4rk - Mo 02.10.06 14:20

es wird schon geprüft ob die datei existiert, das ist ja das was in die log datei kommt ;) nur auf eine nicht existente textur zuzugreifen macht probleme


Fabian E. - Mo 02.10.06 14:28

mein gott! ich bin so doof!
Wollte ein neues template machen un da hab ich halt ma grad das texturen laden rausgelassen! :lol: hät auch selber drauf kommen können das der die ja zum rendern braucht! Sorry! :oops:
Denk ma das sollte jetz klappen!
Danke!


Leuchtturm - Mo 02.10.06 16:43

Emitter ist ein undefinierter Bezeichner. Fehlt da eine Unit:

Delphi-Quelltext
1:
2:
uses
...F2D_Core, F2D_Objects, F2D_Vectors, F2D_ParticleEngine, F2D_Text, F2D_TextureManager;

oder ist das eine Variable :?:


F34r0fTh3D4rk - Mo 02.10.06 17:10

probier mal TParticleEmitter, oder zeig mal bissl mehr source :wink:


Leuchtturm - Mo 02.10.06 17:22

Hier ist der Code

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
  Engine.DoBegin;
    Obj.Draw(true);
    Emitter.Render;// hier kommt der Fehler
  Engine.DoEnd;
  Done := false;
end;


FEHLER hat folgendes geschrieben:
[Fehler]fear2d.pas(46):Undefinierter Bezeichner: 'Emitter'

Ich hoffe das hilft
Leuchtturm


F34r0fTh3D4rk - Mo 02.10.06 18:03


Delphi-Quelltext
1:
2:
var
  Emitter: TParticleEmitter;


Leuchtturm - Mo 02.10.06 18:10

Danke, so funktionierts jetzt, doch jetzt kommt ein Fehler nach dem starten in Form eines ShowMessages - Dialogs:
Zitat:
Zugriffsverletzung bei Adresse 00476A3E in Modul 'Fear2D.exe'. Lesen von Adresse 00000020.

Was stimmt jetzt nicht?
Projekt im Anhang


F34r0fTh3D4rk - Mo 02.10.06 18:30

guck dir die log datei an, ob er ne textur net laden konnte


Leuchtturm - Mo 02.10.06 18:36

Aus der LOGDatei kann ich nichts lesen(ich zu dumm :?: )
LOGDatei im Anhang


jakobwenzel - Mo 02.10.06 18:55

Erstmal: super Engine!
Ich hätte da aber noch eine Idee:
Wie wäre es, wenn nicht-POT-Texturen automatisch beim Laden in ein Bild mit der nächstgrößeren POT einkopiert werden würden (sodass da dann ein Rand), und dann beim anzeigen der Rand halt weggelassen werden würde?
Alternativ könnte das Bild auch auf die nächste POT gestreckt werden, wobei dann halt die Qualität leidet.


F34r0fTh3D4rk - Mo 02.10.06 20:25

könnte man machen, aber das ist für die vielen unterstützen formate net sooo einfach, ich wollte vielleicht die texturen auf oop umstellen, ist aber auch net so leicht, dann könnte man auch alpha channel hinzufügen etc...

@leuchtturm: ich guck mir das morgen mal an, wenn ichs schaffe



mfg


JayEff - Di 03.10.06 01:39

Logdatei:
- Datei: C:\Programme\Borland\Delphi7\Projects\Fea

Ich weis nicht, was das "-" bedeutet, aber der Dateiname ist echt interessant... Hast du tatsächlich sowas geschrieben hier: Engine.TextureManager.AddTexture('C:\Programme\Borland\Delphi7\Projects\Fea', wiki);? Weil wenn ja, dann kann da was nich stimmen...


F34r0fTh3D4rk - Di 03.10.06 11:42

der strich bedeuted garnix, aber ob da ein O oder ein X steht sagt einem, ob die Datei existiert oder net :D

ich glaube der fehler liegt daran, dass du dem emitter keine textur (und auch sonst keine eigenschaften) zugewiesen hast, der weiß ja garnet was er machen soll ;)

mfg


Leuchtturm - Di 03.10.06 11:43

Nein ich habe das geschrieben:Engine.TextureManager.AddTexture(extractfilepath(paramstr(0)) + 'tex\wiki.jpg''wiki'); und die Textur ist auch vorhanden.

Wie soll man dem Emitter etwas zuweisen das habe ich jetzt nicht verstanden


F34r0fTh3D4rk - Di 03.10.06 11:48

zB so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
  Emitter := TParticleEmitter.Create(Engine);
  with Emitter do
  begin
    position := to_v2d(Engine.width / 2, Engine.Height / 2);
    angle := 90;
    emissionangle := 360;
    Emissionfrequency := 20;
    ParticlesPerEmission := 8;
    Texture := 'spark';
    LifeSpan := 2500;

    Duration := 2500;

    width := 0;


    velocity := 100;

    z := 1;

    with LifeBegin do
    begin
      alpha := 255;
      size := to_v2d(5050);
      color := clwhite;
    end;

    with LifeEnd do
    begin
      alpha := 0;
      size := to_v2d(7575);
      color := RGB(2551250);
    end;    
  end;

wobei es die markierten teile in deiner version noch net gibt, die geschwindigkeit (velocity) gibts dann aber bei LifeBegin und LifeEnd, in der nächsten version wirds auch beschleunigung geben und ich hoffe mal, dass ich auch reibung hinbekomme.

mfg


Leuchtturm - Di 03.10.06 11:56

Bringt bei mir den gleichen Fehler wieder.
Die Textur wird geladen(LogFile:O am Anfang)
PS:Das Programm muss immer gewaltvoll beendet werden.

Ich habe mir gerade die Demo angeschaut und gemerkt das Es keine UTools.dcu gibt.
Wo bekommt man die her


F34r0fTh3D4rk - Di 03.10.06 13:15

das ist mein formular, das hat da nix verloren ^^ schwirrt hier im thread nicht noch eine alte version der partikel demo mit source rum ? dann probier die doch mal aus ;)


Leuchtturm - Di 03.10.06 15:31

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
das ist mein formular, das hat da nix verloren ^^ schwirrt hier im thread nicht noch eine alte version der partikel demo mit source rum ? dann probier die doch mal aus ;)


Bei der ist es das selbe Problem :wink:
Die UTools.dcu fehlt :(
Leuchtturm


Fighter#1 - Di 03.10.06 16:07

Hallo,
Hab wiedermal ein Problem :
Ich möchte die FindComponent funktion nutzen, nun kommt dass TSimpleObject nicht zu TComponent gehört ... das versteh ich ja, nur wie könnte ich es hinzufügen bzw. Gibt es eine Äquivalente funktion die auch mit SimpleObject funktioniert ?
MfG Fighter#1


Shaddow89 - Di 03.10.06 16:08

Ich find dei Engine auch sehr gelungen. Macht einiges einfacher. Kann man denn schon fonts einstellen? vllt fonts über ein eigenes fontsys laden.
Wäre ja ne idee
Geht ganz einfach


GTA-Place - Di 03.10.06 16:10

user profile iconFighter#1 hat folgendes geschrieben:
Hallo,
Hab wiedermal ein Problem :
Ich möchte die FindComponent funktion nutzen, nun kommt dass TSimpleObject nicht zu TComponent gehört ... das versteh ich ja, nur wie könnte ich es hinzufügen bzw. Gibt es eine Äquivalente funktion die auch mit SimpleObject funktioniert ?
MfG Fighter#1

Ich mach grad ne richtige Komponente draus (so zum aufs Form ziehen) und da werde ich die ganzen Objekte von TComponent ableiten. Dann sollte es funktionieren.


F34r0fTh3D4rk - Mi 04.10.06 15:55

dann hast das ganze formular voll mit objekten, mach doch eine art objekt liste als klasse, die alle arten von objekten speichern kann.

fonts gibts leider noch net ;)

mfg


Leuchtturm - Mi 04.10.06 16:14

Wie kann man objekte bewegen?? Mit *.moveX funktionierts nicht :nixweiss:
Leuchtturm
Edit: habs selber rausgefunden:

Delphi-Quelltext
1:
"objekt".position.x := "objekt".position.x := + 1;                    


JayEff - Mi 04.10.06 17:14

user profile iconShaddow89 hat folgendes geschrieben:
Kann man denn schon fonts einstellen?

Fonts? Meinst du schriftarten oder steh ich aufm schlauch :roll: naja, es gibt noch keine Möglichkeit, Text auszugeben, wozu also eine Schriftart einfügen ... oder was kann das Wort "Font" denn noch heißen? (nix weiß :oops:)


Shaddow89 - Mi 04.10.06 21:46

Ja ich meine schon Fonts laden und benutzen als ausgeben.
Also ich habe mir zb in meiner Engine einen Fontmanager geschrieben, der selbst ohne WindowsLibs die Pixelweite der Strings ermitteln kann. Das ist zb Wichtig, wenn man Strings in OGL richtig positionieren will und wenn man OSunabhaengig schreiben will, darf man nicht die TextWidth von Windows nehmen. Deswegen habe ich mir diese Funktion für Width und Height selber geschrieben.

Wer weiss, wie man mit OGL Texte erzeugt, der weiss, dass es nicht schwer aber etwas umstaendlich ist.
Bei mir reicht Fontmanager.Draw('FpsFont', inttostr(Fps)+' Fps', 100,100);

Dieser Befehl gibt den Text inttostr(Fps)+' Fps' mit der als FpsFont deklarierten (per Fontmanager.AddFont(FontPfad, FontName);) Font an die PixelPosition X=100 Y=100

Das ist denke ich, sehr komfortabel.

Geht genauso bei der integrierten ParticleEngine.



Kann man sich ja vllt dran orientieren

PS: Werde vllt die Tage mal meine Engine auch vorstellen ;)


F34r0fTh3D4rk - Do 05.10.06 14:41

hi, ich hatte mal eine textausgabe, man konnte fonts laden und abrufen, aber irgendwas lief da schief, sodass immer falsche zeichen angezeigt wurden, ziemlich strange ;) dann wollte ich auf texture fonts umsteigen, aber das hab ich auch noch net so ganz ^^


Leuchtturm - Sa 07.10.06 10:54

Hi,
kann mir mal einer den Code für die Particels geben bei mir sehen die so aus:(Anhang)
Wie bekommt man die so fein hin :?: :gruebel:


F34r0fTh3D4rk - Sa 07.10.06 11:48

bei dir wurde einfach eine falsche textur geladen, überprüfe mal ob alle texturnamen etc korrekt sind, ansonsten lädt der nämlich die textur, die zuletzt im speicher war und die sieht mir fast so aus wie die deiner schläger.

mfg


Leuchtturm - Sa 07.10.06 13:05

danke daruf hätte ich auch selber kommen können :oops:


en!gma - So 08.10.06 17:48

ist die engine eigentlich schon realtiv fertig?
oder sollen noch neue viele funktionen dazukommen?
darf man fragen für was für ein spiel das sein wird?

//edit:

ich vollidiot :P
steht ja sofort ist noch im anfangsstadium....
aber auf jedenfall sehr sehr geile engine...
irgendwie würd ich lieber lernen selbst eine zu schreiben, aber wenn man schon so eine gute 2d engine vor sich liegen hat, warum nicht diese nutzen ;)


F34r0fTh3D4rk - So 08.10.06 17:52

die particle engine wird noch stark erweitert und zu den einzelnen modulen werden noch eine menge funktionen hinzukommen, und text anzeige, dann können wir von "fertig" sprechen ;)


mfg


en!gma - So 08.10.06 18:02

errm...
sie haben post :D


en!gma - So 03.12.06 15:33

schade, wird vorerst nichts mehr dran gemacht?

aber könnte nochmal jemand das template für mich hochladen pls?
weil bei der aktuellen version ist nur eine demo bei.
oder ist das das template?
denke nicht oder?


F34r0fTh3D4rk - So 03.12.06 18:01

du kannst aus der demo alles rausnehmen was du nicht brauchst, dann hast du ein template ;) im moment arbeite ich nicht an der engine weiter, da ich einen abstecher in die 3d welt gemacht habe und da jetzt so ein wenig mein wissen vertiefen möchte, wenn ich die zeit finde werde ich als nächstes mal was mit shadern probieren, vielleicht könnte man da den einen oder anderen coolen effekt in die engine einbauen.

mfg


Leuchtturm - So 03.12.06 18:21

Und falls dus noch brauchst. Hier ist es


en!gma - So 03.12.06 18:56

perfekt danke...
das sollte es erstmal tun.
muss mich da bloss erstmal reinlesen was wo reinkommt ;)


F34r0fTh3D4rk - So 03.12.06 19:55

je mehr man selbst macht, desto mehr lernt man


en!gma - So 03.12.06 20:06

jap ich finde grade alles so langsam raus,
nur aus der demo nen template zu erstellen...
weiss nicht die dateiverweise oder sowas sind/waren da ganz komisch.
hab ich damals versucht und bin nicht wirklich klar gekommen.
aber jex krieg ich schon recht einfache sachen hin.

und macht auf jedenfall schonmal lust auf viel mehr :P


F34r0fTh3D4rk - So 03.12.06 20:16

martok hat eine version gemacht, mit text und auch 2 ui elementen, vielleicht veröffentlicht er den code, das wäre auch mal was ;)

mfg


en!gma - So 03.12.06 20:43

na des fänd ich auch mal gut ;)

hab nur grad schon etwas probleme mit dem alpha krams...
bzw scheint das mit z nicht wirklich zu funktionieren hier.

ich habe ein hintergrund bild als tga und einen charakter als tga datei.
stell ich alpha bei dem männchen aus, sehe ich den blauen hintergrund.
naja und beim hintergrundbild, sobald ich alpha ausmache, überdeckt es mein männchen obwohl
der hintergrund z=0 hat und das männchen z=1...
achja und wenn cih bei beidem alpha=true setze, dann scheint das hintergrundbild trotzdem durch mein männchen durch :/


F34r0fTh3D4rk - So 03.12.06 20:46

du musst bilder mit alpha von hinten nach vorne sortieren, also das transparente bild was am meisten vorne ist zuletzt zeichnen, aber eigentlich sollte es damit keine probleme geben ... zuerst hatte ich eine prozedur zum sortieren drin, aber die war überflüssig geworden.


en!gma - So 03.12.06 21:40

naja funktioniert zwar immernoch nicht so wirklich, mein männchen ist immernoch etwas transparent,auch wenn ich es als letztes zeichne,aber dazu komme ich später noch einmal.
ich werd mich mal an einem ganz einfachem spiel versuchen jex


en!gma - So 03.12.06 23:10

so habe mal was wirklich einfaches ausprobiert.
nicht böse sein ist nicht komplett und die meisten wollen mich am liebsten dafür auslachen ;)

aber hab noch nie sowas wie spiele programmierung gemacht und möchte mich halt etwas langsam rantasten.
und bevor ich wild hin und herprogrammier, lass ich es lieber langsamer angehen und versuchs dann sofort sauber zu machen...

hab halt nen kleines pong ohne punktestand und ohne wirkliche kollisionsabfrage, halt nur die x position...
aber der ball is halt nen emitter...
aber wie mache ich das am besten, dass eine emitter animation nur 1x abgespielt wird?
die emission time auf 5000 oda so setzen und bevor es nochmal angezeigt wird wieder destroyen?
und was ich auf jedenfall sehr hilfreich fände,
halt eine funktion die die emitter aus dateien ausliest.
erspart auf dauer wohl ne menge code...
aber wird wohl schon irgendwann, werds mir noch etwas anschauen ;)

und hab grad sogar rausgefunden wie man sounds abspielt,
sehr praktisch!


Martok - Mo 04.12.06 00:30

Natürlich F34r, bin nur noch nicht dazu gekommen.

Also. Meine Änderungen betreffen bis auf die Text und UI-bezogenen Änderungen wirklich nur den Unterbau, d.h. nur die Units austauschen, fertig.

Was ich wichtig finde, ist die Einstellung des Ursprungspunktes über Ofs.x/y. Damit muss sich die Koordinatenangabe nicht mehr unbedingt auf den Mittelpunkt beziehen, sondern auf einen beliebigen Punkt im Bild. {komischer Satz, ich hoffe ihr versteht mich...}

Achso, und die nicht wirklich konsequente Vererbungshierarchie hab ich in Ordnung gebracht, da sonst die UI-Elemente fast unmöglich gewesen wären ;)

Auch wenn das ja hier eher selten ist: ich hoste mal was selber ;)

http://www.martoks-place.de/delphi/opengl/fear2d/

EDIT: an neue Domain angepasst


en!gma - Mo 04.12.06 07:08

ah kuhl danke ich schau später mal etwas genauer rein und hoffe, dass ich irgendwas verstehe :)


en!gma - Mo 04.12.06 20:12

so hab grad noch ein bischen rumgespielt...
und ich möchte versuchen noch ein paar funktionen in die engine einzubauen.

habe so an folgendes gedacht: (auch wenn ich selbst nicht alles umsetzen kann)

loadEmitterFile(file,name:string) <-- also ähnlich wie sounds und texturen
loadEmitterDir(file:string)
SpawnEmitter(name:string, x-pos,y-pos,angle:integer,loop:boolean)<-- also dass ein emitter an einer bestimmten stelle gespawned wird

und dann hatte ich noch 2 funktionen die ich um himmels willen nie umsetzen könnte ;)

morphEmitter(emitter1,emitter2:string;time:integer) <-- soll in einem bestimmten zeitrahmen, und zwar "time" einen emitter langsam zu einem anderen werden lassen, also was grösse usw angeht

und dann noch etwas "ganz feines" und zwar multiemitter!
das ganze habe ich mir so vorgestellt:
man hat eine ini datei, ähnlich wie bei loadEmitterFile() nur das besondere.
man hat ein main emitter und diverse childs...
die childs sind eigene emitter und haben eine position +-x/y von dem main emitter.
also das man 2 oder mehr emitter leicht über den bildschirm wandern lassen kann
und somit superschöne animationen ;)

aber was ich mich die ganze zeit frage...
für das loadEmitterFile/Dir, erstelle ich wohl eine neue Klasse dafür?
habe einfach mal eine angehängt, würde die dann ca so aussehen?
habe sie von SoundManager abgewandelt und nach möglichkeit schon ein paar variablen und kommentare angepasst.
oder packt man das ganze doch lieber in die particleengine.pas?

naja die sachen von mir...
und wie gesagt hab etwas rumgespielt und ist das hier mal rausgekommen.

mit "pfeil-hoch" lädt man die kugel auf, mit "pfeil-runter" schiesst man sie ab.


F34r0fTh3D4rk - Mo 04.12.06 20:15

die features hatte ich alle bereits geplant aber noch net umgesetzt ;)


en!gma - Mo 04.12.06 20:18

aso hatte mich schon gewundert warum es noch nicht drin war ;)
es is ja schon eigentlich in der demo drin.
halt nur mit multi emitter noch nicht,
und morph fänd ich auch fett ;)

aber machst du dafür extra ne neue klasse?
und besteht denn wohl noch die chance, dass du es umsetzt?


F34r0fTh3D4rk - Mo 04.12.06 20:41

die sache mit dem multi emitter ist net so leicht, das ist ja kein record sondern eine klasse da muss man schon ein bissl fummeln sonst ist alles was man braucht in der unit und morphen ist dreisatz ;)

kommt auch schon drin vor, bei den farben, da steht interpolieren oder so drüber ;)

mfg


JayEff - So 24.12.06 14:24

user profile iconMartok hat folgendes geschrieben:

Also. Meine Änderungen betreffen bis auf die Text und UI-bezogenen Änderungen wirklich nur den Unterbau, d.h. nur die Units austauschen, fertig.

Toll! Klasse! Ähm ... wie ... lass ich mir nen Text ausgeben? In der F2D_Text sind keine Methoden zur Textausgabe enthalten... ? Eine .. winzig kleine Dokumentation wär toll, oder eine kleine Demo ... :)


Martok - So 24.12.06 16:37

Also Dokumentationen wirst du von mir nie sehen, jedenfalls bei den meisten Projekten :P

Eigentlich läuft die Textausgabe nicht viel anders als die Texturierung zum Beispiel: Laden->Binden->Zeichnen. Ich hab mal ne Demo gemacht, ist oben angehängt. Außerdem hab ich die Engine nochmal modifizert, da war noch was in der Multiline-Ausgabe komisch.
Richtige Bitmap-Fonts müsste auch mal einer machen *pfeif*.....


jakobwenzel - So 24.12.06 17:29

Für meine Ogl-GUI benutz ich Bitmapfonts. Da fehlt nur noch die Möglichkeit, die erstellten Fonts in der Größe zu ändern. Bis jetzt ist es so, dass bei jeder Änderung der Größe die Buchstaben neu in ein BMP gemalt werden und dann an OpenGl übergeben werden. (Oder die Buchstaben werden aus einer Datei geladen, wobei sich dann die Größe überhaupt nicht ändern lässt)
Wenn die Größenänderung drin ist, kann ichs ja auch mal hochladen.


JayEff - So 24.12.06 22:29

Im Normalfall hätt mir die Demo gereicht, aber ... :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    Engine.Init(self);

    Engine.FontManager.AddFont('myfont','arial',60,[fsItalic]);
{...}

    Engine.DoBegin;
    Engine.FontManager.BindFont('myfont',clRed);
    Engine.TextOut(10,50,'FEAR2D Demo,  (c) Martok');

Passiert nix. Nix wird ausgegeben. Ich hatte sogar mal eine art Ausgabe, allerdings schwarz auf schwarzem Hintergrund (musste mit dem Ball drüber gehn um es zu sehn ... )
Aber das geht nun iwie auch nicht mehr.

PS: Ja is kopiert.
PPS: Kannst du vielleicht eine kleine Schritt-für-Schritt Anleitung schreiben, so richtig für dummies, nach dem Stil "Schritt Eins: Fontmanager.Addfont. Beispiel: xyz... blah blah"


Martok - Mo 25.12.06 05:14

Also so wie du es da hast, sollte schon alles stimmen. Ich hab oben nochmal editiert.

Oh, doch was: da fehlt ein Engine.DoEnd, ist das Absicht?


JayEff - Mo 25.12.06 14:03

user profile iconMartok hat folgendes geschrieben:
Also so wie du es da hast, sollte schon alles stimmen. Ich hab oben nochmal editiert.

Oh, doch was: da fehlt ein Engine.DoEnd, ist das Absicht?

Ja, das hab ich nu nich übernommen, is aber drin... Aber das soll ja keine Diskusion über mein Programm bzw. meine Probleme werden ... ^^

Habe das Problem gefunden!
Ich darf keine Texturen laden, um die Textausgabe zu benutzen. Wird irgendwo im OnCreate (egal ob vor, oder nach der AddFont) Engine.TextureManager.AddTexture aufgerufen, wird keine Schrift angezeigt.
Ich hoffe, das wird bald klappen ...


Fighter#1 - Mo 25.12.06 15:37

... Juhu, endlich scheiben :-D
Ach Martok, auf deiner Homepage hast du falsch verlinkt (habs dann halt selber gesucht)


Martok - Mo 25.12.06 16:06

user profile iconFighter#1 hat folgendes geschrieben:
... Juhu, endlich scheiben :-D
Ach Martok, auf deiner Homepage hast du falsch verlinkt (habs dann halt selber gesucht)

)&(/§%)/($&§& verdammte Backslashes.... wer hat die da reingeschrieben??


hui1991 - Mi 27.12.06 20:40

Hi,

warum kann ich keine Bilder größer als 64x64 Pixel laden?
Die Datei ist nur 12KB groß.
Würde gerne eine 500x160KB große datei einfügen.
Aber dann hat er 1/12 FPS oder so
Hab gedacht ich mache damit ein wenig rumspielen.
Dann ist mir aufgefallen, das die Dateien nicht größer als 64x64 Pixeln sein dürfen, weil sonst hängt sich das auf.

MfG
hui1991


jakobwenzel - Mi 27.12.06 20:55

Es kommt drauf an, ob die Bilder POT sind. Das heißt, die Seitenlängen müssen 2^x sein. Beispiel:
256x256,2048x2048,2x2,128x128,128x256,2x2048,...

Wobei ich keine Grafiken mit Seitenlängen >512 nutzen würde, da di von älteren Grakas nur selten geladen werden können.


hui1991 - Mi 27.12.06 21:13

d. h. wenn ich eine 500x160 Pixel Grafik einfügen will, muss ich die grafik auf 512X256 hoch. Ja und wie kann ich dann die Transparente Farbe einstellen. Wenn es mehr sein muss, muss ja eine Farbe z. B. rosa ja ausgeblendet werden.
Geht das irgendwie?


jakobwenzel - Mi 27.12.06 21:21

Du kannst auch einfach die Grafik strecken, anstatt einen Rand hinzuzufügen.


JayEff - Mi 27.12.06 22:32

Für Transparenz empfehle ich TGA dateien, die bringen das gleich mit.. Kleines Problem von TGAs kann man in meinem Hilfesuchenden Thread finden: http://www.delphi-forum.de/viewtopic.php?t=68011&highlight=
Das Problem wird dort beschrieben und ist noch nicht gelößt ...


hui1991 - Mi 27.12.06 23:30

Gehen gifs auch, weil die haben ja auch transparenz?
Die müssten doch auch gehen, oder?
Dann wäre dein Problem gelöst, leider hat es dann nur 256 Farben :(

MfG
hui1991


JayEff - Mi 27.12.06 23:31

Ahja. den Versuch ists wert.. nur gehört das wohl in mein Topic, nicht hier rein, oder...?


hui1991 - Do 28.12.06 23:15

Boah,

damit kann man ja keine Spiele schreiben :(
Man kann keine Transparente Farbe auswählen :(
Man kann keine Grafiken drehen.
Wollte gerade eine Grafik auf 45, 90, 135, 180, 225 Grad drehen.
Aber sonst gefällt mir das ganz gut.
Man merkt gleich am Anfang, da es nicht fertig ist :(
Muss ich wohl warten, mit Spiele Programmieren...

MfG
hui1991


Danny87 - Do 28.12.06 23:52

user profile iconhui1991 hat folgendes geschrieben:

Man merkt gleich am Anfang, da es nicht fertig ist :(
Muss ich wohl warten, mit Spiele Programmieren...


Oder Du probierst dich an "purem" Direct3D ;) *g*


jakobwenzel - Fr 29.12.06 00:01

Oder pures OpenGl, was eigentlich gar nich mal so schwer is (ich verwende Fear2D nur für die Initialisierung, den Rest mach ich manuell)


hui1991 - Fr 29.12.06 13:07

Die Frage ist halt wie das geht.
Weil Fear2D ist so wie ich es will, und nicht so schwer.
Blos da fehlt was. Îch fange letzter Zeit immer was an und stelle fest, das des nie was wird.
Dann lass ich es ruhen, und nach einer Zeit versuche ich es wieder, dann wird es wieder nix.
Und immer so weiter. Selbst BlitzBasic ist schwerer.
Naja da man da keine Proceduren machen kann.
Sondern nur funktionen :(

MfG
hui1991


Fighter#1 - Fr 29.12.06 21:13

user profile iconhui1991 hat folgendes geschrieben:
Boah,

damit kann man ja keine Spiele schreiben :(
Man kann keine Transparente Farbe auswählen :(
Man kann keine Grafiken drehen.
Wollte gerade eine Grafik auf 45, 90, 135, 180, 225 Grad drehen.
Aber sonst gefällt mir das ganz gut.
Man merkt gleich am Anfang, da es nicht fertig ist :(
Muss ich wohl warten, mit Spiele Programmieren...

MfG
hui1991


Naja, soganz stimmt das ja nicht, wie dus sagst ...
Also grafiken kann ich mit Angle sehr wohl drehen ... und wenn du mal eine minimale präsentation, was ohne viel liebe/mühe möglich an spieleprogrammierung ist sehen willst, dann schick ich sie dir ... (bin halt grad an nem Spiel) [bzw. an 2 aber 1 Projekt ist mir wohl doch zu hoch]


JayEff - Fr 29.12.06 22:35

user profile iconhui1991 hat folgendes geschrieben:
Boah, damit kann man ja keine Spiele schreiben :(

Hrm.. Ich finde, das [http://www.delphi-forum.de/viewtopic.php?t=62192] ist schon ein Spiel... und es ist mit der Fear2D engine programmiert. Tranzparenz erzeugst du durch TGA dateien, die einen Alphakanal enthalten.
Fertig ist es schon, es werden nur Features hinzugefügt, zumindest meiner Ansicht nach. Was die Engine bisher kann, reicht mir beinah (Nur die Textausgabe ... >.< )


Shaddow89 - So 31.12.06 03:58

Richtige Spiele schreiben...
Die Frage ist nun, was ist ein richtiges Spiel?
Anno? Spellforce? Call of Duty? Battelfield?
Oder doch eher Pong? Bomberman? Tetris?
Erstere Spiele werden nicht umsonst von erfahren mehrköpfigen Teams in manchmal mehrjaehriger Arbeitszeit erschaffen.
Letztere kann man jedoch problemlos auch selber erschaffen.
Um ein mittelmaessiges Spiel hinzubekommen und das allein, braucht man schon einiges und ohne das Wissen um OGL wird man nie andere Spiele als die aus der PongKategorie erstellen können, egal mit welcher Engine.
Die letzte groessere Engine, die ich gesehen habe hatte:
Core, Globals, Fontmanager, Texturenmanager, Particlemanager, physiksystem, EventManager, SelectionManager, BugTracker, XMLDataManager, Cameraklasse, Windowklasse, RenderManager, Frustum und da war noch lange nicht alles drin. Wenn eine Engine all diese Dinge enthaelt, dann kann man schon einiges machen, aber das ist halt auch alles ne Menge Arbeit. FInde die Engine huebsch, aber selber Programmieren macht mehr spass :)


en!gma - Fr 03.08.07 20:19

hi ist zwar schon etwas älter, aber kann jemand nochmal bitte ein template hochladen?
denn in der zip datei ist ja keins vorhanden.
wollte mich noch einmal daran versuchen


HelgeLange - Mi 29.08.07 10:35

wie sieht es eigentlich mit OnKlick-Routinen aus bei Grafik-Onjekten, hab mal kurz drübergeschaut, aber nix gefunden...


JayEff - Mi 29.08.07 16:39

Ich weiß nix dergleichen, habe meine OnClicks per Mausposition und onClick der Form gelöst, glaub ich...


HelgeLange - Mi 29.08.07 21:42

Dann muss man aber displaylisten nach Tiefe sortieren, oder ? Sollte man vielleicht den Komps selbst die Möglichkeit geben :p


Fabian E. - Do 01.05.08 16:22

So,

nach langer Zeit gibt es hier mal wieder einen Eintrag ;)

Ich habe grade die Units "F2D_TextureManager.pas" und "F"D_Text.pas" etwas ergänzt.
Grund dafür sind relativ große Speicherleaks bei den Texturen und Schriftarten.
Diese werden in einer Liste gespeichert, aber nur die Liste selber wird freigeben. Die Texturen/Schritarten nicht.
Die Lösung ist allerdings ganz simpel:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
destructor TTextureManager.Destroy;
var
  i                           : Integer;
begin
  // HashedStringList freigeben
  for i := 0 to Textures.Count - 1 do  //Das ist neu, hier werden erst alle Objekte in der Liste freigegeben.
    Textures.Objects[i].Free;
  Textures.Free;

  inherited Destroy;
end;


Dann noch bei den Schriften:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
destructor TFontManager.Destroy;
var
  i                           : Integer;
begin
  // HashedStringList freigeben
  for i := 0 to Fonts.Count - 1 do  //Auch hier erst die Objekte freigeben
    Fonts.Objects[i].Free;
  Fonts.Free;

  inherited Destroy;
end;


Im Anhang sind dann noch die beiden Units.

gruß


F34r0fTh3D4rk - Do 01.05.08 17:22

hi,

Danke, das muss ich übersehen haben ;)


Fabian E. - Do 01.05.08 19:02

ja, hätte ich wohl auch nicht gemerkt, wenn ich nicht relativ viele Texturen gehabt hätte deren Speicher nicht freigegeben worden wäre...

gruß


Lossy eX - Fr 09.05.08 13:41

Habe mal aus reinem Interesse mir die beiden Units angeschaut und etwas gefunden was mich ein bisschen irritiert.

Bei allen Texturen werden die Eigenschaften FreeDataAfterGenTexture und DeleteTextureOnFree auf False gesetzt. Hat das einen tieferen Sinn? Denn FreeDataAfterGenTexture verhindert, dass die Texturdaten nach dem Erstellen der Textur gelöscht werden. Wenn man nachträglich Zugriff auf die Daten beraucht, dann kann ich das noch verstehen. DeleteTextureOnFree verhindert, dass die OpenGL Textur beim Löschen der Instanz auch gelöscht wird. Wenn ihr also eine Möglichkeit hättet um Texturen zwischenzeitlich zu löschen wären sie trotzdem noch im Speicher der Grafikkarte. In eurem Fall würden sie spätestens beim Löschen des RCs mit gelöscht. Ich glaube viel Früher gebt ihr diese Manager aber auch nicht frei?

Die Texturen haben derzeit immer noch MipMaps die aber nicht benutzt werden. Denn diese werden per Default erzeugt. Um das zu verhindern solltet ihr nach dem Erstellen der Instanz die Eigenschaft MipMap auf mmNone setzen. Der Filter steht zwar ursprünglich auf GL_LINEAR_MIPMAP_LINEAR wird aber bei mmNone automatisch auf GL_LINEAR gesetzt. Das bräuchtet ihr also gar nicht setzen. Und wenn wären diese sowieso an der Textur gebunden. Also ein mal reicht vollkommen.


Fabian E. - Fr 16.05.08 08:13

F34r0fTh3D4rk, hast du eigentlich vor, deine Physik-Engine hier einzubauen oder liegt das auch auf Eis?
Ich finde nämlich, dass deine Engine viel Potenzial hat.
Hier noch ein paar Anregungen, die sich nach langer Benutzung ergeben:


Kannst dir ja mal überlegen etwas an der Engine weiterzuarbeiten.

gruß


F34r0fTh3D4rk - Fr 16.05.08 12:00

hi, momentan habe ich leider keine Zeit dazu und mit der Physik Engine komme ich auch nicht so recht weiter.
Ich muss mal schauen. Momentan habe ich auch kein 2D Projekt in Aussicht für das ich die Engine nutzen könnte. (Ich hab die Engine zwar selbst in einigen Projekten verwendet, aber noch nichts richtig großes)

mfg


jaenicke - So 03.01.10 12:34

Der Downloadlink funktioniert nicht mehr, das solltest du vielleicht einmal korrigieren. ;-)

Wenn der Download zu groß fürs Forum ist, kannst du den auch gerne bei mir ablegen.


F34r0fTh3D4rk - So 03.01.10 14:14

Martok hatte die "aktuellste" Version gehostet, ich habe glaube ich nur noch eine ältere Version hier rumliegen.


Martok - So 03.01.10 18:12

Indeed, der Link ist schon seit über 2 Jahren nicht mehr gültig ;)

Aktuell wäre dieser:

http://www.martoks-place.de/delphi/opengl/fear2d/


F34r0fTh3D4rk - So 03.01.10 20:21

Ich habs mal im ersten Beitrag angepasst, danke ;)


JayEff - Sa 01.05.10 19:12

Nach dem Upgrade von der bass.dll version 2.3 auf 2.4 muss folgende Änderung an der F2D_SoundFX.pas durchgeführt werden:


F2D_SoundFX.pas
 
194:
195:
196:
197:
{ ... }
    // Loop setzen / nicht setzen
    if ((not (Info.Flags = BASS_SAMPLE_LOOP)) AND (pLoop)) OR
        (Info.Flags = BASS_SAMPLE_LOOP) AND (not pLoop) then
      BASS_ChannelFlags(aChannel, BASS_SAMPLE_LOOP, DWORD(-1)); //BASS_ChannleSetFlags gibt's nicht mehr


Sollte ich auf weitere Probleme stoßen, editier ich diesen Post. Gefunden hab ich die nötige Änderung in der .CHM datei die sich im .zip Archiv der bass.dll befindet, unter Upgrading from 2.3


herr-master - Mo 20.06.11 17:42

Leider kann ich deine engine nicht nutzen weil AssignFromBitmap ist ein undeklariter bezeichner.
an dieser zeile :
108  t.AssignFromBitmap(Bitmap);
in der datei f2d_texturemangar.pas


jaenicke - Mo 20.06.11 17:58

Naja, wenn du einmal einen kurzen Blick in die glBitmap.pas geworfen hättest, hättest du gesehen, dass die entsprechende Funktion in einem ifdef steht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    {$ifdef GLB_DELPHI}
      function AssignToBitmap(const Bitmap: TBitmap): boolean;
      function AssignFromBitmap(const Bitmap: TBitmap): boolean;
      function AssignAlphaToBitmap(const Bitmap: TBitmap): boolean;

      function AddAlphaFromBitmap(Bitmap: TBitmap; Func: TglBitmapFunction = nil; CustomData: Pointer = nil): boolean;
    {$endif}
Und wenn du dann wiederum nach GLB_DELPHI gesucht hättest, hättest du direkt am Anfang der Datei gleich den großen Hinweis dazu gesehen:
Zitat:
History
21-03-2010
- The define GLB_DELPHI dosn't check versions anymore. If you say you are using delphi
then it's your problem if that isn't true. This prevents the unit for incompatibility
with newer versions of Delphi.
Du musst also den Punkt bei der entsprechenden Definition entfernen um die Funktion nutzen zu können:

Delphi-Quelltext
1:
2:
{.$define GLB_DELPHI}
// To enable the support for TBitmap from Delphi (not lazarus)


herr-master - Di 21.06.11 15:59

Für neuere delphi versionen ab >2009 sollte man noch follgendes in der F2D_SoundFX.pas an passen

Delphi-Quelltext
1:
{$ifdef unicode} BASS_UNICODE{$endif}