|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 04.08.2002, 13:06 Titel: bilder nicht extern ? |
|
|
hi,
mich nervt andauernt die bmp files und die ordner struktur u.s.w. immer mit der .exe zu kopieren. Gibt es nicht eine möglichkeit das die Bilder mit in der exe drin sind ?
cu _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 04.08.2002, 14:52 Titel: |
|
|
Natürlich... Benutze einfach die Imageressource. Die Bilder mußt du dann einfach aus der Ressource laden, nicht von der Datei. Beim Kompilieren werden dann die Bilder mit in der Exe gelinkt...
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 04.08.2002, 15:13 Titel: |
|
|
sorry aber ich bin nicht son gosu wie du in C++, kannst du mir das vieleicht genauer erklären , so das es mich weiter bringt ? _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 04.08.2002, 22:24 Titel: |
|
|
<Fluchen>
ARGH - Ich habe eine halbe Stunde an einem Text geschrieben, den ich dann mit einem falschen Klick im Browser in's Datennirvana schickte...
</Fluchen>
Also nochmal von vorne:
Importiere die Bilder in deinem Projekt als Ressource. Zur Besseren Verständigung gehe ich davon aus, daß deine Hauptdatei WinMain.cpp heist, der dazugehörige Header WinMain.h, die Spriteklasse sich in Sprite.cpp/Sprite.h befindet und dein Projekt bisher noch keine Ressourcen verwendet.
Kopiere in der Sprite.h / Sprite.cpp die Funktion CreateSurfaceFromBitmap() und benenne Sie in CreateSurfaceFromRessource() um. (Die Funktion befindet sich im Buch JLI-Spieleprogrammierung... auf den Seiten 325/326. Verändere die Codezeilen 18/19 (Buchzeilennummerierung) Folgendermaßen ab:
Code: |
hBM = (HBITMAP)LoadImage(0, File, IMAGE_BITMAP, dWidth,
dHeight, 0);
|
Die Funktion LoadImage kann nämlich auch Ressourcen laden, indem man dieses LR_LOADFROMFILE nicht mit angibt. Es bleibt dir überlassen, dem Parameter LPSTR File in LPSTR Ressource umzubenennen.
Nun zum Erstellen der entsprechenen Ressource:
Klicke auf Einfügen, Ressource, Importieren. Wähle als Dateityp *.* und wähle danach das (Hoffentlich schon fertige) Bitmap aus. Bestätige alles mit Importieren und wiederhole den Vorgang für weitere Bilder. (Die Warnmeldung beim Importieren, daß die Bilder mit mehr als 256 Farben nicht bearbeitet werden können, kannst du getrost vergessen, da du die Bilder eh mit Gimp, PSP oder einem ähnlichem Programm erstellst / erstellt hast. (Hoffe ich zumindest, klauen ist nicht gerade die feine Englische Art)) Du kannst und solltest die Standardbezeichnungen IDB_BITMAP1, IDB_BITMAP2, ... in sinvolle Bezeichner umbenennen. Diese Namen mußt du der Funktion übergeben, damit sie die Ressourcen lädt. Speichere das Ressourcenscript unter dem Namen WinMain.rc ab. VC++ 6 Erstellt neben der WinMain.rc noch eine passende Headerdatei ressourece.h.
Includiere die ressource.h nach Winmain.h und Sprite.h. Füge die Dateien ressource.h, WinMain.rc sowie die Bilder dem Projekt hinzu. Wenn du das Projekt nun erneut erstellst, wird die Exe-Datei um einiges größer sein, als vorher, immerhin befinden sich jetzt mehrere Bilder in Ihr.
Diese Vorgehensweise ist allerdings nicht uneingeschränkt zu empfehlen, da die Exe-Datei komplett in den Speicher geladen werden muß, damit sie ausgeführt werden kann. Weiterhin müssen die Bilder selbst nochmal in Form der Surface im Speicher hängen (also doppelt) sofern sie in den Physikalischen Speicher geladen werden, wenn der Videospeicher bereits voll ist. Während des Ladevorgangs in der Routine CreateSurfaceFromRessource befindet sich ein Bild also bis zu 3x im Hauptspeicher... Ein Bild, 1024x768 Pixel, 32Bit ist 2,25 MB groß, 3x im Speicher sind dadurch also schonmal 6,75 MB für ein Bild, wenn auch nur kurzzeitig. Außerdem ist mir nicht bekannt, wie groß die maximale Dateigröße ist, die Windows ohne mucken ausführt oder die VC++ 6 erstellt.
Soweit zur Erklärung.
Als Hausaufgabe erstellst du die Ressource nicht in der Exe-Datei, sondern benutzt dafür eine Win32 Dynamic Link Library und fügst sie dem Projekt hinzu. Als Hinweis: die DLL benötigt keinen Code, da sie nur als Träger der Ressourcen verwendet wird.
Bis Bald, AFE-GmdG
PS.: Übersetze doch mal den Begriff Gosu!
PPS.: Ich habe den beschriebenen Weg selbst noch nicht programmiert, aber ich gehe davon aus, das ich nichts vergessen hab und das der Code so funktioniert.
@Christian: Brauchst du vielleicht noch programmiertechnische Hilfe für dein nächstes Buch?[/b] _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 05.08.2002, 07:08 Titel: Gut |
|
|
Ja das ist schon Mal etwas nützlich...
...aber weiß oder kennt jemadn ein Buch in dem beschrieben wird, wie man nicht nur Bitmaps (bmp) sondern auch gif oder jpg Dateien laden kann? Oder alle in ein File (Art Zip,rar oder tmd) rein packen und dann aus dem File die Dateien gleich in den Speicher laden?
Cu TheMillenium _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
Michael JLI'ler
Anmeldedatum: 20.07.2002 Beiträge: 173 Wohnort: Münster / NRW Medaillen: Keine
|
Verfasst am: 05.08.2002, 11:39 Titel: |
|
|
Bilder intern wollte ich auch schon immer mal haben aber irgendwie klappt das bei mir gar nicht. die funktion loadimage liefert immer null zurück also sie kann das bild nicht laden obwohl ichs gemacht habe wie du gesagt hast.
du der dll: wie soll ich das machen? ich hab ein win32-dll-projekt erstellt und jetzt einfach unter projekt -> dem projekt hinzufügen die bitmaps ausgewählt, er macht mir dann beim compilieren aber keine dll-datei. oder wenn ich ein ressourcesskript mit den bildern erstelle, diese .rc-datei (und die .h-datei) zum projekt hinzufüge erhalte ich den linkerfehler, dass ihm die DllMain fehlt. was muss ich anders machen? _________________ Es geht auch ohne |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 05.08.2002, 12:03 Titel: |
|
|
@TheMillenium
Mit dem Projekt zum Laden von JPG,PNG,BMP, usw. sollte das alles sehr leicht möglich sein. Du mußt die Bilder nur in ein File kopieren und den Offset von Anfang speichern, dann kannst du mit der Library alles aus einem File laden.
Christian |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 05.08.2002, 19:56 Titel: |
|
|
@Michael:
Erstelle einfach eine Funktion DllMain() und programmiere einfach nur einen Rückgabewert.
Code: |
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
) {
return TRUE;
}
|
Vergesse auch nicht, Ressource.h zu includieren!
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Michael JLI'ler
Anmeldedatum: 20.07.2002 Beiträge: 173 Wohnort: Münster / NRW Medaillen: Keine
|
Verfasst am: 06.08.2002, 08:41 Titel: |
|
|
Danke erstmal soweit. Scheint funktioniert zu haben. Jetzt gibt es nur noch ein Problem beim Laden. Folgender Codeausschnitt soll das machen, ich weiß nur nicht ganz, wie ich jetzt einen Pointer auf das Bitmap oder so kriegen soll:
Code: |
BOOL LoadDll()
{
HMODULE hMod = LoadLibrary("DLL.dll");
if(0 == hMod) return FALSE;
// "#101" ist ein String, der die Resource mit der Nummer 101 lädt!
HRSRC hRes = FindResource(hMod, "#101", RT_BITMAP);
if(0 == hRes) return FALSE;
HGLOBAL hGlobalRes = LoadResource(hMod, hRes);
if(0 == hGlobalRes) return FALSE;
return TRUE;
}
|
Was soll ich jetzt mit dem HGLOBAL-Handle machen? Irgendwie brauche ich ja ein HBITMAP-Handle oder sowas, um das ganze in eine Surface laden zu können! Ich wäre dir für eine Hilfe sehr dankbar! _________________ Es geht auch ohne |
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 27.08.2002, 19:00 Titel: |
|
|
ich hab alles gemacht, aber funz net wirklich ...
meine exe is größer aber er zeigt die bilder nicht an
wie muss ich die bilder zur Function übergeben ?
Code: |
lpDDSurface = CreateSurfaceFromBitmap(LemmingL,1*35,1*30);
|
so gehts schonmal net _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
Michael JLI'ler
Anmeldedatum: 20.07.2002 Beiträge: 173 Wohnort: Münster / NRW Medaillen: Keine
|
Verfasst am: 28.08.2002, 08:51 Titel: |
|
|
Du musst (wahrscheinlich) die Datei resource.h (oder so) includen und dann mit den dort definierten Bezeichnern arbeiten, also IDB_BITMAP1 usw. Ich denke, du musst da so eine funktion wie LoadBitmap() verwenden. Einfach der Funktion das HINSTANCE des Progs und den Bezeichner des Bitmaps übergeben. Also, natürlich mit MAKEINTRESOURCE(IDB_BITMAP1). Dann solltest du ein Handle auf das Bitmap kriegen und kannst es laden! Ich hoffe das funzt, habe es selber noch nicht getestet! _________________ Es geht auch ohne |
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 28.08.2002, 12:17 Titel: |
|
|
die resource.h isi ncludiert , in der stehn auch die IDB_BITMAP dinger und ich mach
Code: | lpDDSurface = CreateSurfaceFromBitmap(MAKEINTRESOURCE(IDB_BITMAP1),1*35,1*30); |
aber es funz net :/ _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
Michael JLI'ler
Anmeldedatum: 20.07.2002 Beiträge: 173 Wohnort: Münster / NRW Medaillen: Keine
|
Verfasst am: 28.08.2002, 14:11 Titel: |
|
|
So geht das auch nicht! Du musst in der CreateSurfaceFromFile() die Zeile HBITMAP hBitmap = LoadImage(...); *oder so ähnlich* durch folgende ersetzen:
Code: |
HBITMAP hBitmap = LoadBitmap(GetModuleHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
|
Bei GetModuleHandle() handelt es sich eine Funktion, die das HINSTANCE der aktuellen Anwendung (also dein Prog) zurückgeben sollte (ich habs nicht getestet). Wenn das nicht gehen sollte, einfach mal das HINSTANCE aus der WinMain übergeben! _________________ Es geht auch ohne |
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 28.08.2002, 14:59 Titel: |
|
|
das hab ich doch , aber wie muss ich die function aufrufen? _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
Michael JLI'ler
Anmeldedatum: 20.07.2002 Beiträge: 173 Wohnort: Münster / NRW Medaillen: Keine
|
Verfasst am: 29.08.2002, 08:41 Titel: |
|
|
Du meinst, wie du deine CreateSurfaceFromBitmap() aufrufen sollst?
Sag das doch gleich
Also ich würde das so machen: Ich würde in einer Headerdatei jeden dieser Konstanten IDB_BITMAP1 usw. einen String zuordnen, also zb.:
Code: |
#define HINTERGRUNDBILD IDB_BITMAP1
|
oder so ähnlich, das kannst du im Programm dann besser handeln.
Jetzt musst du die CreateSurface... - Methode nur noch so verändern, dass sie als "Datei-NAmen" eben dieses HINTERGRUNDBILD oder wie du es genannt hast, aufnimmt, anstatt des Dateinamens halt. Welchen Datentyp du da brauchst, ich glaube es müsste ein int sein. Du solltest die Funktion dann also so aussehen lassen:
Code: |
LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(int Bild, int Hoehe, int Breite);
|
Damit sollte es dann gehen! _________________ Es geht auch ohne |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|