与 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 序列动画。个人最爱。它在所有平台上都运行良好且快速,可以预渲染动画(就像上面的任何其他方法一样),转换为 BitmapData 数组,流加载等。动画确实需要大量磁盘空间,但是可以通过在使用资产(HTML5、SWF)之前加载资产来软化它们,这对于移动设备并不重要——因为即使是 1-2GB 的应用程序也适用于市场。我为自己发现的最大优势是,这种类型的资产可以用于任何其他开发标准(C++、Java、cocos2d),并在需要时保存为 Sprite 表(例如 cocos2d,如 HTML5 更喜欢 Sprite 表而不是其他任何东西,如Roger Engelbert 的官方书籍 COCOS2DX)。
有了这种灵活性,良好的性能是可以容忍的文件大小我更喜欢这种方法而不是上面列出的任何其他方法。
骨骼动画 - PNG 数组 + 属性列表。另一种方法是拥有动画对象的单独图像和每一帧的每个图像矩阵数据。这样,使用最少的磁盘空间就可以制作数千个动画。缺点是:更复杂的动画更难(并非不可能)嵌套动画,恒定的矩阵变换限制了显示列表中活动动画的数量(HTML5 的可怕方法,其他平台保持良好)以及资产的可重用性很少。通常它是导出到这种类型的相同的旧 SWF 资源,因此编辑 FLA 而不是骨骼动画本身是有意义的。
当然,我错过了一些重要的观点,有很多方法可以为图形制作动画,有些可能比其他人更适合你,所以请随时发表评论和批评,但我仍然希望这个话题对你有所帮助。
这个问题可能已经过时了。5 分钟前,我在 Haxe/OpenFL 中编译了一个 C++ 应用程序,让 SWF 动画(带补间)工作没有问题。
这是一个 gif 记录: https ://imgflip.com/gif/7l02f
我有一个名为“library.swf”的资产,其中包含该动画,导出为“Oluv”类
这需要现在免费的“swf”库,可以使用“haxelib install swf”安装
在我的示例中,我将其添加到我的 application.xml 文件中:
<haxelib name="swf" />
<library id="oluvLib" path="assets/library.swf" type="swf"/>
然后把它放在一个标准的 OpenFL 模板项目中:
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 似乎不适用于 neko 目标,但它们在 C++ 和 flash 中运行良好(当然)。