|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 10.07.2005, 12:24 Titel: Bitmaps auf primärer Oberfläche ausgeben |
|
|
Hi,
sorry, das ich schon wieder einen Thread erstelle, aber ich brauch mal wieder eure Hilfe.
Ich bin jetzt bei dem Kapitel Oberflächen und Sprites angekommen (1. Buch).
Bild wird, soweit ich es erkennen kann, auch geladen, aber leider nicht angzeigt. Ich poste einfach mal den Quellcode, ist denk ich am einfachsten.
Hier die Funktion zum BildLaden:
CPP: | LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPDIRECTDRAW7 lpDD7, LPSTR File, int dWidth, int dHeight)
{
// Device Context für das Bild und die Pberfläche
HDC hBmDC, hSurfDC;
// Handle der zu ladenden Bitmap
HBITMAP hBM;
// Oberflächenberechnung
DDSURFACEDESC2 SurfDesc;
// Zeiger auf die Oberfläche
LPDIRECTDRAWSURFACE7 lpDDSurface;
// Bild laden
hBM = (HBITMAP)LoadImage(0,File,IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE);
// ist ein Fehler während des Ladens aufgetreten?
if (hBM == NULL)
{
return NULL;
}
// Oberflächenbeschreibung initialisieren
ZeroMemory(&SurfDesc,sizeof(SurfDesc));
SurfDesc.dwSize = sizeof(SurfDesc);
// Caps, Höhe und Breite sollen berücksichtg werden
SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT || DDSD_WIDTH;
SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
SurfDesc.dwWidth = dWidth;
SurfDesc.dwHeight = dHeight;
// Oberfläche anlegen
if (FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL)))
{
return NULL;
}
// Device Context dr Oberfläche holen
lpDDSurface->GetDC(&hSurfDC);
// kompatiblen Device Context für das Bild anlegen
hBmDC = CreateCompatibleDC(hSurfDC);
// Bild in den Device Context holen
SelectObject(hBmDC,hBM);
// Bild in die Oberfläche kopieren
BitBlt(hSurfDC,0,0,dWidth,dHeight,hBmDC,0,0,SRCCOPY);
// Device Context freigeben
lpDDSurface->ReleaseDC(hSurfDC);
// Device Context und Bild löschen
DeleteDC(hBmDC);
// Grafik löschen
DeleteObject(hBM);
// Zeiger auf die Oberfläche zurückgeben
return lpDDSurface; |
Und hier wird sie aufgerufen:
CPP: | // Zeiger auf das DirectDraw-Objekt
LPDIRECTDRAW7 lpDD7 = NULL;
// Zeiger auf die primäre Oberfläche
LPDIRECTDRAWSURFACE7 lpDDSPrimary = NULL;
// Zeiger auf weitere Surface
LPDIRECTDRAWSURFACE7 lpDDSurface = CreateSurfaceFromBitmap(lpDD7,"\\gfx\\jli.bmp",250,250); |
und auf die primäre Oberfläche kopiert:
CPP: | void Render(void)
{
// die Oberfläche an die Position (10,10) auf die primäre Oberfläche kopieren
if(FAILED(lpDDSPrimary->BltFast(10,10,lpDDSurface,NULL,DDBLT_WAIT)))
{
Error("Fehler beim Kopieren der Bitmap");
}
} |
Hier mal die Funktion "InitDirectDraw":
CPP: | // DirectDraw initialisieren
BOOL InitDirectDraw(HWND hWnd)
{
// DirectDraw-Objekt anlegen
if (FAILED(DirectDrawCreateEx(NULL,(LPVOID*)&lpDD7,IID_IDirectDraw7,NULL)))
{
Error("Fehler beim Anlegen eines DirectDraw-Objektes");
}
// Kooperationseben setzen
if (FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_NORMAL)))
{
Error("Fehler beim Setzen der Kooperationsebene");
}
// PRIMÄRE OBERFLÄCHE ANLEGEN
// Struktur zur Beschreibung einer Oberfläche
DDSURFACEDESC2 ddsd;
// Initialisieren und Größe festlegen
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
// Die Angabe dwCaps soll berücksichtig werden
ddsd.dwFlags = DDSD_CAPS;
// Es soll eine primäre Oberfläche angelegt werden
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY;
// Primäre Oberfläche anlegen
if (FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
{
Error("Fehler beim Anlegen der primären Oberfläche");
}
// EINE WEITERE OBERFLÄCHE ANLEGEN
// Struktur zur Beschreibung einer Oberfläche
DDSURFACEDESC2 SurfDesc;
// Initialisieren und Größe festlegen
ZeroMemory(&SurfDesc,sizeof(SurfDesc));
SurfDesc.dwSize = sizeof(SurfDesc);
// Caps, Höhe und Breite sollen berücksichtig werden
SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
// Es soll eine primäre Oberfläche angelegt werden
SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
// Breit und Höhe festlegen
SurfDesc.dwWidth = 800;
SurfDesc.dwHeight = 600;
// Oberfläche anlegen
if (FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL)))
{
Error("Fehler beim Anlegen der Oberfläche");
}
return true;
} |
Kompilieren geht, aber wenn ich das Programm starte, bekomme ich eine MsgBox mit "Fehler beim Kopieren der Bitmap", also diese Funktion hier schlägt fehl:
CPP: | // die Oberfläche an die Position (10,10) auf die primäre Oberfläche kopieren
if(FAILED(lpDDSPrimary->BltFast(10,10,lpDDSurface,NULL,DDBLT_WAIT)))
{
Error("Fehler beim Kopieren der Bitmap");
} |
Tut mir leid, dass ich so viel Code posten muss, aber anders ist es eben sehr schwer zu erklären.
Was ich aber nicht ganz verstehe und auch nicht aus dem Buch hervorgeht, ist die Funktion " InitDirectDraw", von der ihr hier auch den Code habt. Ich komme irgendwie gar nicht mehr mit den ganzen Oberflächen klar, welche ist fürs Bild, auf welche muss ich kopieren, welche stellt dann alles dar. Denn im Buch wird immer nur alles fortgesetzt aber nie geschrieben, welche Oberflächen man nicht mehr braucht.
Wäre also nett, wenn ihr das auch noch dazu schreiben könnten.
Gruß und Danke
Otti, der denkt, dass er ziemlich nerven muss _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 10.07.2005, 12:33 Titel: |
|
|
Was für ein Errorcode wird zurückgegeben? _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 10.07.2005, 12:36 Titel: |
|
|
Öhhmm...wie find ich den denn heraus? Wenn ich bei der Funktion nen Haltepunkt mache und im DebugModus ausführe, dann zeigt er mir auch keinen Errorcode an.
[edit]
Oder meinst du das hier:
Zitat: | Fehler beim Kopieren der Bitmap/nDas Programm "[3000] BitmapsInOberflaeche.exe: Systemeigen" wurde mit Code -2147483644 (0x80000004) beendet. |
_________________ Meine kleine Projekte-Seite
Zuletzt bearbeitet von t10ottoo am 10.07.2005, 12:39, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 10.07.2005, 12:39 Titel: |
|
|
Hi,
mit Fast jede DirectX Funktion gibt ein HRESULT (long) zurück.
Ergo könntest Du es so abfragen:
CPP: | long result = MeineDX-Funktion(blalba);
if (result != DD_OK)
{
// Fehler! nun hier unterschieden:
if (result != DD_XXXX) // Fehlercodes stehen in der DX-Doku
} |
_________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 10.07.2005, 12:40 Titel: |
|
|
Alle Funktionen geben ein HRSESULT zurück, sprich der Errorcode. _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 10.07.2005, 12:43 Titel: |
|
|
Axo, der Errorcode ist
E_INVALIDARG
Sprich, falsches Argument? hmm.. _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 10.07.2005, 12:49 Titel: |
|
|
Ist das Surface evtl. Null.
Dann solltest du auch auf den Back- und nicht auf den Frontbuffer blitten.
edit:
DDBLT_WAIT != DDBLTFAST_WAIT _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 10.07.2005, 12:54 Titel: |
|
|
[edit]
Mit DDBLTFAST_WAIT geht. Im Buch ist dann aber ein Fehler...nagut. Danke erstmal
Nun wird zwar das Bild mehr oder weniger angezeigt, also ich seh nur Streifen.
Hier mal ein Bild davon:
_________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 10.07.2005, 13:04 Titel: |
|
|
Hast du auf den BackBuffer geblittet und dann Flip aufgerufen? _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 10.07.2005, 13:09 Titel: |
|
|
Ähhmm, geblittet hab ichs auf hSurfDC, also wies in der Funktion CreateSurfaceFormBitmap steht (Code oben).
Was Flip ist, weiß ich nicht. Habs dann einfach mit BltFast auf die primäre Oberfläche kopier. _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.07.2005, 15:13 Titel: |
|
|
Blit
(Bit Block Transfer) bezeichnet man einen Kopiervorgang, der von der Grafikkarte durchgeführt wird.
Flip
Wechseln der Startadressen der Puffer, die du verendest(z.B. Doublebuffering)beim Umschalten eines vertikalen Stahlrücklaufs(neuzeichnen aller Pixel des nächsten Bildes). Durch das verwenden 2er(oder mehrere) Puffer für das Zeichnen der Bilder entsteht kein unangenehmes Flackern mehr auf dem Bildschirm. Im Videospeicher des Computers(VRAM) wird jedes Bild in FOrm eines linearen Arrays gespeichert. Jedes Arrayelement bezeichnet einen einzelnen Pixel und den dazugehörigen Farbwert. Bei der Bilderzeugung wird direkt auf einen bestimmten Bereihc des VRAMs zugegriffen. Dieser Schrittweise Aufbau jedes neuen Frames beansprucht nämlich einige Zeit, das mnact sich auf dem Bildschirm als lästiges Flackern bemerkbar. Beim Verwenden 2er Puffer wird in dem Vorgang, in dem ein neues Bild auf den Bildschirm geflippt wird, das nächste Bild im 2ten Puffer gespeichert. Bei Flippen des nächsten Bildes werden eifach die Adressen des einen Puffers dem anderen Zeiger zugeordnet.
Gruß DirectXer, der Aufklärer |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 10.07.2005, 15:25 Titel: |
|
|
Deinen Vortrag über Flip hab ich leider nicht wirklich verstanden...Und es flimmert ja jetzt nicht, wird gleich so angezeigt, flimmern würd ich ja merken.
Wenns flimmern würde, würde das Bild ja trotzdem richtig angezeigt werden, also man würde ja ja dennoch erkennen, aber so...
Vlt. biste ja bald wieder im Chat, können wa da weiterquatschen :/ _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 10.07.2005, 15:50 Titel: |
|
|
Den BackBuffer erhälst du mit
CPP: | LPDIRECTDRAWSURFACE7 backbuffer;
DDSCAPS2 dc;
ZeroMemory(&dc,sizeof(dc));
dc.dwCaps = DDSCAPS_BACKBUFFER;
if(frontbuffer.surface->GetAttachedSurface(&dc, &backbuffer.surface))
return 0;
|
Darauf musst du alles blitten
CPP: | Danach rufst du primary->Flip(...)
|
danach aufrufen. _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 10.07.2005, 16:03 Titel: |
|
|
Hab das Hin-und Herkopiert und bekomms einfach nicht hin. Bekomm da lauter Fehlermeldungen mit deinem Code.
Ich hab hier das Projekt mal hochgeladen. Wäre nett, wenn du dir das mal genauer anschauen könntest und mir dann genau sagen könntest, was ich alles ändern muss. In Christians Buch steht gar nichts vom Flippen bei diesem Kapitel.
Hier der Link:
http://www.hobby-corner.de/BitmapsInOberflaeche.zip
Und mir ist nochwas aufgefallen. Wenn ich diese Zeile hier:
CPP: | LPDIRECTDRAWSURFACE7 lpDDSurface = CreateSurfaceFromBitmap(lpDD7,"\\gfx\\main.bmp",250,250); |
durch das hier ersetze:
CPP: | LPDIRECTDRAWSURFACE7 lpDDSurface = NULL |
dann erscheint trotzem dieses komische WirrWarr. Kann es denn dann sein, dass er noch nichtmal das Bild richtig lädt? _________________ Meine kleine Projekte-Seite |
|
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
|