Draw3D2-->GrabAnimImage3D mit Start- und End-Grabkoordina
Übersicht

![]() |
IguanBetreff: Draw3D2-->GrabAnimImage3D mit Start- und End-Grabkoordina |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Leute
Bevor ich mich an die Arbeit mache, was selbst zu proggen, wollte ich nachfragen, ob es folgendes schon in Draw3D2 schon gibt. Ich konnte allerdings nichts finden... Ich habe auf einem Bild (1024x1024) alle Grafiken, die ich für mein Spiel brauche. Darunter sind auch Animierte Einzel-Tiles. Wenn ich nun LoadImage3D verwende, wird ja ein neues Surface mit der Bildtextur erstellt. Daraus kann man dann beliebige Bildberieche mit GrabImage3D aus-"grabben". Wie macht man das, wenn man ein animiertes Bild aus diesem Surface grabben und dann mit DrawImage3D + FrameNummer zeichnen möchte? Mein Problem ist, dass es beim Befehl GrabAnimImage keine Parameter für die Start-X-Y-Ausschneidekoordinaten gibt. sowas bräuchte ich: Code: [AUSKLAPPEN] GrabedAnimImage = GrabAnimImage3D(LoadedImage,u_start,v_start,u_size,v_size,FrameCount,ScaleX#,ScaleY#) Mein bisheriger Ansatz: Ich habe die zusammengehörenden animierten Tiles in einzelne Grafikdateien gepackt und dann für jede Grafik ein Surface erstellt mit (LoadImage3D). Anschliessend habe ich mit GrabAnimImage aus-grabbt. Das ist doch bestimmt ein grosser Speicherverlust... ![]() Gibt es da schon was fertiges, was ich übersehen habe? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
GrabAnimImage3D ist der Funktionsweise dem 2D-Befehl angelehnt.
Parameter sind: 1 - handle 2 - w_set 3 - h_set 4 - start 5 - frames 6 - [x_scale] 7 - [y_scale] 2 und 3 geben an, wie groß eine Kachel in Pixel ist. Mit 4 bestimmt man, wie viele Frames ausgesetzt werden sollen, wenn man von der bei 2 und 3 angesetzten Kachelgröße ausgeht. Mit 5 bestimmt man, wie viele Frames ausgeschnitten werden sollen. Im Beispiel Draw3D2 #07, GrabAnimImage3D.bb habe ich eine Kachel genommen, die nicht glatt am rechten Bildrand anstößt. Um das zu demonstrieren. Das Bild hat 512x512 Pixel, die Kacheln sind 96 Pixel breit. Fünf davon entsprechen 480 Pixel, eine sechste Kachel passt da also nicht mehr ganz rein, also wird die nächste Zeile genommen. Wenn nach dem Trooper andere Kacheln kommen, so gibt man als Startwert die 12 an, da die ersten 12 Frames ja schon belegt sind. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Hectic
Danke für die schnelle Antwort! Den Befehl habe ich verstanden und ist auch leicht verständlich so. Das Problem ist, wenn man Frame 12 verwendet, muss das dann auch die gleichen Abmessungen haben wie ein Trooper-Einzelbild. Da ich aber unterschiedliche (von der Grösse) Tiles für Animationen auf einem einzigen Bild habe, geht das mit dem Befehl wohl nicht, ohne mehrere Surfaces (mit LoadImage) erstellen zu müssen. Ich habe die Funktion GrabAnimImage3D geringfügig abgeändert: Code: [AUSKLAPPEN] Function GrabAnimImage3D(FDrawHandle%,IDrawXCount%=0,IDrawYCount%=0,FDrawWSet%,FDrawHSet%,FDrawStart%,FDrawFrames%,FDrawXScale#=1,FDrawYScale#=1) ;*** Modifiziert *** ;Start-Ausschneidekoordinaten koennen nun angegeben werden (IDrawXCount%,IDrawYCount%,) ;SICHERHEITSPRÜFUNG If FDrawHandle<0 Then RuntimeError "GrabAnimImage3D"+Chr$(10)+Chr$(10)+"Grabb only main images!" ;VARIABLENDEKLARATIONEN Local IDrawHandle% Local IDrawFrames% ;Local IDrawXCount% ;Local IDrawYCount% ;FACEBANK(AUS)WEISUNGEN Local LDrawMeas%=PeekInt(GDrawFaceBank,FDrawHandle+DRAWBANKMEAS) ;ALLE/TEILBILDER/DURCHGEHEN For IDrawFrames=0 To FDrawStart+FDrawFrames-1 ;EINZELNES/TEILBILD/AUSSCHNEIDEN If IDrawFrames=>FDrawStart Then IDrawHandle=GrabImage3D(FDrawHandle,IDrawXCount,IDrawYCount,FDrawWSet,FDrawHSet,FDrawXScale,FDrawYScale) ;NÄCHSTE/UV-KOORDINATEN/SETZEN IDrawXCount=IDrawXCount+FDrawWSet If IDrawXCount+FDrawWSet>LDrawMeas Then IDrawYCount=IDrawYCount+FDrawHSet IDrawXCount=0 End If Next ;FUNKTION/RÜCKGABEWERT Return IDrawHandle-FDrawFrames*DRAWBANKSTEP+DRAWBANKSTEP End Function ist das sauber so? Oder gibt es einen besseren Weg für oben beschriebenes? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Beispiel:
Wenn du ein Bild mit den Abmessungen 256x256 hast und die ersten 8 Tiles mit 64x64 belegst, ist die obere Hälte des Bildes mit genau diesen Tiles belegt. Also 8 Tiles aufgeteilt auf 4x2 Tiles. Das wäre dann: Anim1 = GrabAnimImage3D(LoadedImage,64,64,0,8,1,1) Wenn nun die untere Hälfte des Bildes mit kleineren 32x32 Tiles belegt sind: dann machst du einfach: Anim2 = GrabAnimImage3D(LoadedImage,32,32,32,8,1,1) Die 32 resultiert daraus, dass die obere Hälfte des Bildes bei 32x32 mit 8x4 Tiles belegt wäre. Die untere Hälfte beginnt also mit Frame 32. Die Draw3D speichert keine Informationen darüber, welche Tiles zuvor gegrabbt wurden. Jeder Befehl geht also von sich von der Grundeinstellung aus. - - - So wie du es machen wolltest, war auch mein erster Ansatz. Ich habe es dann am Ende doch so umgeschrieben, dass die Draw3D2 eher den gewohnten 2D-Befehlen ähnelt, als hier überall eigene Ideen einzubringen. Auch wenn sie zum Teil besser sind. Damit wollte ich die Umgewöhnung von 2D auf Draw3D2 so einfach wie möglich machen. - - - Edit1: Die Funktion GrabAnimImage3D macht ja nichts anderes, als die ''richtige'' GrabImage3D mit entsprechenden Parametern aufzurufen. Wenn deine Änderung funktioniert, ist dem nichts entgegen zu setzen. Änderungen an GrabImage3D wären beim unsauberen Code vorsichtiger zu genießen. |
||
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achso, jetzt macht auch der Parameter Startframe mehr Sinn. Wenn die Grafiken schön auf ein 2er-Potenzen-Raster ausgerichtet sind funktioniert das super. Wenn nicht, kann man ja wohl kaum StartFrame =33.75 angeben ![]() Ich belasse es lieber so mit den Start-Ausschneide-Koordinaten, dann muss ich nicht so viel umrechnen. Aber ist halt eine leichte Abweichung zum Blitz2D-Befehl... Vielen Dank! mfg Iguan |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group