Clipping mit DirectDraw



  • Es gibt kein DirectDraw 9

    Dann lass ich ab jetzt die 9 weg :p

    diese Funktion ist kein Bestandteil von DirectDraw, sondern wohl aus einem Tutorial

    Kannst du (oder jemand anderes) mir trotzdem sagen wie das Clipping (meinetwegen auch ohne InitClipper) funktioniert??


  • Mod

    vermutlich genau das was der name sagt. wo genau liegt nun das problem?



  • Also ich habe versucht den InitClipper (ab Zeile 666) nach CreateFullScreenDisplay zu setzten, hat aber nicht funktioniert!?


  • Mod

    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?


  • Mod

    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.


Anmelden zum Antworten