Bilder animieren ? aber wie ?



  • Hallöchen liebe C++ Gemeinde,

    ich bin neu hier und habe sogleich eine Frage:

    ich programmiere derzeit an einem Tetris-Clone
    und würde gerne mein Hintergrund, was ich Blitte Animieren lassen.
    Ich weiß, das ich dazu ein Bild brauche,
    welches die Animation enthält sprich z.B.:

    Bildgröße 100x100 Pixel
    Pro 20*50 Pixel ein Bild
    das wären dann insgesammt 10 Bilder

    nun meine konkrete Frage:
    wie animiere ich nun dieses Bild ?

    so blitte ich derzeit mein hintergrundbild

    //-----------Ausschnit aus display.h

    #pragma once
    #include "ddutil.h"
    
    class display
    {
    private:
    	CDisplay dsply;		// Das Display
    	CSurface *hgrnd;	// Hintergrund
            ...
    
    public:
    
    	display(void);
    	void free_all();
    	HRESULT init( HWND wnd);
    	void hintergrund(){dsply.Blt(0, 0, hgrnd);}
    

    //-----------------Ausschnit aus Display.cpp

    void display::free_all()
    {
    
    	if( hgrnd)
    		delete hgrnd;
            ...
    }
    
    HRESULT display::init(HWND wnd)
    {
    	HRESULT hr;
    
    	hr = dsply.CreateWindowedDisplay(wnd, 360, 520);
    
    	if (hr < 0)
    		return hr;
    	hr = dsply.CreateSurfaceFromBitmap( &hgrnd, "ul_hgrnd.bmp", 360, 520);
            ....
    }
    
    HRESULT display::restore()
    {
    	HRESULT hr;
    
    	hr = dsply.GetDirectDraw()->RestoreAllSurfaces();
    
    	if (hr < 0)
    		return hr;
    	hr = dsply.CreateSurfaceFromBitmap( &hgrnd, "ul_hgrnd.bmp", 360, 520);
    }
    
    HRESULT display::present()
    {
    	HRESULT hr;
    
    	hr = dsply.Present();
    	if (hr == DDERR_SURFACELOST)
    		return restore();
    	return hr;
    }
    
    display::~display(void)
    {
    	free_all();
    }
    

    Wüßte jetzt jemand, wie ich das erweitern könnte ?
    würde mich über eine Antwort sehr freuen.

    Mit freundlichen Grüßen

    M3n70r



  • AFAIK musst DU das bei DX von Hand machen... also mit einem Timer vergleichen ob z.B. 50 ms abgelaufen sind und dann das nächtse Bild als Hintergrund Bild wählen... usw. ...



  • und genau das ist meine frage...wie mache ich das ?
    bin kein Visual C++ Profi 😞



  • Das einfachste ist, Du speicherst Deine verschiedenen Bilder in eigenen Dateien... ich bin leider überfragt ob man mit den DX Funktionen auch gezielt ein Bild aus einer Bilderliste laden kann...

    Und dann lädst Du abhängig von einem Zähler das passende Bild, z.B.:

    LPCTSTR szBild;
    switch(nCounter % 4)
    {
      case 1:
       szBild = _T("Bild1.bmp");
       break;
      case 2:
       szBild = _T("Bild2.bmp");
       break;
      case 3:
       szBild = _T("Bild3.bmp");
       break;
      default   szBild = _T("Bild0.bmp");
       break;
    }
    hr = dsply.CreateSurfaceFromBitmap( &hgrnd, szBild, 360, 520);
    

    Und den Zähler setzte Du z.B. mittels "SetTimer" dann in der entsprechenden OnTimer Funktion hoch...



  • Es gibt auch so ne MultiTexture-Methode. Damit kann man kleine Animationen herstellen. Wird z.B. auch für Explosionen benutzt. Habe aber gerade das Buch nicht hier. Kann auch erst morgen Mittag nachschauen.
    Notfalls schau mal bei www.spieleprogrammierer.de nach.
    Ist das Forum von David Scherfgen. Da können die dir das am Schnellsten beantworten. Ich habe mich erst recht wenig mit DirectX befasst. (und seit 2 Monaten gar nicht mehr)



  • ahh vielen dank, werde ich mal vorbeischauen.



  • Null Problemo! 🙂



  • also irgendwie funktioniert das alles nicht so wirklich, also habe ich folgendes versucht:

    http://www.codeproject.com/directx/basicdd.asp

    bloß stellt sich für mich nun die frage, wie ich
    ein 2tes oder mehrere bilder auf einmal Animiert bekomme ?
    mit dem beispiel mit dem auto gehts ja, auch mit meinen bildern,
    die ich erstellt habe, aber was muss ich machen, damit ich 2 oder mehr animationnen nebeneinander bekomme ??



  • Vielleicht hilft dir das hier weiter:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-119606-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.html

    Da wird beschrieben, wie man ersteinmal einige Bilder in einem Backbuffer lädt und dann gemeinsam auf dein DC blittest.
    EDIT: Mist, vergessen, dass du ja dx benutzt. 🤡

    EDIT2: Ansonsten kann ich dir das Buch von David Scherfgen empfehlen.
    Dort wird einmal eine render- und eine move-Funktion genutzt.
    Erst alles im Backbuffer und dann gleichzeitig ausgegeben.



  • jut, also immer noch keine lösung 😞
    hat keiner von euch schonmal 2 oder mehr bilder animiert in seinem Prog/Spiel ...
    was auch immer dargestellt ?
    Natürlich mit MFC und DirectX und in 2D ^^



  • MFC hat mit DirectX wenbig zu tun, deswegen wirst Du hier zu DirectX vermutlich keine Antwort finden...
    Du kannst es im Spieleforum (http://www.c-plusplus.net/forum/viewforum-var-f-is-7.html) oder einem dedizierten DirectX-Forum versuchen (http://forums.microsoft.com/MSDN/default.aspx?forumgroupid=20&siteid=1)...


Anmelden zum Antworten