Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.05.2013, 11:44

Dateien in .Exe speichern und wieder auslesen

Hallo liebes Forum!

Vorab, in Verwendung bei mir sind (momentan):
  • C++ (natürlich auch die STL)
  • SFML 2.0
Ich probiere mich gerade ein bisschen herum beim Erstellen von eigenen Anwedungen, welche auf Grafiken angewiesen sind. Da ist mir der Gedanke gekommen, dass es doch bei einer kleinen Zahl an Dateien sinnvoll sein könnte, diese in die Ausführbare zu packen, damit nur noch eine Datei weitergegeben werden muss und nicht extra drei weitere Dokumente.

Mein Wunsch an die Lösung wäre, dass sie möglichst plattformunabhängig ist, sowie compilerunabhängig. Im Internet gibt es ja einiges dazu, jedoch fand ich nichts das mir weiterhalf, maximal "Resoure scripting" bei dem MS Compiler Visual Studio hat sich bei mir ergeben.

Ein Bekannter von mir hat, in C# wohlgemerkt, Dokumente so in seine .exe einbinden können, dass er trotz einigen Grafiken nur noch die Ausführbare an sich weitergeben musste.

Sollte ich es dann geschafft haben, die Datei(en) tatsächlich innerhalb der .exe zu haben, wie kann ich sie wieder greifbar für mich machen? Eine Funktion, die mich nebenbei auch ein bisschen auf die Idee brachte, welche vielleicht das machen könnte, sofern ich mir das Ganze korrekt vorstelle, wäre in der SFML "loadFromMemory()". Liege ich da richtig?

Danke im Voraus für eure Beiträge :D
Lg
Hans_Peter

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

24.05.2013, 11:48

Mein Wunsch an die Lösung wäre, dass sie möglichst plattformunabhängig ist
Nicht möglich.

sowie compilerunabhängig.
Ebenfalls nicht möglich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

24.05.2013, 11:50

Okay, das ging erfreulicherweise schnell :) .

Was kann ich denn alles machen um an mein Ziel zu kommen?

Lg
Hans_Peter

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

24.05.2013, 12:01

Du könntest Speicherblobs direkt in den Sourcecode einbinden, mitkompilieren, und dann die Grafiken aus diesen Speicherbereichen lesen. Das wäre plattformunabhängig und compilerunabhängig, würde aber *große* Quelltexte ergeben. Sowas in der Richtung:

Quellcode

1
2
3
4
// die Datei "blablubb.png"
const uint8_t gDateiBlaBlubb[] = {
  0x83, 0x7d, 0x15, 0x9f, 0xe2, ...
  };


Es gibt sicher schon irgendwo Tools dafür, den Inhalt einer Datei in eine solche Form auszugeben, aber ich glaube, das hast Du eher fix selbst geschrieben als im weiten Netz gefunden.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

24.05.2013, 12:30

Hmm, stimmt, das ginge wohl. Hab' ich sogar schon gemacht. Mensch, was man nicht alles wieder vergisst. :)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

24.05.2013, 12:54

Es gibt keine portable Lösung, aber es gibt auf jeden Fall plattformspezifische Lösungen. In gcc kann afaik beispielsweise der Linker direkt blobs in Object Files verpacken, die du dann linken kannst. Unter Windows gibt's Ressourcen...

7

24.05.2013, 13:32

Angenommen, du hast diese beiden Dateien:
  • spiel.exe - Das ist dein Spiel
  • ressourcen.zip - Darin befinden sich die Ressourcen deines Spiels
Dann kannst du unter Windows diesen Befehl ausführen

Quellcode

1
copy /b spiel.exe+ressourcen.zip spiel_mit_ressourcen.exe


um beide Dateien miteinander zu verschmelzen.

Wenn du die erzeugte Exe doppelklickst, wird sie ausgeführt; öffnest du sie hingegen mit einem ZIP-Programm, erhältst du Zugriff auf das ZIP-Archiv. Das kannst du dir zunutze machen: Du musst Code bereitstellen, der die Exe bei der Ausführung als ZIP-Archiv öffnet und anschließend die Ressourcen ausliest.

Ich weiß allerdings nicht, wie dieses Verfahren im Vergleich mit den von dot genannten Ressourcen dasteht. Möglicherweise geht das mit den Ressourcen über Visual Studio oder andere IDEs ganz komfortabel?

8

24.05.2013, 16:25

Hallo!

Gut, ich finde die Idee von Schrompf klingt ganz interessant, ich kann die Qualität nicht wirklich burteilen, da ich mich hierbei nicht auskenne, aber ich würde mich gerne einmal daran versuchen :) .

Jetzt nur noch zum Verständnis, wie ich das umsetzten könnte:

Ich schreibe mir quasi zuerst eine Funktion, welche beispielsweise PNGs hernimmt und den HEX-Code ausliest und ihn dann in eine Quellcodedatei in ein entsprechendes Array einfügt. Das ganze wird mitkompiliert und dann in den Speicher geladen sobald ich das Programm starte. Wie entnehme ich dann das tatsächliche Bild daraus, oder besser, wie verwende ich es dann, erzeuge ich eine temporäre Datei? Es tut mir wirklich leid wenn diese Fragen komisch kommen, aber ich kann mir das, als Anfänger, derzeit noch nicht so richtig vors Auge rufen. Oder ist es eben dann dieses "loadFromMemory()" das die SFML zu bieten hat?

Jetzt würde mich doch noch interessieren, wie ihr das macht, also wenn ihr ein Spiel oder dergleichen habt, wie verfahrt ihr mit den Dateien und kennt sich vielleicht sogar jemand aus wie das größere Spieleentwickler handhaben?

Danke an alle Antworten :D
Lg
Hans_Peter

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

9

24.05.2013, 16:29

Das sollte mit loadFromMemory() funktionieren.
http://www.sfml-dev.org/documentation/2.…588eeb85e52a249

FSA

Community-Fossil

  • Private Nachricht senden

10

24.05.2013, 16:31

Ich selbst habe alles in Ordnern, welche bei der EXE Datei liegen. Bestimmten Datenpakete sind in einem Archiv zusammengefasst. Um dort Dateien zu lesen, wird das ganze Archiv geladen und Schritt für Schritt ausgelesen.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige