JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=320b6c692397d65e03984c5acf016c6fMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Bitmaps auf primärer Oberfläche ausgeben
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 10.07.2005, 12:24    Titel: Bitmaps auf primärer Oberfläche ausgeben Antworten mit Zitat

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 Rolling Eyes
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 12:33    Titel: Antworten mit Zitat

Was für ein Errorcode wird zurückgegeben?
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 12:36    Titel: Antworten mit Zitat

Ö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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 12:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 12:40    Titel: Antworten mit Zitat

Alle Funktionen geben ein HRSESULT zurück, sprich der Errorcode.
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 12:43    Titel: Antworten mit Zitat

OLiver
[klugscheißmodus]

CPP:
IDirect3D9 *Direct3DCreate9(unsigned int SDKVersion);


[/klugscheißmodus]

Never say "all" Very Happy

- Patrick
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 12:43    Titel: Antworten mit Zitat

Axo, der Errorcode ist
E_INVALIDARG
Sprich, falsches Argument? hmm..
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 12:49    Titel: Antworten mit Zitat

Ist das Surface evtl. Null.
Dann solltest du auch auf den Back- und nicht auf den Frontbuffer blitten.

edit:


DDBLT_WAIT != DDBLTFAST_WAIT Wink
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 12:54    Titel: Antworten mit Zitat

[edit]

Mit DDBLTFAST_WAIT geht. Im Buch ist dann aber ein Fehler...nagut. Danke erstmal Smile
Nun wird zwar das Bild mehr oder weniger angezeigt, also ich seh nur Streifen. Surprised

Hier mal ein Bild davon:

_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 13:04    Titel: Antworten mit Zitat

Hast du auf den BackBuffer geblittet und dann Flip aufgerufen?
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 13:09    Titel: Antworten mit Zitat

Ä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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 15:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 15:25    Titel: Antworten mit Zitat

Confused 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 15:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 10.07.2005, 16:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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

Impressum