Clipping mit DirectDraw
-
XCoder++ schrieb:
hat aber nicht funktioniert!?
vermutlicht hast du etwas falsch gemacht?
-
Ich hab den Code jetzt nicht vor mir, aber ich glaube es war so:
CDisplay display; CSurface bild; //... HRESULT hr; hr = display.CreateFullScreenDisplay( display, breite, hoehe, 16); if( hr < 0) return hr; hr = display.InitClipper(); if( hr < 0) return hr; hr = display.CreateSurfaceFromBitmap( bild, "bild.bmp", 120, 120) //...Kann mir niemand sagen was ich falsch gemacht habe (haben könnte) ???
-
Naja, vielleicht ein wenig mehr Code herzeigen (und nicht geratenen bitte), und vor allem: WAS genau geht denn nicht?
Ohne dass wir wissen was du erwartest und was passiert können wir dir schwer helfen.
-
Den genauen Code muss ich später noch posten - mach grad Praktikum - aber das Problem ist das Clipping. Die Dateien die im Bildschirmbereich liegen werden angezeigt, die außerhalb bzw. dazwischen nicht!
-
Nun, hier ist der (wichtige und etwas verkürzte) Code:
#include <windows.h> #include <ddraw.h> #include "ddutil.h" const int breite = GetSystemMetrics( SM_CXSCREEN); const int hoehe = GetSystemMetrics( SM_CYSCREEN); class display { private: CDisplay c_display; CSurface *c_hintergrund; CSurface *c_karte; public: display(); ~display() {free_all();} void free_all(); void hintergrund() { c_display.Blt( 0, 0, c_hintergrund);} void karte() { c_display.Blt( breite -200, 0, c_karte);} void update(){ c_display.UpdateBounds();} HRESULT init( HWND wnd); HRESULT cooperative(){return c_display.GetDirectDraw()->TestCooperativeLevel();} HRESULT restore(); HRESULT present(); }; display::display() { c_hintergrund = 0; c_karte = 0; } void display::free_all() { if( c_hintergrund) delete c_hintergrund; if( c_karte) delete c_karte; } HRESULT display::init( HWND wnd) { HRESULT hr; hr = c_display.CreateFullScreenDisplay( wnd, breite, hoehe, 16); if( hr < 0) return hr; hr = c_display.InitClipper(); if( hr < 0) return hr; hr = c_display.CreateSurfaceFromBitmap( &c_hintergrund, "hintergrund.bmp", breite, hoehe); if( hr < 0) return hr; hr = c_display.CreateSurfaceFromBitmap( &c_karte, "karte.bmp", 300, 300); c_karte->SetColorKey( RGB( 0, 0, 254)); if( hr < 0) return hr; return S_OK; } HRESULT display::restore() { HRESULT hr; hr = c_display.GetDirectDraw()->RestoreAllSurfaces(); if( hr < 0) return hr; hr = c_hintergrund->DrawBitmap( "hintergrund.bmp", breite, hoehe); if( hr < 0) return hr; hr = c_karte->DrawBitmap( "karte.bmp", 300, 300); if( hr < 0) return hr; return S_OK; } HRESULT display::present() { HRESULT hr; hr = c_display.Present(); if( hr == DDERR_SURFACELOST ) return restore(); return hr; } display spiel_display; //...
Wer mit ddutil.h, also CDisplay, CSurface, CreateFullScreenDisplay usw. nichts anfangen kann, der sollte mal hier reinschauen. 
thx
-
Versteht mich denn keiner, sind die Fragen zu dumm oder warum antwortet ihr nicht??? Kann doch nicht so schwer sein...
Ich weiß, DirectDraw ist nicht mehr das neuste, aber ich werde ja wohl nicht der letzte sein, der damit proggt...
Ich nehme Kritik an, sagt mir was faul ist!!!
-
Ich glaube, keiner hat Lust, sich von überall her die benötigten Zusatzdateien zu suchen, um es auszuprobieren. Wie wäre es, wenn du eine Zip-Datei hochlädst, wo alles drin ist, was man braucht - was man sofort kompilieren kann?
-
Ich glaube, keiner hat Lust, sich von überall her die benötigten Zusatzdateien zu suchen, um es auszuprobieren.
Ist doch bloß eine Datei!

Wie wäre es, wenn du eine Zip-Datei hochlädst, wo alles drin ist, was man braucht - was man sofort kompilieren kann?
Du meinst, das hätte Erfolg?? Ich hab nicht den Eindruck, als wenn jemand das machen würde...
Versuchen kann ich es ja - wie/ wo lade ich Dateien hoch?
-
ich kann mir unter "hat aber nicht funktioniert" so ziemlich garnichts vorstellen, da kann ich nichts helfen.
-
Die Dateien die im Bildschirmbereich liegen werden angezeigt, die außerhalb bzw. dazwischen nicht!
Geht das nochmal auf Deutsch?
Hast du Explorer Fenster in deinem Spiel offen oder von was für Dateien sprichst du?
Und wie um alles in der Welt soll etwas was ausserhalb des Bildschirms liegt angezeigt werden???
-
Sorry, hab mich wohl etwas chinesisch ausgedrückt.

Jetzt nochmal auf deutsch:Ich habe einen Fullscreen (kein Windows-Fenster!):
hr = c_display.CreateFullScreenDisplay( wnd, breite, hoehe, 16);Auf diesen blitte (oder wie das heißt) ich die verschiedenen Bitmap-Grafiken:
hr = c_display.CreateSurfaceFromBitmap( &c_hintergrund, "hintergrund.bmp", breite, hoehe);Soweit, so gut. Aber wenn ich beispielsweise eine Grafik mit den Abmessungen 200*200 (Pixel) an die Koordinaten 0, -100 heften will, wird garnichts angeziegt, obwohl ich den Clipper gesetzt habe.
Ich habe auch schon versucht den InitClipper an anderen Stellen einzusetzten, ohne Erfolg.

-
Ok, jetzt hab' ich verstanden was du meinst.
Nächstes mal erspar uns und dir Ärger und schreib es gleich so.Du musst wohl BltFast durch Blt ersetzen schätze ich. BltFast unterstützt laut MSDN keine Clipper.
Natürlich musst du dazu auch alle DDBLTFAST_XXX Flags gegen DDBLT_XXX Flags tauschen.Und du solltest bei Blt auf jeden Fall das DDBLT_WAIT Flag mitgeben. Grundsätzlich. Immer. No kiddin'.
Das ist eine recht kleine Änderung in der "Display" Klasse, ich bin sicher das bekommst du hin

Wenns dann immer noch nicht geht... schreib halt nochmal.
-
Danke erstmal für die Antwort

Falls es nicht geht, schreib ich später nochmal.
später = wenn ich zu Hause bin 
-
Moment mal, ...

ich habe weder BltFast, noch DDBLTFAST verwendet - wenn ich nichts übersehen habe!
Und DDBLT_WAIT ist auch da (ich nehme an du meintest das hier, Zeile 399/400).
Hast du überhaupt meinen Code beachtet??
-
Ich meine Zeilen 453 und 469, da wird BltFast verwendet UND es fehtl das XXX_WAIT Flag. In Zeile 508 fehlt dann wieder das DDBLT_WAIT Flag. Ob du die betreffenden Funktionen verwendest kann ich auch nur raten, da du ja den relevanten Code nicht herzeigst, aber ich nehme es schon an, wie willst du sonst irgendwelche geladenen Bitmaps auf den Schirm bringen?
Und frag mich nicht nochmal ob ich deinen Code beachtet habe, sonst fahr ich gleich aus der Haut. Hast du denn meinen Input beachtet? Hast du auch nur 1 Sekunden "verschwendet" um in dem von dir verlinkten (und wohl auch verwendeten) Dings nach BltFast zu suchen?
-
Ich meine Zeilen 453 und 469, da wird BltFast verwendet UND es fehtl das XXX_WAIT Flag.
Wenn ich es aber nun mal nicht verwende?!
In meinem Code kommt nur Blt vor, kein BltFast oder so was.da du ja den relevanten Code nicht herzeigst
Wenn es ums Clipping geht - welchen Code soll man denn bitte sonst zeigen? In dem kommt doch alles vor.
Hast du auch nur 1 Sekunden "verschwendet" um in dem von dir verlinkten (und wohl auch verwendeten) Dings nach BltFast zu suchen?
Sehr wohl hab ich das. Aber die Funktionen, die ich nicht verwende sind doch wohl irrerelevant!

Es muss also woanders der Haken liegen.
-
Ich meine Zeilen 453 und 469, da wird BltFast verwendet UND es fehtl das XXX_WAIT Flag.
Wenn ich es aber nun mal nicht verwende?!
In meinem Code kommt nur Blt vor, kein BltFast oder so was.Was verwendest du nicht? Natürlich verwendest du es. Halt nicht direkt, aber indirekt.
Guck dir mal deine Funktionen "hintergrund" und "karte" an, was rufen die wohl auf? Die rufen CDisplay::Blt auf. Und was wird in CDisplay::Blt aufgerufen? IDirectDrawSurface7::BltFast.
Du musst also den Code in "ddutil.cpp" fixen.
Die entsprechenden Zeilen hab' ich dir ja schon geschrieben.Nu mach es oder lass es bleiben.
-
HRESULT CDisplay::Blt( DWORD x, DWORD y, CSurface* pSurface, RECT* prc ) { if( NULL == pSurface ) return E_INVALIDARG; if( pSurface->IsColorKeyed() ) return Blt( x, y, pSurface->GetDDrawSurface(), prc, DDBLTFAST_SRCCOLORKEY ); else return Blt( x, y, pSurface->GetDDrawSurface(), prc, 0L ); }(Zeile 475-488)
Also da kann ich beim besten Willen kein BltFast erkennen!?
Und falls du
HRESULT CDisplay::Blt( DWORD x, DWORD y, LPDIRECTDRAWSURFACE7 pdds, RECT* prc, DWORD dwFlags ) { if( NULL == m_pddsBackBuffer ) return E_POINTER; return m_pddsBackBuffer->BltFast( x, y, pdds, prc, dwFlags ); }meintest - ich rufe ja keine LPDIRECTDRAWSURFACE und auch keine Flags in meinem Blt auf! :p
@hustbaer: bitte schreib nur noch weiterbringende Antworten - thx
-
Ich habe nur "weiterbringende Antworten" geschrieben, wenn du es nicht verstehst kann ich doch nix dafür.
Was glaubst du welche Funktion mit "return Blt(x, y, pSurface->GetDDrawSurface(), prc, DDBLTFAST_SRCCOLORKEY);" aufgerufen wird???
Eine DirectDraw Funktion KANN es nicht sein, da dann etwas wie "ptr->Blt(...)" dastehen müsste. Tut es aber nicht, es steht einfach nur "Blt(...)" da, und das ist implizit "this->Blt(...)". Und *this ist eben ein CDisplay. Wenn du dir die Parameterliste anguckst wirst du feststellen dass sie genau mit der 2. von dir geposteten Funktion übereinstimmt, in der dann BltFast aufgerufen wird.Anders gesagt: du rufst "CDisplay::Blt(DWORD, DWORD, CSurface*, RECT*)" auf,
"CDisplay::Blt(DWORD, DWORD, CSurface*, RECT*)" ruft "CDisplay::Blt(DWORD, DWORD, LPDIRECTDRAWSURFACE7, RECT*, DWORD)" auf, und
"CDisplay::Blt(DWORD, DWORD, LPDIRECTDRAWSURFACE7, RECT*, DWORD)" ruft IDirectDrawSurface7::BltFast auf.Ich weiss echt nicht was daran so schwer zu verstehen ist. Wenn du mir immer noch nicht glaubst dann schreib doch einfach vor jedes BltFast welches du in ddutil.cpp findest ein "::OutputDebugStringA("BltFast in Zeile XXX\n");" rein, dann wirst du schon sehen ob der Code ausgefürht wird oder nicht.
Alternativ, wenn du 2 Bildschrime hast und es hinbringst mit 2 Schirmen eine Fullscreen Applikation zu debuggen, kannst du auch mit dem Debugger reinsteppen, dann wirst du sehr deutlich sehen was wo wie aufgerufen wird.
Und lern C++. Und Programmieren. Und Fehler Suchen.
-
Sry, aber wie änder ich BltFast in Blt um?
Man kann ja nicht einfach BltFast durch Blt ersetzen!