Sprite Draw() Frage



  • Also..

    int render()
    {
            static DWORD m_dwLastAnimationCount=0;
        static bool countAnimations=false;
        static float clouds_x=0.2f;
        static int movementspeed=30;
    
        if (abs(GetTickCount() - m_dwLastAnimationCount) >= movementspeed)   {
            m_dwLastAnimationCount = GetTickCount();
            countAnimations=true;
        }
        else {
            countAnimations=false;
        }
    
        m_sprite->Begin();
    
        //die Wolken ------------
        m_sprite->Draw(m_texture_clouds1, NULL, NULL, NULL, 0.0f, &D3DXVECTOR2(clouds_x,0), 0xBBFFFFFF);
    
        // Wolke die wieder hinten ran gezeichnet wird
        m_sprite->Draw(m_texture_clouds1, NULL, NULL, NULL, 0.0f, &D3DXVECTOR2(800.0f+clouds_x,0), 0xBBFFFFFF);
    
        m_sprite->End();
    
        if(countAnimations==true) {
            clouds_x-=0.2f;
    
            if(clouds_x<=-800.0f) {
                clouds_x=0.0f;
            }
            countAnimations=false;
        }
    }
    

    habs mal ganz simpel gemacht. Wolke rutscht über den Screen.. und eine 2te wird Rechts rangeblittert damit es sich immer loopt. Hatte es vorher mit RECT gemacht. damit immer nur das Rechts rangeblittert wird, was Links ausm Bild rutscht.

    Das Problem ist jetzt, dass ich ja pro Durchlauf (und wenn countAnimations==true) ist clouds_x um -0.2f verkleinere (float). Läuft auch alles ganz smooth, aber das was ich Rechts wieder ranblitte, damit es sich loopt, das zuckelt hinten dran rum, so dass ein schwarzer Balken entsteht. ich denke mal das er float in int umrechnet und nur bei Ganzzahlen weiterrutscht, obwohl ja D3DXVECTOR2 2 floats als Parameter hat. Auflösung benutze ich 800x600, darum auch das "800.0f+clouds_x".

    Wäre für Hilfe sehr dankbar!! 😞



  • , so dass ein schwarzer Balken entsteht.

    Sehr rudimentäre Lösung :

    Versuche mal eine kleine Überlappung der beiden Sprites einzubauen, dann sollte man wenigstens den schwarzen rand nicht mehr sehen! Nimm mal ein Pixel als Überlappung!

    PH



  • Ich würde halt z.B. für das zeichnen ein clouds_draw_x (int) berechnen, in dem du dir dein clouds_x (float) rundest. Dieses verwendest du dann zum Zeichnen!
    Durch Rundungen könnte dieses Problem verursacht werden, je nach den, wie DirectDraw es anstellt. Zur Verdeutlichung:

    clouds_x = -399.4;
    erstes Draw zeichnet von -399.4 (-400) bis 399
    800.0+(-399.4)=400.6
    zweites Draw zeichnet von 400.6 (401) bis 1200

    Versuch's mal so:

    beim ersten (int)clouds_x
    beim zweiten 800-(int)clouds_x

    Eigentlich hab ich gar keine Ahnung, aber sowas in der Art sehe ich halt als mögliche Ursache

    [ Dieser Beitrag wurde am 23.01.2003 um 22:44 Uhr von flenders editiert. ]



  • ja so mit dem INT funktioniert es, nur istr das scrolling dann nicht mehr so smooth wie ich es eigentlich haben wollte, jetzt scrollt er immer um 1 weiter.. vorher ja um 0.2

    das mit dem überlappen habe ich auch schon ausprbiert:D .. das Problem ist, dass die Wolken eine gewisse durchsichtigkeit haben.. aus dem schwarzen Balken wird dann ein weißer Balken:)

    [ Dieser Beitrag wurde am 23.01.2003 um 23:35 Uhr von personenkult editiert. ]



  • Eigentlich sollte das mit dem int noch genauso aussehen (intern arbeitest du ja weiterhin mit floats)! DirectDraw wird das intern ja wohl auch auf ganze Zahlen runden, oder? Oder verwendet es dann tatsächlich antialising um z.B einen Block von 0.6 bis 100.6 zu zeichnen, anstatt ihn von 0 bis 100 bzw. 1 bis 101 zu zeichnen?



  • ja sieht so aus.. das Bild scrollt viel smoother (wirklich sichtbar!) nur an den Kanten interpoliert er wild rum und es "flackert", "zuckelt" an den Kanten.


Anmelden zum Antworten