Problem beim Laden von Datei
-
Hallo! :p
In meinem Spiel erstelle ich eine Offscreen Surface um sie danach mit Grafiken zu füllen. Dafpr hab ich die kleine Funktion:
bool CreateOffscreenSurface(LPDIRECTDRAWSURFACE7 lpDDSurface) { HRESULT ddrval; DDSURFACEDESC2 ddsd; DDSCAPS2 ddscaps; ZeroMemory(&ddscaps,sizeof(ddscaps)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; ddsd.dwHeight = SCREEN_HOEHE; ddsd.dwWidth = SCREEN_BREITE; ddrval = lpDD->CreateSurface(&ddsd,&lpDDSurface,NULL); if(ddrval != DD_OK) return false; }
geschrieben. Wenn ich die Funktion aufrufe und als Parameter zum Beispiel
lpStartScreen angebe, gibt die Funktion den Wert false zurück. Beim Kompilieren
tritt aber kein Fehler auf. Ohne die Funktion läuft das Spiel ohne Fehler.
Woran kann das liegen??Scon mal Danke im voraus
-
Wieso hast du ddscaps als lokale Variable, nullst sie ab, benutzt sie aber nicht. Sollte das mit ZeroMemory nicht so sein:
ZeroMemory(&ddsd,sizeof(ddsd));
-
Hi!
Es geht aber immer noch nicht!
mfg Julian
-
Wie soll die Funktion auch funktionieren?
Was mir gleich als erstes auffällt, ist, dass Du ihr einen Parameter übergibst und diesen Parameter in der Funktion ausfüllst. Das geht aber überhaupt nicht, es sei denn Du übergibst per Referenz.Beispiel:
void SetzeWert(int Variable, int Wert) { Variable = Wert; } int Test; SetzeWert(Test, 100);
"Test" wird danach NICHT den Wert 100 haben.
Hoffe Du verstehst, was ich meine...Im Übrigen: Warum heißt der Thread "Problem beim Laden von Datei"? Wo wird da eine Datei geladen?
[ Dieser Beitrag wurde am 02.07.2003 um 20:43 Uhr von TomasRiker editiert. ]
-
Hallo!
jetzt funktioniert es
. Aber ich hab noch ein weiteres Problem
. Mit einer anderen Funktion lade ich jetzt BMP Daten in die Surface(Deswegen hies es zuerst auch Problem bei Datei laden. Hab bloß vergessen es umzubenennen :D). Der Kopf der Funktion schaut so aus:
bool BMP_in_Surface(const char* BMP_Datei,LPDIRECTDRAWSURFACE7 lpDDSurf,bool Palette_laden);
Wenn ich beim Funktionsaufruf einfach nur "StartScreen.bmp" hinschreibe funktionniert es nicht. Muss die Datei an einem bestimten Ort liegen, dass die Funktionsie findet?? Oder muss ich sie vielleicht in die Vc Projekt DAtei einbinden?
Danke trotdem schon mal für eure Anworten. :p Julian
[ Dieser Beitrag wurde am 02.07.2003 um 22:13 Uhr von jube editiert. ]
-
Die BMP-Datei sollte in dem Verzeichnis sein, wo auch die EXE ist. Allerdings wenn Du das Programm direkt aus Visual C++ ausführst (und die EXE ist ja im Ordner "Debug" oder "Release"), gilt das nicht. Grundsätzlich würde ich mir einen Unterordner "Data" oder "Daten" in den Projektordner machen und dann schreibst Du beim Laden "Data\\Wurst.bmp" oder so. Wichtig ist der doppelte Backslash, weil der Compiler sonst denkt, Du meintest eine Escape-Sequenz wie "\n" oder "\t".
-
Hallo!
Ich hab alles ausprobiert und es fuktioniert immer noch nicht. Die Fehlermeldung kommt genau an der Stelle an der ich die Datei öffne.
Kann des auch noch an was anderem liegen?Jedenfalls schon mal Danke für eure Antworten. mfg Julian
-
Wie wäre es denn, wenn Du uns mal den Code der Ladefunktion zeigst? Wie soll man Dir sonst helfen?
-
Hallo:
hier ist der Code:
// Oeffne Datei HANDLE Oeffne_Datei(const char* Datei_Name) { HANDLE hDatei; hDatei = CreateFile(Datei_Name,GENERIC_READ,FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); if(hDatei != INVALID_HANDLE_VALUE) return hDatei; return INVALID_HANDLE_VALUE; } // Lade Bitmap bool BMP_in_Surface(const char* BMP_Datei,LPDIRECTDRAWSURFACE7 lpDDSurf,bool Palette_laden) { LPBYTE lpbyBild; HANDLE hDatei; BITMAPFILEHEADER BMPFileHead; BITMAPINFOHEADER BMPFileInfo; RGBQUAD Palette[256]; DWORD dwLeseSpeicher; DDSURFACEDESC2 ddsd; LPSTR lpZielRAM; LPSTR lpQuellRAM; int DDS_Breite; int DDS_Hoehe; ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); lpDDSurf->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); DDS_Breite = ddsd.dwWidth; DDS_Hoehe = ddsd.dwHeight; if(!(lpbyBild=(LPBYTE)malloc(DDS_Breite*DDS_Hoehe))) return false; hDatei = Oeffne_Datei("BMP_Datei"); if(hDatei == INVALID_HANDLE_VALUE) return false; if(!ReadFile(hDatei,&BMPFileHead,sizeof(BMPFileHead),&dwLeseSpeicher,NULL)) { CloseHandle(hDatei); return false; } if(!ReadFile(hDatei,&BMPFileInfo,sizeof(BMPFileInfo),&dwLeseSpeicher,NULL)) { CloseHandle(hDatei); return false; } if((BMPFileInfo.biWidth != DDS_Breite) || (BMPFileInfo.biHeight != DDS_Hoehe) || (BMPFileInfo.biBitCount != 8)) { CloseHandle(hDatei); return false; } if(!ReadFile(hDatei,Palette,sizeof(Palette),&dwLeseSpeicher,NULL)) { CloseHandle(hDatei); return false; } if(!ReadFile(hDatei,lpbyBild,DDS_Breite*DDS_Hoehe,&dwLeseSpeicher,NULL)) { CloseHandle(hDatei); return false; } CloseHandle(hDatei); lpZielRAM = (LPSTR)ddsd.lpSurface; lpQuellRAM = (LPSTR)(&lpbyBild[(DDS_Hoehe-1)*DDS_Breite]); for(int j=0; j<DDS_Hoehe; j++) { memcpy(lpZielRAM,lpQuellRAM,DDS_Breite); lpZielRAM += ddsd.lPitch; lpQuellRAM -= DDS_Breite; } lpDDSurf->Unlock(NULL); if(lpbyBild) free(lpbyBild); if(Palette_laden) { PALETTEENTRY pe[256]; HRESULT ddrval; ZeroMemory(pe,MAX_FARBEN*sizeof(PALETTEENTRY)); for(int i=0; i<MAX_FARBEN; i++) { pe[i].peRed = Palette[i].rgbRed; pe[i].peGreen = Palette[i].rgbGreen; pe[i].peBlue = Palette[i].rgbBlue; pe[i].peFlags = PC_NOCOLLAPSE; } ddrval = lpDD->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256,pe,&lpDDPal,NULL); if(ddrval != DD_OK) { MessageBox(hwnd,"Bitmap Fehler: Create Palette","Bang",MB_ICONEXCLAMATION); return false; } ddrval = lpDDSPrimary->SetPalette(lpDDPal); if(ddrval != DD_OK) { MessageBox(hwnd,"Bitmap Fehler: Set Palette","Bang",MB_ICONEXCLAMATION); return false; } } return true; } bool Bilder_laden(PSPIELER pSprite,LPDIRECTDRAWSURFACE7 lpDDS,int Reihe,int Bild) { DDSURFACEDESC2 ddsd; DDSURFACEDESC2 ddsd2; LPSTR lpZielRam; LPSTR lpQuellRam; int DDS_ZEILENBREITE; if(!pSprite) return false; ZeroMemory(&ddsd2,sizeof(ddsd2)); ddsd2.dwSize = sizeof(ddsd2); lpDDS->Lock(NULL,&ddsd2,DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,NULL); DDS_ZEILENBREITE = ddsd2.lPitch; lpQuellRam = (LPSTR)ddsd2.lpSurface + Reihe - 1 * (DDS_ZEILENBREITE * pSprite->Hoehe)+ pSprite->Breite * Bild; lpDDS->Unlock(NULL); ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); pSprite->Akt_Bild->Lock(NULL,&ddsd,DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,NULL); lpZielRam = (LPSTR)ddsd.lpSurface; for(int y=0;y<pSprite->Hoehe;y++) { memcpy(lpZielRam,lpQuellRam,pSprite->Breite); lpQuellRam += DDS_ZEILENBREITE; lpZielRam += ddsd.lPitch; } pSprite->Akt_Bild->Unlock(NULL); return true; }
Ich hoffe ihr könnt mir jetzt helfen. mfg Julian
-
Nimm doch bitte die Ladefunktion aus dem SDK ist leicher und besser. Oder du gehst rüber zu zfx.info. Stefan sollte schon selber das asubaden was er angestellt hat
-
Hahaha...
Allein DAS ist ja schon geil...!!
if(hDatei != INVALID_HANDLE_VALUE) return hDatei; return INVALID_HANDLE_VALUE; }
-
@Sgt. Nukem:
So ähnlich wie:
int VariablenWert(int x) { if(x == 0) return 0; if(x == 1) return 1; if(x == 2) return 2; if(x == 3) return 3; if(x == 4) return 4; if(x == 5) return 5; if(x == 6) return 6; if(x == 7) return 7; if(x == 8) return 8; if(x == 9) return 9; if(x == 10) return 10; if(x == 11) return 11; if(x == 12) return 12; if(x == 13) return 13; if(x == 14) return 14; if(x == 15) return 15; if(x == 16) return 16; if(x == 17) return 17; if(x == 18) return 18; if(x == 19) return 19; if(x == 20) return 20; else return ERR_NOT_IMPLEMENTED_YET; }
-
Hallo!
Jetzt helft mir halt bitte. Ich hab jetzt schon alles ausprobiert was ich irgendwo an Informationen gefunden hab. Aber es funktioniert einfach nicht.
Aber trotzdem Danke, dass ihr mein Problem mit der Surface gelöst habt.
Ciao Julian
-
Vielleicht ist Dein Bitmap nicht im 8-Bit-Format?
Scheinbar beschränkt Stefan Zerbsts Funktion sich ja auch 8-Bit-Palettengrafik.
-
Aber der Fehler tritt ja nicht auf, wenn ich überprüfe ob die Datei im 8-Bit Format ist, sondern dann wenn ich die Datei öffnen will. mfg Julian
-
Was ist es denn für eine Fehlermeldung?
-
Hi,
ich hab ja eine Funktion geschrieben, die ich oben schon gepostet hab und die eine Datei öffnen soll. Dann hab ich halt eine MessageBox, die aufgerufen
wird wenn die Funktion den Wert false zurück gibt. Und jedesmal kommt die MessageBox. Ich hoffe, du wirst nicht langsam ungeduldig mit mir. Aber ich weiß echt nicht woran es liegen könnte. Die Suchfunktion hab ich auch schon benutzt, aber nichts gefunden.
-
Aber wo, also in welcher Zeile ist der Fehler? Wo bricht die Funktion ab und liefert false?
-
Hallo,
in der Funktion in der die bmp Datei geladen wird rufe ich ein einziges Mal die Funktion open(...) auf. Und daraufhin wird der Fehler zurückgegeben.
mfg Julian
-
Hmm, also in der Funktion, die Du hier gepostest hast, sehe ich nirgenwo ein "open".