Gefällt mir sehr gut das Innerfuse Pascal Script und der Code-Inspektor. Könntest du mehr Informationen darüber geben wie man seine eigenen Klassen/Instanzen in IPS integriert. (Gerne auch mit Source
Bitte Anmerkungen ins "Meinungen zu den Projekten" Forum posten - das macht den Projektthread übersichtlicher .
Wenn du Innerfuse Pascal runterlädst, findest du ein Unterverzeichnis (unit-importing) mit einem Utility, das automatisch die Interfaces deiner Units parst und die entsprechenden Innerfuse Importbibliotheken erzeugt (beziehungsweise versucht dies zu tun ).
Wahrscheinlich musst du einige Deklarationen anpassen und ein paar Wrapperfunktionen erstellen, da Innerfuse keine Zeiger kennt und das Importer Utility in seinem Delphi Sprachverständnis etwas eingeschränkt ist - aber da es mir z.B. möglich war OpenGL zu portieren, bei dem Zeiger ja ein zentrales Element sind, sieht man, dass man sich nicht gar sehr einschränken muss .
Schlussendlich geht das Ganze relativ schnell - wenn man halbwegs sauber programmierte Bibliotheken hat, die eher mit Methoden als mit Eigenschaften arbeiten.
Es sind auch sonst einige Demoanwendungen dabei, anhand derer ich die Funktionsweise begriffen habe, sowie eine HTML Hilfe, in der die Deklarationen angeführt sind.
Source kann ich schlecht posten, da ziemlich umfangreich und BaseGraph spezifisch - wenn dich etwas Spezielles an BGP interessiert, kannst du mich natürlich gerne fragen (wäre sicher auch für Jale eine interessante Erweiterungsmöglichkeit...), ansonsten betreibt Carlo Kok eine Mailingliste, in die du dich auf seiner Homepage eintragen kannst - und die mit etwas Suchen viele Informationen enthält.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Bin erst grade eben mal dazu gekommen mir BGP genauer anzusehen, aber das macht wirklich einen genialen Eindruck. Besonders die Einbindung von ODE macht diese IDE wirklich interessant, und wenn dann noch wie gesagt andere Aspekte wie z.B. Audio und Netzwerk dazu kommen hast du da ein mächtiges Tool an der Hand mit dem man ohne großen Programmieraufwand recht viel machen kann.
Was mir eben beim Testen (Würfeldemo) aufgefallen ist : Wenn du während ein Würfel fällt oder kollidiert das Menü öffnest (oder sonst die Ausgabe zur Pausierung zwingst) und es dann weitergeht, spielt die physikalische Simulation verrückt, das sieht entsprechend lustig aus.
Mit größeren Zeitschritten hat ODE Probleme, meine Routine PhysicStep ist jedoch schon darauf vorbereitet, anstelle von
Code:
PhysicStep(LastFrameTime, LastFrameTime);
könnte man auch schreiben
Code:
PhysicStep(0.001, LastFrameTime)
- dies würde ODE dazu veranlassen in Schritten von 1000stel Sekunden bis zur verstrichenen Zeit zu rechnen (was allerdings durchaus dauern kann, wenn sich der Benutzer längere Zeit im Menü rumtreibt...).
Nachdem einer der nächsten Schritte ohnehin sein wird, lauffähige .exe Dateien zu erstellen (die dann nicht mehr von einer "lästigen IDE" unterbrochen werden können), ist das Verhalten für eine interaktive Entwicklungsumgebung akzeptabel - über einen Timer sicherzustellen, dass das Skript immer wieder mal aktiviert wird ist unschön - und wenn man im Singlestep Modus durchtraced, oder einen Breakpoint gesetzt hat, kann (und will) ich ohnehin nichts machen .
Ansonsten bin ich grad am Brainstormen für den Netzwerkcode - wahrscheinlich wird es ein Kommando geben, eine entsprechende Dialogbox aufzurufen, in der man sich als Client oder Server definieren kann, und die bis zum Zustandekommen einer Verbindung (oder Abbruch) wartet. Die Kommunikation selbst soll im Source mit wenigen, einfachen Befehlen abgedeckt werden können.
Ideal wäre es, wenn sich "Clients" die Server einer bestimmten Anwendung selbst suchen könnten, etwa auf folgende Weise:
1) das "Verbindungskommando" könnte etwa IPMakeConnection('TestApplication'); lauten
2) in der Dialogbox definiert man sich als Server
3) andere Leute, die sich mit dem selben Kommando als Client definiert haben, "sehen" nun die potentiellen Server aufgelistet (und zwar nur diejenigen mit dem eindeutigen Applikationsnamen "TestApplication", zusammen mit der Möglichkeit einfach zufällig einen auszusuchen (so in etwa wie Microsofts Internet Damespiel)
ich weiß allerdings nicht, ob das ohne "verwaltende Zentrale" überhaupt geht, also wird wohl oder übel der "Client" die IP-Adresse des "Servers" selbst eintippseln müssen, was dazu führt, dass man sich eine Internet-Netzwerksession zuerst telefonisch oder per Mail ausmachen muss...
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Das sieht wirklich super aus, also von der Umsetzung her. Was mir eben bei der Boxdemo aufgefallen ist, ist folgendes:
Wenn man das Programm zurücksetzt und dann gleich wieder startet verschwindet die bisher gezeichnete Szene nicht, aber die Physikengine fängt wieder von vorne an. So fallen dann die Würfel durch die alten hindurch. Sieht etwas merkwürdig aus.
Außerdem wird das programm nicht beendet, wenn man deine IDE mit einem Klick auf das X des fenster beenden will. Erst wenn man dann das Script beendet, beendet sich auch deine IDE automatisch. Der Menüpunkt Schließen funktioniert dagegen einwandfrei. Vielleicht solltest du das ganze in ein OnClose packen und beim Menüpunkt Schließen nur Form.Close aufrufen - oder wie du es sonst machst, vielleicht liegt es ja auch an etwas anderem.
Ansonsten wirklich gut gemacht das ganze.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Wenn man das Programm zurücksetzt und dann gleich wieder startet verschwindet die bisher gezeichnete Szene nicht
Das ist so beabsichtigt - die Szene soll erhalten bleiben, da sie ja auch von Carad importiert worden sein könnte, und es lästig wäre, nach jedem Programmlauf die Szene neu laden zu müssen. Außerdem ist es nur so möglich, dass in Skripten erzeugte Objekte nachher auch in Carad zur Verfügung stehen (außerdem gehe ich davon aus, dass ein ordentlicher Programmierer erzeugte Objektinstanzen, die nicht mehr benötigt werden, auch wieder freigibt). Nicht ganz so fleißige Programmierer können allerdings auch Projekt>Projektdaten entfernen (oder dem Toolbarknopf ganz rechts) verwenden . Die Physikengine wird hingegen vor Programmstart immer neu initialisiert, auch wenn die Objekte aus Carad stammen (wo ich die Möglichkeit Objekten physikalische Eigenschaften mitzugeben erst noch einbauen muss - dann werden diese vor dem eigentlichen Programmstart noch schnell an ODE gesendet, ohne dass man dies im Skript tun muss).
Zitat:
Außerdem wird das programm nicht beendet, wenn man deine IDE mit einem Klick auf das X des fenster beenden will
Stimmt - liegt daran, dass das Skript ja noch läuft, und die entsprechende Routine ja erst verlassen werden muss.
Bei der Beenden-Aktion habe ich dran gedacht, auf ein eventuell laufendes Programm zu überprüfen und im Falle schnell zu beenden, bei OnClose nicht - danke für den Hinweis.
Schöne Sache. Der Vorteil gegenüber den ganzen GameMakern liegt vor Allem darin daß hier nicht irgendwelche seltsamen Funktionen sondern direkt OpenGL und Pascal benutzt werden, so daß das für den Einstieg besser geeignet ist, weil man auch was für Später dabei lernt. Richtig gut wäre es wenn man damit auch Bildschirmschoner erstellen könnte. Das könnte vielleicht noch ein größeres Einsatzgebiet sein. Die Kisten, die einen Berg bilden und dann wieder explodieren bilden z.B. ein gutes Motiv für so etwas. Und wenn die ganzen Texturen mit in die Exe Datei hineinkommen wären solche Bildschirmschoner auch leicht weiterzugeben.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Hab leider ned genug Zeit mich genauer mit BGP auseinanderzusetzen, aber das Projekt wird immer vielversprechender.
Allerdings hab ich BGP grade in der neuen Version (eben runtergeladen) diverse male zum Absturz gebracht. Ich hab nix weiter getan als alle mitgelieferten Beispiele mal nacheinander zu laden und spätestens nach dem dritten oder vierten Laden ist BGP total hängen geblieben, mit der berüchtigten Sanduhr, bevor ich es dann über den Taskmanager abschissen musste.
Ansinsten solltest du BGP unbedingt publik machen und evtl. mal auf DGL ne Newsmeldung posten, nicht dass das irgendwo untergeht und keiner es nutzt.
Ich konnte das Problem replizieren - es liegt mit ziemlicher Sicherheit daran, dass Ressourcen nicht freigegeben werden, wenn man ein neues Projekt lädt.
Die Logik war bisher die, dass Daten (Objekte und Shader) beim Laden einer .src Datei beibehalten werden, da dies ja beabsichtigt sein könnte, um z.B. verschiedene Programme mit den selben Objekten arbeiten zu lassen - da wollte ich das Programm wohl "zu" intelligent machen. Geschickter ist es, sämtliche Daten auf jeden Fall freizugeben, wenn der Benutzer eine zu einer .src (Source) Datei Objekte aus einer andersnamigen .bgp (Programmdaten) Datei haben möchte, soll er sie gefälligst selbst laden .
Der Fehler tritt dann auf, weil ich aus lauter Bequemlichkeit in sämtlichen Programmen auch noch immer wieder die selben Objektnamen verwende.
Ich werde demnächst eine stabile Version zusammenstellen, und in den nächsten Tagen eine entsprechende Newsmeldung posten - ich denke in BGP steckt ziemlich viel Potential drin, auch um den Einstieg in die OpenGL Programmierung und ODE zu erleichtern, mal schauen was schlussendlich draus wird.
Ich poste hier mal den Fehler, in der Hoffnung, dass es anderen bei ähnlichen Problemen hilft:
Meine Vermutung war nicht richtig. Während es zwar ein Problem war, gleichnamige Objekte zu laden, hatte ich bereits eine entsprechende Warnung vorgesehen, sodass sich das BGP Projekt dann einfach nicht kompilieren ließ.
Den Fehler zu finden war schwierig, da er immer an einer anderen Stelle aufzutauchen schien - und beim Durchtracen des Codes schien alles recht sauber programmiert zu sein.
Wenn ich die Objekte nicht freigab, funktionierte alles anstandslos, also lag die Vermutung nahe, dass sich in irgendeinem Destruktor ein Bug versteckte - allerdings konnte ich dort absolut nichts finden, was verdächtig gewesen wäre.
"Stillschweigend" ein Speicherloch zu produzieren, indem Objekte nicht freigegeben wurden, sondern einfach die Verweise darauf auf NIL gesetzt, wollte ich natürlich auch nicht.
Schlussendlich file mein Blick auf folgendes recht unscheinbare Kommando:
Code:
FreeMem(bgObject);
welches zum Zeitpunkt des Aufrufes völlig korrekt war - allerdings ist bgObject eine globale Variable, über die auf sämtliche irgendwann instanziierten Objekte zugegriffen werden kann, die von mir hauptsächlich für Debugzwecke eingesetzt wird (und dafür eindeutige 32Bit Bezeichner zu generieren, was für den Selektionsmodus benötigt wird, da BaseGraph bereits für 64Bit Betriebssysteme vorbereitet ist, und ich deshalb innerhalb von BaseGraph nicht auf den Zeiger=32 Bit Integer Trick zurückgreife).
Das Problem war also Folgendes, dass der Speicher zwar freigegeben wurde, bgObject aber nicht auf NIL gesetzt, was an sich kein Problem wäre, wenn BaseGraph Pascal immer Objekte mit Source laden würde. Nun ist es aber auch möglich, sämtliche Objekte im Source selbst zu erzeugen - und in diesem Fall bleibt bgObject uninitialisiert, und ein FreeMem macht - irgendwas - wahrscheinlich gibt es Speicher frei, der an sich benötigt würde, und an irgendeiner völlig obskuren Stelle tritt irgendwann ein Fehler auf.
Jedenfalls war die einzig notwendige Änderung
Code:
FreeMem(bgObject);
durch
Code:
FreeMem(bgObject);
bgObject := NIL;
zu ersetzen - was wahrscheinlich ein Plädoyer dafür ist, doch ReallocMem(Pointer, 0) anstelle von FreeMem zu verwenden, welches einen entsprechenden Zeiger automatisch auf NIL setzt.
Bei Objekten nehme ich gerne FreeAndNil, weil mir der Fehler auch schon ein paar Mal passiert ist. Aber ich glaube das geht mit normalen Zeigern nicht.
Stimmt, FreeAndNIL funktioniert nur für Klasseninstanzen - und ruft für diese auch noch automatisch den Destruktor auf.
Allerdings habe ich gewisse Hemmungen für sehr häufig benötigte Zusammenstellungen Listen zu verwenden (auch wenn es sich leistungsmäßig wahrscheinlich überhaupt nichts nimmt), sondern verwende lieber Zeiger auf Arraytypen, die ich selbst verwalte - immerhin macht es eine solche Vorgehensweise leichter, Code in andere Programmiersprachen zu portieren, die ja die Delphiklassen nicht zur Verfügung haben.
Bei normalen VCL Anwendungen nutze ich den Komfort der mitgelieferten Klassen natürlich auch.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Hab mir mal die neue Version angesehen und auch gleich die Sound1-Demo im BGP angetestet, aber muss auch direkt zwei Sachen los werden :
Entweder setzt du eine falsche Lautsprecherkonfiguration, oder etwas mit der Positionierung deiner Soundquellen stimmt nicht. Ich habe bei mir ein 5.1-DS-System über nen externen Receiver angeschlossen (geht allerdings schon 5.1 vom Rechner ab, wird also nicht am Receiver gemixt), und der Sound scheint auf der Z-Achse vertauscht. Wenn ich also direkt vor der Kugel stehe und diese ansehe, dann kommt die Musik aus meinen hinteren Lautsprechern. Mache ich dan einen Schritt nach vorne, so dass die Kugel hinter mir liegt, also genau von mir wegzeigt, kommt der Sound aus meinen Frontlautsprechern. Was mir ansonsten noch beim Soundystem aufgefallen ist, ist die Lautstärke. Zum einen sind die Sounds zu leise, und der Lautstärkenabfall ist viel zu hoch. Das reicht wenn ich mich minimal von der Kugel entferne und schon höre ich nix mehr. Ich weiß das so ein Soundsystem zu tweaken sicherlich recht schwierig ist, aber ich steh gerne zu Testzwecken zur Verfügung.
Was mir dann noch eben aufgefallen ist : Deine Sound-Demo wird im BGP ja im Vollbild gestartet. Ich als fauler Programmierer hab die Demo dann mal so dreist wie ich bin mit ALT+F4 beendet, was BGP wohl nicht mag. Das Programm war zwar beendet, aber die Auflösung noch auf 640x480 und BGP in ner Endlosschleife (Datei->Schliessen ging nicht), bevor es dann nach einigen Sekunden was von "Out of Global Vars" sagte und ich es mit dem Task-Manager beenden musste. Da solltest du evtl. auch noch ne Abfrage einbauen, kann ja sein das jemand statt über Escape wie ich mit ATL+F4 (aus Unwissenheit) rausgeht.
Ansonten hast du ja da jetzt mit ODE, Resourcen und nem fertigen Soundsystem ein richtig komplettes Content-Creation-Tool mit dem man sicherlich tolle Sachen machen kann. Wenn ich Zeit hab werd ich das sicherlich intensiver austesten und auch selbst mal was machen statt mich immer nur zu beschweren
P.S. : Wie siehts denn mit Feedback jenseits von DGL aus?
Eine andere Sache bezüglich DirectSound ist mir aufgefallen:
Wenn man sich von der Soundquelle wegdreht hört man gar nichts mehr. Dabei ist es fast egal wie weit man weg ist. Das ist natürlich ärgerlich weil es nicht den normalen Gegebenheiten entspricht. Ich weiß nicht, ob das an meinem SoundChip liegt, aber wenn den Buffer mit DSBCAPS_LOCSOFTWARE erstelle ist alles normal und Geräusche von hinten hören sich nur eben dumpfer an als von vorne. Vielleicht könntest du da noch so eine Art Kompatibilitätsoption einbauen.
Danke fürs Testen und für's Beschweren - ich bin um jeden gefundenen Fehler froh (zumindest wenn ich ihn bereinigen kann)
Zur Lautsprecherkonfiguration:
Ich wusste doch, dass da was war: ich glaube in DirectX und OpenGL sind die Vorzeichen von Z vertauscht - was ich mit meiner armseligen Stereokonfiguration natürlich nicht bemerkt habe
Zur Lautstärke:
Eigentlich kann meine API für jede Soundquelle und auch Global die Distanz der "3D-Abschwächung" einstellen - diese Routinen in das Framework für BGP zu integrieren habe ich allerdings schlichtweg vergessen, es handelt sich dabei um
Wobei Global alle Soundquellen in einem Rutsch einstellt, Primary die "primäre" Soundquelle (normalerweise Hintergrundmusik) und die "Handle" Routinen Parameter der "normalen" sekundären Soundquellen ändern, von denen es beliebig viele geben kann (das selbe Handle kann übrigens auch mehrfach gleichzeitig oder leicht zeitversetzt abgespielt werden) - womit ich die Aufgabe des "Tweakens" elegant auf den BGP Programmierer abgeschoben hätte
Zitat:
Ich weiß das so ein Soundsystem zu tweaken sicherlich recht schwierig ist, aber ich steh gerne zu Testzwecken zur Verfügung.
Das werde ich natürlich schamlos ausnutzen
Zu <ALT><F4>
Dem muss ich nachgehen - habs grad selbst ausprobiert: erstellte Executables verhalten sich schön (zeigen einfach keine Reaktion), in der IDE schauts nicht so toll aus - man kann allerdings im Skript das OnFormCloseQuery Ereignis abfangen und CanClose auf false setzen, dann kann der Benutzer auf <ALT><F4> drücken sooft er will, was ich denn auch als Standardverhalten einführen werde.
Zu Feedback jenseits von DelphiGL
Zur gibt es noch nicht besonders viel Feedback - allerdings war ich auch nicht besonders fleißig beim Verbreiten irgendwelcher News und BGP ist erst wenige Tage alt:
* auf DUS habe ich ein entsprechendes Projekt eröffnet, wobei ich mir nicht sicher bin, ob das die richtige Zielgruppe ist
* durch einige Fragen im ODE Forum wurde Dominique Louis von Delphi Gamer auf das Projekt aufmerksam, und war bat mich, eine entsprechende Newmeldung abzusetzen, die er dann auch netterweise veröffentlicht hat
- das wars dann eigentlich schon, wobei ich BaseGraph Pascal halt derweil hauptsächlich für mich entwickle (was mir ziemlichen Spass macht) und hoffe, dass es eher durch Qualität von sich aus überzeugen kann, als dass ich ständig dahinter her sein muss, auf diversen Internetseiten und Foren omnipräsent zu sein, um potentielle Nutzer zu "fangen"
@LarsMiddendorf
hmm, das wäre mir weder auf dem Notebook als auf dem Desktop aufgefallen, bist du sicher, dass auch beide Lautsprecher funktionieren, bzw. (falls du ein Surround System hast), dass die hinteren Lautsprecher auch eingeschaltet sind?
Wenn andere Sachen problemlos bei dir laufen, werde ich eine entsprechende Option einbauen, und deinen Vorschlag beherzigen.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.