DirectDraw Tile Animation



  • Ich bin ja schonmal froh das überhaupt wer antwortet 🙂
    Mit deinen Pseudo Code kann ich leider so gar nicht viel Anfangen 😕

    Ein Bild anzeigen kann ich aufjedenfall auch schon aber das mit den Tile Animationen verstehe ich ja so gar nicht 😕
    Zumal ich nun immernochnicht weiss ob ich das nun mit StretchBlt oder womit auch immer machen muss.
    Wenn mir da nochmal wer helfen könnte 🙂

    Gruß Patrick 🙄



  • besser als strechBLT ist FastBlt



  • für Animieren von Sprites sah bei mir so aus (war allerdings für D3D9) - vielleicht kannst du dir etwas abschauen:

    /*
    		Jedes Sprite erhaelt eine Info Datei in der die Inforamtionen, die in folgender
    		Struktur gespeichert werden, enthaelten sind
    	 */
    	struct INFO
    	{
    	char	filename[200];						// Dateiname der zu verwenden Quellbilddatei
    	float	frame_pixel_width;					// Breite des Sprites in Pixel
    	float	frame_pixel_height;					// Hoehe des Sprites in Pixel
    	float	texture_pixel_width;				// Breite der Quellbilddatei in Pixel
    	float	texture_pixel_height;				// Hoehe der Quellbilddatei in Pixel
    	float	position_x;							// Initialisierungsposition
    	float	position_y;							// Initialisierungsposition
    	float	cell_space_pixel_width;				// Staerke der Trenungsline in Pixel
    	float	frames_per_row;						// Frames in einer Zeile
    	float	start_frame;						// Start Frame der Animation (0 bezeichnet das erste Frame der Animation)
    	float	end_frame;							// Letztes Frame der Animation
    	float	animation_speed;					// Geschwindigkeit in Millisekunden mit der die Frames wechseln
    	};
    

    Beispieldatei:

    filename plasma.bmp
    frame_pixel_width 16
    frame_pixel_height 24
    texture_pixel_width 64
    texture_pixel_height 64
    position_x 0
    position_y 0
    cell_space_pixel_width 0
    frames_per_row 6
    start_frame 0
    end_frame 0
    animation_speed 30
    
    void Modify_VertexBufferEx(float x, float y, float frame, float scale_factor = 1.0f)
    	{
    		// Vertex Farben setzen
    		VertexBuffer[0].color = VertexBuffer[1].color = VertexBuffer[2].color = VertexBuffer[3].color = 0xffffffff;
    
    		// Vertexbuffer initialisieren
    		VertexBuffer[0].x = VertexBuffer[3].x = 0;
    		VertexBuffer[1].x = VertexBuffer[2].x = Info.frame_pixel_width * scale_factor;
    
    		VertexBuffer[0].y = VertexBuffer[1].y = Info.frame_pixel_height * scale_factor;
    		VertexBuffer[2].y = VertexBuffer[3].y = 0;
    
    		VertexBuffer[0].z = VertexBuffer[1].z = VertexBuffer[2].z = VertexBuffer[3].z = 1.0f;
    
    		/// Texturkoordinaten berechnen
    
    		// Texturkoordinaten
    		float frame_borders_in_texel_left	= 0;
    		float frame_borders_in_texel_right	= 1;
    		float frame_borders_in_texel_top	= 0;
    		float frame_borders_in_texel_bottom = 1;
    
    		//// Berechnung
    
    		/// Zeile und Spalte ermitteln
    		int zeile=0;
    		// Hier soll nur sichergestellt werden dass nicht durch null geteilt wird
    		if(Info.frames_per_row == 0)
    		{
    			zeile=0;
    		}
    		else
    		{
    			// In welcher Zeile befindet sich das Frame?
    			zeile = frame / Info.frames_per_row;
    		}
    
    		// In welcher Spalte befindet sich das Frame?
    		int spalte = frame - (zeile * Info.frames_per_row);
    
    		/// Pixelkoordinaten ermitteln
    		// Zeile und Spalte des Frames sind nun bekannt 
    
    		float frame_borders_in_pixel_left	= spalte * Info.frame_pixel_width;
    		float frame_borders_in_pixel_right	= (spalte+1) * Info.frame_pixel_width;
    		float frame_borders_in_pixel_top	= zeile * Info.frame_pixel_height;
    		float frame_borders_in_pixel_bottom = (zeile+1) * Info.frame_pixel_height;
    
    		/*
    		Beispiel:
    		filename asteroid_ani.bmp
    		frame_pixel_width 96
    		frame_pixel_height 96
    		texture_pixel_width 1024
    		texture_pixel_height 1024
    		position_x 0
    		position_y 0
    		cell_space_pixel_width 1
    		frames_per_row 6
    		start_frame 0
    		end_frame 20
    		animation_speed 30
    
    		Pixelkoordinaten von Frame 13:
    
    		zeile=13/6= 2
    		spalte=13-(2*6)=1
    		pixel_left = 1 * 96 =                               96
    		pixel_right = 2*96= 2*90+2*6=180+12=                192
    		pixel_top = 2 * 96 =                                192
    		pixel_bottom = 3*96= 3*90+3*9 = 3*9*10+3*9= 27+270= 297
    		*/
    
    		/// Umwandlung von Pixel in Texel
    		frame_borders_in_texel_left	    = frame_borders_in_pixel_left		/ Info.texture_pixel_width;
    		frame_borders_in_texel_right	= frame_borders_in_pixel_right		/ Info.texture_pixel_width;
    		frame_borders_in_texel_top	    = frame_borders_in_pixel_top		/ Info.texture_pixel_height;
    		frame_borders_in_texel_bottom   = frame_borders_in_pixel_bottom		/ Info.texture_pixel_height; 
    
    		//// Berechnung Ende
    
    		VertexBuffer[1].u = VertexBuffer[2].u = frame_borders_in_texel_right;
    		VertexBuffer[0].u = VertexBuffer[3].u = frame_borders_in_texel_left;
    		VertexBuffer[0].v = VertexBuffer[1].v = frame_borders_in_texel_top;
    		VertexBuffer[2].v = VertexBuffer[3].v = frame_borders_in_texel_bottom;
    
    	}
    


  • Danke,
    leider hilft mir das nicht wirklich weiter 😞
    Ich hab absolut keine Ahnung von D3D und wollte mich da auch gar nicht groß was mit machen da ich das mit der ganzen Mathematik ... nicht so verstanden habe, OK nen Würfel der sich per Cursortasten in verschiedene Richtungen Drehen konnte und per F1 Taste in den Wireframe Modus ging war noch drinne, damals war echt stolz drauf aber na ja mit 2D Sachen habe ich mir gedacht komme ich erstmal besser zu Recht, hat von euch vielleicht noch jemand ein Stück Code für eine Tile Animation wo ich aus einer Bitmap mit mehreren Einzelbildern eine Animation erstellen kann?

    Das FastBlt schneller als StrechBlt ist war mir zwar klar aber ich war mir nicht so sicher da FastBlt ja keine Möglichkeit hat irgendwas aus den Bild herauszuschneiden um eine Animation zu ermöglichen?

    Wenn mir da jemand helfen/aufklären könnte wäre das auch echt toll 🙂

    Gruß Patrick



  • Einfach aller x ms die nächse Animationsstufe anzeigen.

    Bye, TGGC (Wähle deine Helden)



  • Danke,
    ich bin nun schon soweit das die Animation abgespielt wird aber es Flackert hier mal mein Code :

    // Zeichnen...
    void ddDraw ()
    {
    	ddbltfx.dwSize = sizeof(DDBLTFX);
    	ddbltfx.dwFillColor = RGB(0, 0, 0); 
    	lpddsBack->Blt(&fill_area, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); 
    
    	Objektliste[1].x = Objektliste[1].x +2;
    	for (int i = 0; i < GEGNER_ANZAHL + 2; i++) {
    		SetRect(&RectBitmap, Objektliste[i].x, Objektliste[i].y, Objektliste[i].x+Objektliste[i].Breite, Objektliste[i].y+Objektliste[i].Hoehe); 
    		lpddsBack->Blt(&RectBitmap, Objektliste[i].Surface_Bild, NULL, DDBLT_WAIT | DDBLT_KEYSRC, NULL); 
    	}
    	PlayAnimSprite(Explosion.Surface_Bild,100,121,78,26,1);
    	while(lpddsPrimary->Flip(NULL, DDFLIP_WAIT) != DD_OK); 
    
    }
    // Animation abspielen
    HRESULT PlayAnimSprite(LPDIRECTDRAWSURFACE7 lpddsPicture, int delay,int width,int heigth, int max_pic , int loop_it_again)
    {
    	RECT    rcFrame;
        RECT    rcDest;
        double  dTickCount;
    
    	static double dLastTickCount; 
    	static int    nFrame;         
    	static int    nPosition = 0;  
    	dTickCount = GetTickCount();
    
        if( ( dTickCount - dLastTickCount ) <= delay )
    		return S_OK;
    
        dLastTickCount = dTickCount;
    
    	//ddbltfx.dwSize = sizeof(DDBLTFX);
    	//ddbltfx.dwFillColor = RGB(0, 0, 0); 
        //lpddsBack->Blt( NULL, NULL, NULL, 
    	//	              DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx );
    
        rcFrame.top    = (( nFrame / 5 ) * width);
        rcFrame.left   = (( nFrame % 5 ) * heigth);
        rcFrame.bottom = rcFrame.top  + width;
        rcFrame.right  = rcFrame.left + heigth;
    	++nFrame;
    
        if( nFrame > max_pic )
    		if(loop_it_again == 1) {
    		nFrame = 0;
    		}
    
    	nPosition = 0;
    
        rcDest.left   = nPosition;
    	rcDest.top    = 400;
    	rcDest.bottom = rcDest.top  + width;
    	rcDest.right  = rcDest.left + heigth;
    
    	lpddsBack->Blt( &rcDest, lpddsPicture, &rcFrame, 
    		              DDBLT_WAIT | DDBLT_KEYSRC, NULL );
    
        //lpddsPrimary->Flip( NULL, DDFLIP_WAIT );
    	//while(lpddsPrimary->Flip(NULL, DDFLIP_WAIT) != DD_OK); 
    
    	return S_OK;
    }
    

    Wie ich ja bereits sagte Flackert es mache ich es so wird nurnoch die Animation angezeigt, mache ich es wieder anders Flackert es, wieder anders Nurnoch die Anderen Sprites....
    BIn am verzweifeln welche Flips , Blts, Backbuffer-löschungen nun an der Richtigen Stelle sind wenn ihr mir da mal noch helfen könntet 🙄

    Gruß Patrick 😕



  • http://turing.fh-landshut.de/~jamann/dg1/dg1_3.jpg

    les dir mal fippen. blitten und doublebuffering durch



  • Danke,
    leider hab ich nun den Sinn von dem was du geschickt hast nicht ganz verstanden ich hab eigentlich gedacht das so wie ich das mache kein Flackern entstehen kann da ich ja einen Primär und einen Back - buffer habe, das wirft mich etwas raus 😕

    Was mache ich Falsch?
    Brauche ich etwa noch einen Buffer ?

    Gruß Patrick



  • Das Prinzip ist ganz einfach: Einfach in den Bachbuffer zeichnen - wenn fertig - mit dem nächsten Monitorrefresh Backbuffer mit Primarybuffer vertauschen usw.



  • Hallo,
    Eigentlich dachte ich das ich das so mache..
    Ist das etwa nicht der Fall ich verzweifel immer mehr 😞

    Gruß Patrick


Anmelden zum Antworten