WarpAnimation - Bequeme Animationen [Update Version: 1.0]

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

ComNik

Betreff: WarpAnimation - Bequeme Animationen [Update Version: 1.0]

BeitragDo, Aug 20, 2009 11:07
Antworten mit Zitat
Benutzer-Profile anzeigen
So also, nur kurz. Natürlich war alle Kritik von FDM vollkommen berechtigt Confused (Danke nochmal dafür!)

Nun hab ich mich also heute nochmal dran gesetzt, ein Konzept erstellt und das ganze verbessert.
Lange Rede, grosses Bild:
user posted image

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

BeitragDo, Aug 20, 2009 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 20, 2009 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu FDM,
also mit Play() wird die Animation gestartet und gleichzeitig gezeichnet. Hier ist mal ein kleiner Beispielcode:

BlitzMax: [AUSKLAPPEN]

Import WarpStudios.WarpAnimation

Graphics(800,600,0,60)

SetMaskColor(255,0,255)
Local TheAnimation:WP_Animation = WP_CreateAnimation("MyAnimation.png",400,300,32,32,0,8,Null,LOOP)

While Not KeyDown(KEY_ESCAPE) Or AppTerminate()
Cls
TheAnimation.Play(5,8,500)
If MouseDown(MOUSE_LEFT)
TheAnimation.X = MouseX()
TheAnimation.Y = MouseY()
End If
If KeyHit(KEY_P) Then TheAnimation.Pause()
If KeyHit(KEY_R) Then TheAnimation.Resume()
Flip
Wend


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

BeitragDo, Aug 20, 2009 12:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 20, 2009 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
genau das selbe habe ich mir auch mal geproggt^^ nur das meines TAnimation module heist Smile

xD

ComNik

BeitragDo, Aug 20, 2009 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@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? Embarassed
WIP: Vorx.Engine

beanage.johannes

BeitragDo, Aug 20, 2009 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
nein habe es nicht veröfentlicht^^ist noch iwo auf meiner hd...

Firstdeathmaker

BeitragDo, Aug 20, 2009 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 20, 2009 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 20, 2009 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 20, 2009 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 23, 2009 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 23, 2009 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Aug 24, 2009 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 25, 2009 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group