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

11

24.05.2013, 16:34

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

Ich spreche von der "sf::Image loadFromMemory()" ^^

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

12

24.05.2013, 17:01

Ist eigentlich auch nichts anderes, nur dass sf::Texture die Bilder auf der Grafikkarte speichert.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

13

24.05.2013, 17:19

Richtig. Wie Du sicher weißt, kannst Du in C/C++ so ein Array auch als Zeiger auf das erste Element benutzen. Die loadFromMemory()-Funktion nimmt einen Zeiger und eine Größe in Bytes - die solltest Du dann bei der Erzeugung des Array-Quelltextes am besten mit speichern. Oder Du nimmst gleich ein std::array, dass Dir die Handarbeit rund um die Größe erspart.
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.

14

24.05.2013, 21:11

Okay, ich werde mich bei Zeiten hinsetzen und das probieren.

Aber ansonsten würde ich mich noch darüber freuen wenn hier noch ein paar Posts landen in denen darüber geschrieben wird, wie ihr das mit den Dateien löst und ob ihr Dingewie etwa Fenstericons separat speichert (speichern würdet)/in die .Exe einbettet (betten würdet) :) .

Danke für die Antworten
Lg
Hans_Peter

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

15

24.05.2013, 21:16

Ich habe bei meinen Spielen immer einen Ordner, in dem die ganzen Grafiken landen. Das Spiel gebe ich dann in einer zip oder rar-Datei weiter. Das Fenstericon wurde bei mir über VC++ eingebunden und darüber direkt in die .exe eingebettet. Wenn man alles in den Quellcode mit reinschreibt, dann ist es natürlich schwer, diese Grafiken auszutauschen. Man sollte deshalb möglichst nicht mit Platzhaltergrafiken sondern mit den Fertigen arbeiten.

16

24.05.2013, 22:25

Hmm, ja stimmt natürlich ^^ .

Darf ich fragen mit was du gearbeitet hast, dass VC++ den Icon von selbst eingebettet hast? Also welche LIBs hast du verwendet und welche IDE Version genau? Interessiert mich nur so, musst nicht antworten ;) .

Lg
Hans_Peter

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

17

25.05.2013, 00:11

Du könntest die Datei mit z.B. Base64 Codieren/Decodieren. Und dann in einem eigenen Header und dazu kompilieren.
Base64 ist sehr einfach zu implementieren. Und es ist so möglich beliebige Dateien im Ganzen als Zeichenkette in seinen Programmtext einzubinden. Nachteil ist eine ca. 35% Größenzunahme durch die Codierung. Aber dir ging es ja eh nur um wenige Daten.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#pragma once
// -----------------------------------------------------------------------------------------------------BEGIN
// Base64 Data
// ----------------------------------------------------------------------------------------------------------
const static auto sample_data = "\
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz\
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg\
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu\
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo\
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=";
// -------------------------------------------------------------------------------------------------------END

Ich habe mal das Beispiel von Wikipedia genommen.

Wikipedia Base64
RFC 3548
:love: := Go;

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

25.05.2013, 00:27

Da ist die Hex-Variante aber schlanker, kompiliert vermutlich nur länger.
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]

19

25.05.2013, 00:34

Im Grunde genommen macht es das Ressourcensystem von Qt genau so. Die haben ja bekanntlich diesen leicht fragwürdigen zusätzlichen Schritt vor dem eigentlichen Compilieren, aber man muss sagen, dass damit sehr nette Dinge gehen. Der Workflow ist ungefähr so:

Man klickt sich eine Ressourcendatei zusammen, in der all die relativen Pfaden zu deinen Dateien stehen, die später mit in die exe sollen. Beim compilieren wird daraus dann eine Sourcedatei (mit Header) erzeugt, die in der Idee dem Beispiel von H5:: entspricht. Über die Variablennamen kann man dann an die Daten kommen, aber alle Qt Funktionen, die irgendetwas aus einer Datei laden können über bestimmte Pfadtypen (":/images/cut.png") auch direkt aus Ressourcen laden, ohne irgendeine 'LoadFromMemory'-Funktion.

Das eigentlich nette daran ist natürlich, dass die Code-Dateien bei jedem Compilieren neu erstellt werden und somit Änderungen in deinen Dateien direkt übernommen werden können. Garantiert gibt es schon Tools, die aus einer Dateien z.B. die Base64-Kodierung erzeugen, vermutlich gibt es sogar welche, die dir direkt die entsprechenden Source-Dateien erzeugen. Wenn du dir ein wenig Mühe gibts, und deine Projekteinstellungen anpasst, könntest du ein solches Tool auf vor jedem Compilieren automatisch starten lassen.

Achja: Qt benutzt statt Base64 folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
static const unsigned char qt_resource_data[] = {
  0x0,0x7,0x83,0x91,
  0xff,
  0xd8,0xff,0xe0,0x0,0x10,0x4a,0x46,0x49,0x46,0x0,0x1,0x2,0x2,0x0,0x4e,0x0,
  0x4e,0x0,0x0,0xff,0xc0,0x0,0x11,0x8,0x8,0x0,0x8,0x0,0x3,0x1,0x22,0x0,
  0x2,0x11,0x1,0x3,0x11,0x1,0xff,0xdb,0x0,0x84,0x0,0x3,0x2,0x2,0x2,0x2,
  0x2,0x3,0x2,0x2,0x2,0x3,0x3,0x3,0x3,0x4,0x8,0x5,0x4,0x4,0x4,0x4,

Durch diese Notation mögen zwar vielleicht die Quellcodedateien etwas länger werden, aber die Daten stehen später 1zu1 in der exe und sind kein Base64-String, der erst noch geparst werden müsste. Dadurch hast du also quasi keinen Overhead.
Lieber dumm fragen, als dumm bleiben!

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

20

25.05.2013, 00:53

Ja stimmt. Ich musste grad selbst ein bisschen schmunzeln. Ich glaube das liegt daran, dass ich berufsbedingt Schweißausbrüche bekommen wenn jemand Plattformunabhängig sagt. Da bedeutet dann auch mal ein Byte != 8Bit u.A.
Ich denke so würde ich auch zur einfachen Byte-Repräsentation greifen. Aber die Kanone würde den armen Spatz auch treffen.
:love: := Go;

Werbeanzeige