DirectDraw Tile Animation
-
Ich hab gerade schonmal geschrieben dann war alles weg ( Cookies spinnen wieder
) daher fasse ich mich nun kürzer, wisst ihr wie man eine Animation bewerkstelligt, mit Tiles ?
Wenn ja habt ihr Code ?Ohne StretchBlt das soll zu langsam seien habe ich gehört?
Gruß Patrick
Sorry das es so kurz war aber musste mich neu einloggen dann war der Text weg

-
1. Ein Tile an Position X,Y rendern kannst du ja schon.
2. für jedes Tile pro Zeile, tue:
Tiles an Position X+dXFrameNr rendern. Backbuffer blitten. VSync abwarten. FrameNr++;
Tiles an Position X+dXFrameNr rendern. Backbuffer blitten. VSync abwarten. FrameNr++;
Tiles an Position X+dX*FrameNr rendern. Backbuffer blitten. VSync abwarten. FrameNr++;Kannst dir ja denken, wie´s weitergeht.
-
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 30void 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