Animation 在Haxe/OpenFL应用程序中使用SWF动画

Animation 在Haxe/OpenFL应用程序中使用SWF动画,animation,flash,assets,haxe,openfl,Animation,Flash,Assets,Haxe,Openfl,尽管Haxe在NME/OpenFL中表现出色,但从AS3开发过渡的最大问题是资产。虽然Haxe与as3非常相似,OpenFL试图提供一个熟悉的API,但是缺少SWF支持吓跑了许多开发人员。 我对这一主题的研究使我了解到,当前的SWF非常脆弱,并且存在很多缺陷,为了在Haxe中运行它,需要对SWF文件进行许多编辑 问题是你如何在OpenFL应用程序中使用SWF动画,或者如果你不使用,你找到的关于渲染时间的最佳解决方案是什么,处理器时间和文件大小。在研究上花了更多时间,并询问了其他开发人员之后,我列

尽管Haxe在NME/OpenFL中表现出色,但从AS3开发过渡的最大问题是资产。虽然Haxe与as3非常相似,OpenFL试图提供一个熟悉的API,但是缺少SWF支持吓跑了许多开发人员。 我对这一主题的研究使我了解到,当前的SWF非常脆弱,并且存在很多缺陷,为了在Haxe中运行它,需要对SWF文件进行许多编辑


问题是你如何在OpenFL应用程序中使用SWF动画,或者如果你不使用,你找到的关于渲染时间的最佳解决方案是什么,处理器时间和文件大小。

在研究上花了更多时间,并询问了其他开发人员之后,我列出了一个小列表,列出了在动画中使用SWF资产的可能替代方案。希望它能帮助其他开发者,他们在SWF动画支持薄弱的时候也有类似的问题

注意:选择所有方法时考虑了三个对我很重要的因素:所有平台的可用性、性能和资产的文件大小。因此,并非所有可能的方法都包括在内

测试平台:HTML5、Android、iOS

  • SWF动画可以通过Haxe/OpenFL实现,但有一些规则:没有二者-所有动画都是逐帧的。矢量艺术应缓存为位图、另存为位图或预渲染为位图序列,因为在某些平台(如neko)上,矢量艺术正在转换为带有丑陋咬边的光栅。如果将MovieClip表示为图形,或者反之亦然,则会报告一些错误,但我没有注意到HTML5、Flash、iOS和Android版本上有任何错误。如果循环,嵌套动画有时可能会跳过帧(也没有看到,可能是旧版本的NME/OpenFL做到了这一点)。我想说,从文件大小和平台可用性的角度来看,这是一种相当好的内容动画制作方法,但编辑所有资产以满足Haxe支持的要求是一件令人头痛的事情。以后再重用这些资源并不有趣,因为它们都是逐帧动画,而且非常混乱

  • 精灵工作表动画。由于更高的渲染性能,主要用于HTML5目标。这直接来自openGL标准,因此此方法应适用于所有openGL目标。这样做的目的是拥有一个大文件,并节省打开/加载多个小文件的时间。性能良好,可在所有测试平台上运行,但文件大小很快失控,很难用于对象大小不断变化的动画-造成不必要的大透明空间,通过在运行时编辑变换矩阵,旋转图像以最佳拟合空间会降低渲染性能

  • 帧序列又名PNG序列动画。个人最爱。它在所有平台上运行良好且快速,可以预渲染动画(就像上面的任何其他方法一样)、转换为位图数据数组、流加载等。它确实为动画占用了大量磁盘空间,但可以通过在使用之前加载资产来软化(HTML5、SWF)对于移动设备来说,这并不重要,因为即使是1-2GB的应用程序在市场上也可以。我自己发现的最大优势是,这种类型的资产可以用于任何其他开发标准(C++、Java、cocos2d),并在需要时保存为Sprite表(例如,cocos2d,如HTML5,与Roger Engelbert在官方书籍COCOS2DX中所写的任何东西相比,更喜欢Sprite表)。
    具有这种灵活性,良好的性能是可以容忍的文件大小,我更喜欢这种方法,而不是上面列出的任何其他方法

  • 骨骼动画-PNG数组+属性列表。另一种方法是使用动画对象的单独图像和每个帧的每个图像矩阵数据。这样,使用最少的磁盘空间,就可以制作数千个动画。缺点是:对于更复杂的动画来说,嵌套动画更难(并非不可能),恒定的矩阵变换限制了显示列表中活动动画的数量(对于HTML5来说是可怕的方法,其他平台也很好),并且资产的可重用性很低。通常,导出到该类型的是相同的良好旧SWF资产,因此编辑FLA而不是骨骼动画本身是有意义的


当然,我错过了一些重要的观点,有很多方法可以使图形动画化,有些方法可能比其他方法更适合您,所以请随意发表评论和批评,但我仍然希望这个主题是有帮助的。

这个问题可能已经过时了。我在5分钟前在HAXE/OpenFL中编译了一个C++应用程序,并且没有任何困难,可以获得SWF动画(带有Twites)。 这是一段gif录音:

我有一个名为“library.swf”的资产,其中包含动画,导出为类“Oluv”

这需要“swf”库,该库现在是免费的,可以与“haxelib安装swf”一起安装

在我的示例中,我将以下内容添加到application.xml文件中:

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

Twitter在NIKO目标上似乎不起作用,但是它们在C++和Flash(当然)中工作得很好。谢谢你的响应,它肯定会帮助新开发人员。请注意,创建此主题的原因之一是为了找到一种在所有性能最高、磁盘空间最少的平台上都能可靠工作的方法。@larsiusprime您好,我尝试了您在回答中给出的方法,但在编译过程中出现了以下错误(您知道怎么了吗?):从openfl/_v2/media/SoundChannel.hx第323行调用从openfl/_v2/Lib.hx第207行调用从/usr/Lib/haxe/std/neko/Lib.hx第30行调用未捕获异常-load.c(357):未找到原语:/lime@lime_sound_channel_set_pitch(2) 生成因错误而停止。

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;
}