2013-08-14 11 views
5

So gut wie Haxe mit NME/OpenFL bekam das große Problem Übergang von AS3-Entwicklung sind Vermögenswerte. So wie Haxe as3 ähnelt und OpenFL versucht, eine vertraute API bereitzustellen, schreckt der Mangel an SWF-Unterstützung viele Entwickler ab. Meine Recherchen zu diesem Thema haben mich dazu gebracht, zu verstehen, dass die aktuelle SWF-Datei ziemlich schwach und fehlerhaft ist und viele Änderungen an der SWF-Datei erforderlich sind, um sie in Haxe ausführen zu können.Verwenden von SWF-Animation in Haxe/OpenFL-Anwendungen

Die Frage ist, wie verwenden Sie SWF-Animation in OpenFL-Anwendungen, oder wenn Sie nicht - was ist die beste Lösung, die Sie in Bezug auf Renderzeit, Prozessorzeit und Dateigröße gefunden haben.

Antwort

11

Nachdem ich mehr Zeit mit der Recherche verbracht und andere Entwickler gefragt habe, habe ich eine kleine Liste möglicher Alternativen zur Verwendung von SWF-Elementen für Animation zusammengestellt. Hoffentlich hilft es anderen Entwicklern, die ein ähnliches Problem haben, während die Unterstützung für SWF-Animationen schwach ist.

HINWEIS: Alle Methoden wurden unter Berücksichtigung von drei Faktoren ausgewählt, die für mich wichtig sind: Verfügbarkeit auf allen Plattformen, Leistung und Dateigröße der Assets. Daher wurden nicht alle möglichen Methoden einbezogen.

Getestet auf: HTML5, Android, iOS

  • SWF Animation ist möglich, mit Haxe/OpenFL, aber es gibt einige Regeln: keine Tweens - alle Animationen Frame-by-Frame . Vektorgrafiken sollten als Bitmap zwischengespeichert, als Bitmap gespeichert oder als Bitmap-Sequenz vorgerendert werden, da auf manchen Plattformen (z. B. neko) Vektorgrafiken in Raster mit hässlichen gebissenen Kanten transformiert werden. Einige Fehler wurden gemeldet, wenn MovieClip als Grafik dargestellt wurde oder umgekehrt, aber ich habe keine Fehler in HTML5, Flash, iOS, Android Releases bemerkt. Verschachtelte Animationen können Frames manchmal überspringen, wenn sie geloopt werden (habe das auch nicht gesehen, vielleicht hat das ältere Release von NME/OpenFL das getan). Ich würde sagen, dass dies eine ziemlich gute Möglichkeit ist, Inhalte aus Gründen der Dateigröße und der Plattformverfügbarkeit zu animieren, aber es bereitet Kopfschmerzen, alle Assets so zu bearbeiten, dass sie den Anforderungen des Haxe-Supports entsprechen. Und es macht keinen Spaß, diese Assets später wiederzuverwenden, da es sich um Frame-für-Frame-Animationen handelt und es ein Durcheinander ist.

  • Sprite Blattanimationen. Primär für HTML5-Ziele aufgrund höherer Rendering-Leistung verwendet. Dies ist direkt von einem OpenGL-Standard, daher sollte diese Methode für alle OpenGL-Ziele gelten. Die Idee ist, lieber eine große Datei zu haben und Zeit beim Öffnen/Laden mehrerer kleinerer Dateien zu sparen. Die Leistung ist gut, funktioniert auf allen getesteten Plattformen, aber die Dateigröße ist schnell außer Kontrolle geraten und kann kaum für Animationen verwendet werden, bei denen sich die Objektgröße in der Größe ändert - unnötig großer transparenter Platz, das Bild wird am besten auf den Platz reduziert Rendering-Performance mit der Bearbeitung der Transformationsmatrix zur Laufzeit.

  • Rahmensequenz aka PNG Sequenzanimation. Persönlicher Favorit. Es funktioniert gut und schnell auf allen Plattformen, es ist möglich, die Animation (wie jede andere oben genannte Methode) zu rendern, in BitmapData-Array zu transformieren, zu streamen usw. braucht viel Speicherplatz für die Animationen , kann aber durch das Laden der Inhalte vor der Verwendung (HTML5, SWF) gemildert werden, und es ist nicht wirklich wichtig für mobile Geräte - da sogar 1-2GB-Anwendungen für den Markt in Ordnung sind. Ein großer Vorteil, den ich für mich selbst gefunden habe, ist, dass diese Art von Asset für jeden anderen Entwicklungsstandard (C++, Java, cocos2d) verwendet und bei Bedarf als Sprite Sheet gespeichert werden kann (zB cocos2d, wie HTML5 bevorzugt Sprite Sheets gegenüber allem anderen, wie es geschrieben wurde das offizielle Buch COCOS2DX von Roger Engelbert).
    Mit dieser Flexibilität ist eine gute Leistung tolerierbar Dateigröße Ich bevorzuge diese Methode gegenüber jeder anderen oben genannten Methode.

  • Knochenanimation - PNG-Array + Eigenschaftsliste. Ein anderer Ansatz besteht darin, getrennte Bilder eines animierten Objekts und jede Bildmatrixdaten für jeden Rahmen zu haben. Auf diese Weise können mit minimalem Speicherplatzbedarf Tausende von Animationen erstellt werden. Die Nachteile sind: Es ist schwieriger (nicht unmöglich), verschachtelte Animationen für komplexere Animationen zu haben, konstante Matrixtransformationen beschränken die Anzahl aktiver Animationen auf der Anzeigeliste (schreckliche Methode für HTML5, andere Plattformen sind gut gehalten) und wenig Wiederverwendbarkeit von Assets. Normalerweise sind es die gleichen guten alten SWF-Assets, die in diesen Typ exportiert wurden. Daher ist es sinnvoll, die FLA anstatt die Bone-Animation selbst zu bearbeiten.

Sicherlich habe ich einige große Punkte verpasst haben, gibt es viele Möglichkeiten, Grafiken zu animieren, und einige vielleicht besser für Sie arbeiten als andere, so fühlen sich frei, Kommentare zu hinterlassen und zu kritisieren, aber ich hoffe immer noch das Thema hilfreich war.

5

Diese Frage könnte veraltet sein. Ich habe vor 5 Minuten eine C++ - App in Haxe/OpenFL kompiliert und hatte keine Probleme, SWF-Animationen (mit Tweens) zum Laufen zu bringen.

Hier ist ein gif-Aufnahme: https://imgflip.com/gif/7l02f

ich ein Vermögenswert „library.swf“ enthält, die Animation, exportiert als Klasse „Oluv“

Dies erfordert die „swf“ Bibliothek, die nun frei genannt hatte und mit installiert werden

In meinem Beispiel "swf haxelib installieren", fügte ich das meine application.xml-Datei:

<haxelib name="swf" /> 
<library id="oluvLib" path="assets/library.swf" type="swf"/> 

setzen diese dann in einem Standard-OpenFL Vorlagenprojekt:

Assets.loadLibrary("oluvLib", swfAssetsLoaded); 

private function swfAssetsLoaded(library:AssetLibrary):Void { 
    var oluv = Assets.getMovieClip("oluvLib:Oluv"); 
    addChild(oluv); 
    oluv.x = (stage.stageWidth - oluv.width)/2; 
    oluv.y = (stage.stageHeight - oluv.height)/2; 
} 

Tweens scheinen nicht auf neko Ziel zu arbeiten, aber sie funktionieren gut in C++ und Flash (natürlich).

+0

Vielen Dank für Ihre Antwort, es wird definitiv neue Entwickler helfen. Bitte beachten Sie, dass einer der Gründe für die Erstellung dieses Themas darin bestand, einen Ansatz zu finden, der auf allen Plattformen mit der höchsten Leistung und dem geringsten Speicherplatz zuverlässig funktioniert. –

+0

@larsiusprime Hallo, Ich habe versucht, was Sie in Ihrer Antwort gegeben haben, aber ich bekomme die folgenden Fehler während der Kompilierung (Würdest du wissen, was los ist?): Aus openfl/_v2/media/SoundChannel.hx Zeile 323 aufgerufen von openfl /_v2/Lib.hx Zeile 207 Aufruf aus /usr/lib/haxe/std/neko/Lib.hx Zeile 30 Uncaught exception - load.c (357): Primitiv nicht gefunden: ./[email protected]_sound_channel_set_pitch(2) Build wurde mit Fehlern angehalten. –