WarpAnimation - Bequeme Animationen [Update Version: 1.0]
Übersicht

![]() |
ComNikBetreff: WarpAnimation - Bequeme Animationen [Update Version: 1.0] |
![]() Antworten mit Zitat ![]() |
---|---|---|
So also, nur kurz. Natürlich war alle Kritik von FDM vollkommen berechtigt ![]() Nun hab ich mich also heute nochmal dran gesetzt, ein Konzept erstellt und das ganze verbessert. Lange Rede, grosses Bild: Wie man eventuell erkennen kann, bewegen sich die ganzen Männchen unabhängig voneinander. Aber alle benutzen das gleiche Bild, so das bei diesen knapp 100 Männchen ein RAM verbrauch von ca 5000 kb anfällt. Es wird also nur einmal die Animation geladen. Naja wie auch immer ich bin zufrieden, alles klappt. Das Modul gehört jetzt aber (so als kleine Dreingabe) zu dem WarpFramework an dem ich arbeite. Deswegen wird es jetzt hier nicht nochmal veröffentlicht. lg ComNik |
||
WIP: Vorx.Engine |
- Zuletzt bearbeitet von ComNik am Mo, Sep 14, 2009 21:13, insgesamt 2-mal bearbeitet
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannst du nen kurzen Beispielcode dazulegen?
Mit play() startet man also die animation... und womit zeichnet man sie ein? Auch damit? und wieso muss das Zeitabhängig sein? Könnte man das ganze nicht auch Frameabhängig machen? zwecks genauerer Berechnung lass ich nämlich immer die Logikschleife x-mal durchlaufen, statt mit Millisecs() die Delta-time festzustellen und danach zu berechnen. edit: habs zum laufen gebracht: Code: [AUSKLAPPEN] Import warpstudios.warpanimation
Graphics 800 , 600 Local anim:WP_Animation = WP_CreateAnimation("expl2.png" , 0 , 0 , 50 , 47 , 0 , 8 , Null , LOOP | PLAYING) repeat cls anim.Play(0,8,100) flip Until KeyHit(KEY_ESCAPE) end läuft gut. Das Problem was ich sehe ist nur folgendes: Was ist, wenn ich die Animation an verschiedenen Stellen abspielen lassen möchte? Also quasi einmal ne explosionsanimation laden, und dann immer wenn irgendwo etwas explodiert an der Stelle einzeichnen. Dann müsste ich ja jedes Mal die Animation wieder laden, oder? |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
- Zuletzt bearbeitet von Firstdeathmaker am Do, Aug 20, 2009 12:02, insgesamt einmal bearbeitet
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Huhu FDM,
also mit Play() wird die Animation gestartet und gleichzeitig gezeichnet. Hier ist mal ein kleiner Beispielcode: BlitzMax: [AUSKLAPPEN]
So Pause() und Resume() sind ja eingermassen selbsterklärend. Was meinst du mit Frameabhängig? Es kann sein das ich dich jetz mit Unwissen nerve und alles falsch sage, aber ich mache es so, dass das nächste Frame nur angezeigt wird wenn CurrentTime - StartTime > Speed. lg ComNik |
||
WIP: Vorx.Engine |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Frameabhängig: Man macht in seiner Logik-Schleife immer nur Diskrete Schritte. D.h. man Programmiert quasi "Frameabhängig", aber man ruft die Logik-Schleife immer so oft auf, dass man nachher doch Frameunabhängigkeit hat.
Sieht ungefähr so aus: Code: [AUSKLAPPEN] Function Run()
Main.Init() Repeat Main.time.Calc() For Local i:Int = 1 To Floor(Main.time.NumTicks) Main.Logic() Next Main.Render() Until Prog.shutDownFlag Main.leave() End End Function wobei "ticks" die berechneten, fehlenden Frames sind. Damit lässt sich ein Spiel sehr genau programmieren. |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
beanage.johannes |
![]() Antworten mit Zitat ![]() |
---|---|---|
genau das selbe habe ich mir auch mal geproggt^^ nur das meines TAnimation module heist ![]() xD |
||
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
@wolff: Hast du es veröffentlicht? Hätt ich mir vielleicht die Zeit sparen können. Na auch egal.
@FDM: ui das muss ich erstmal verarbeiten. ich weiss nicht ob ich das einbauen kann. Wenn du das Modul benutzen willst kann ich dir den code schicken und dumachst das selber? ![]() |
||
WIP: Vorx.Engine |
![]() |
beanage.johannes |
![]() Antworten mit Zitat ![]() |
---|---|---|
nein habe es nicht veröfentlicht^^ist noch iwo auf meiner hd... | ||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, möchte das nicht benutzen. Hab selber sowas mal programmiert, aber es anders gelöst.
Ich habe eine Klasse, genannt TAnimationType in welcher ich die vorher festgelegten Animationsdaten speichere (das animated image und die framerate mit der es abgespielt werden soll). Aus diesem heraus erstelle ich mit "play" eine Instanz der Klasse TAnimation, welche ich dann zum einzeichnen benutze wie ein TImage. Das erzeugte TAnimation Objekt ist ähnlich dem deinen, nur dass man dort die Abspielgeschwindigkeit verändern und die Position mit jedem Einzeichnen angeben kann (habs extra na an TImage designt). Was man am Beispiel jetzt nicht sieht ist, dass man die Abspielgeschwindigkeit dieser einzelnen TAnimation individuell ändern kann, und auch zeitlich ganz andere Wege gehen kann. Per default geht zwar alles nach Millisecs(), aber man kann auch nach "steps" oder was weis ich nicht gehen. Der Grund weshalb ich es bisher noch nicht veröffentlicht habe ist, dass ich es immer noch nicht für das nunplusultra halte. Ich meine man hat ja des öfteren eher ganze Animationsreihen welche ein Objekt haben kann. Wie man diese effizient und trotzdem einfach verwaltet, weis ich noch nicht. Beispielcode: Code: [AUSKLAPPEN] Framework brl.Graphics
Import fdm.animations Import brl.d3d7max2d Incbin "expl2.ani" Graphics 400,300,0 SetBlend ALPHABLEND Local aniType:TAnimationType = LoadAnimationType("incbin::expl2.ani") Local ani:TAnimation = aniType.play(-1,True) Repeat Cls ani.draw(200,150) Flip Until KeyHit(KEY_ESCAPE) End Kompilierte Version |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich schätze ich verstehe gar nix, und rede an dir vorbei :/
Aber: Also wenn ich einen Chrakter hab und für den ein ganz normales BewegungsImage also 16 Frames. Und z.B. ein Image mit z.B. 4 Frames für schiessen oder wasweissich. Dann erstell ich eine Liste mit Animationen innerhalb des TPlayer Types (z.B^^). Jetz Lade ich die beiden Animationen mittels WP_CreateAnimation() und gebe als List Parameter die List des Players an. Dann z.B checken ob der Player grad schiesst, und wenn ja wird einfach Die Schiess Animation abgespielt. Bitte hab ich da keinen Denkfehler.... lg ComNik |
||
WIP: Vorx.Engine |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, solange du nur EINEN Charakter hast, ist das ja nicht weiter schlimm. Nur wenn du jetzt z.B. 5 Gegner hast, die alle gleich Aussehen und die gleichen Animationen haben, dann müsstest du das ja 5 mal laden. | ||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wieso? Ich erstelle vllt einfach eine globale Liste und speichere da die Animationen rein. z.B
Code: [AUSKLAPPEN] Global Gegner_Alien_Animationen:TList = CreateList() Global Alien_Move:WP_Animation = WP_CreateAnimation("bösesalien.png",32,32,0,16,Gegner_Alien_Animationen) Global Alien_Shoot:WP_Animation = WP_CreateAnimation("böserschuss.png",32,32,0,4,Gegner_Alien_Animationen) Ich muss doch eigentlich noch nichteinmal unterschiedliche Listen für Unterschiedliche GegnerTypen erstellen. Ich kann eigentlich auch die Standard Liste von WarpAnimation nutzen. Ich hoffe ich mach da keine Denkfehler aber wenn ich wie oben die Animationen gespeichert hab kann ich sie doch einfach so abspielen: Code: [AUSKLAPPEN] For Alien:TAlien = EachIn Gegner Select Alien.State Case MOVE Alien_Move.X = Alien.X '// Kommt evtl. noch als Parameter in die Play() Method Alien_Move.Y = Alien.Y '// " Alien_Shoot.Pause() Alien_Move.Play(0,16,300) Case SHOOT Alien_Shoot.X = Alien.X Alien_Shoot.Y = Alien.Y Alien_Shoot.Play() End Select Next Also ich stell mir das machbar vor :/ So oder so ähnlich? lg ComNik |
||
WIP: Vorx.Engine |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann würde ich gerne wissen wie man denn unterschiedliche Gegner eine einzige Animation benutzen lassen kann, ohne das sie immer die gleichen Frames benutzen. Sprich meine Animation dauert z.B. 12 Sekunden. Alle 0,5 Sekunden erstelle ich einen neuen Gegner, bei dem die Animation natürlich von Anfang an abgespielt werden soll, nicht direkt mittendrin. Wie funktioniert das? Woher weis dein Animationsobjekt, für welchen Gegner gerade wie viel Zeit der Animation vergangen ist?
Code: [AUSKLAPPEN] Global ani_alien:WP_Animation = WP_CreateAnimation("alien.png",32,32,0,16) Global nextSpawn:Int Repeat If nextSpawn < MilliSecs() nextSpawn = MilliSecs()+1000 Local a:Alien = New Alien a.x = Rand(0,GraphicsWidth()) a.y = Rand(0,GraphicsHeight()) EndIf Cls For a:Alien = EachIn Alien.list a.render() Next Flip Until KeyHit(KEY_ESCAPE) End Type Alien Global list:TList = New TList Field _link:TLink Field ani:WP_Animation Field x:Float,y:Float Method New() _link = list.addlast(Self) End Method Method render() ani.play(x,y,0,15) End Method Method remove() RemoveLink(_link) End Method End Type |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Verdammt!
Ich denke mal das du recht hast. Jetz verstehe ich auch was du immer gemeint hast. Ich habe das jetzt so geläst das die Funktion WP_CreateAnimation() keine Animation zurückliefert. Mit WP_AddAnimation geht das jetzt. Das ermöglicht folgendes: Code: [AUSKLAPPEN] Local Anim:WP_Animation = WP_CreateAnimation("MyAnimation.png",32,32,0,8) For Local i:Int = 0 to 10 Local gegner:TAlien = CreateGegner() gegner.animation:WP_Animation = WP_AddAnimation(Anim) Next Würde das helfen? Ich schreibe bald mal einen umfangreicheren test dazu. Danke und lg ComNik [EDIT] Hab noch ne Idee: Wie wärs wenn ich CreateAnimation als Parameter ein TImage anstatt einem namen gebe?[/EDIT] |
||
WIP: Vorx.Engine |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kleiner Tipp: Ich habs generell so gelöst, dass ich Animationen komplett abspeicher. Also nen kleinen Editor geschrieben in welchem man die Animationen einbinden kann, ein kleines Dateiformat gebaut und somit kann man Animationen wie Images laden. Dadurch bekommt man aber nur einen "Grundtypen". Wenn man jetzt eine Animation abspielen lassen möchte, dann erstellt man sich aus dem GrundObjekt ein Abspielobjekt, welches dann so Informationen wie verstrichene Abspielzeit und vllt. auch die Position beinhaltet (was ich nicht machen würde, da TImage ja auch keine Positionen abspeichert).
Aber mach dir wegen mir keine Mühe, ich benutze sowieso mein eigenes Format + Modul. Ich will dir nur strukturelle Schwachstellen aufzeigen. |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiss ich bin auch dankbar dafür. Ich mach mir schon nicht vor das du so ein Modul nich hinkriegen würdest oder so ![]() Ich mach das hauptsächlich fpr meine Projekte und ich will damit gut zurechtkommen. Wenn du mir die Fehler zeigst ist das doch gut. Also Danke nochmal ComNik |
||
WIP: Vorx.Engine |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group