等待 Haxe/OpenFL 中的动画结束

Posted

技术标签:

【中文标题】等待 Haxe/OpenFL 中的动画结束【英文标题】:Waiting for the end of an animation in Haxe/OpenFL 【发布时间】:2018-01-30 00:55:58 【问题描述】:

我正在使用 Haxe + OpenFL + swf + Actuate 制作回合制游戏(我的目标是 js)。最重要的游戏方面之一是使用能力。每个技能都有一个动画,当然,这个动画播放需要时间。

我想知道如何处理 swf 动画的结束?提前致谢

【问题讨论】:

我认为没有“swf 动画”之类的东西,您是指存储在 swf 文件中的影片剪辑吗?如果是这样,我相信您可以在此答案中使用该方法:***.com/a/4121526/2670415 格式库或 openfl swf 变体,可用于读取和解析 swf 字节码为 format.SWF 等结构,OpenFL(针对 html5 时)将转换为类似于 Pixi 4 复制 flash 的 javascript结构。所以我认为“swf 动画”是完全可以接受的描述,因为 Haxe javascript 会接受一个带有动画字节码的 swf 文件。我在其他答案中提供了通用代码方法。需要明确的是,用户不是试图在 html 中嵌入 swf,而是在 haxe javascript 中解析 swf,您的回答会跳过这些细节,所以不太可能有用? @npretto,我将 SWF 称为电影剪辑库。我正在使用 swflib。要将库连接到项目,我使用 标记和 preload 并生成参数设置为 true,所以当我需要资产时,我只需创建其类的新对象,如下所示:var redSquare:RedSquare = new RedSquare(); addChild(redSquare); removeChild(redSquare);I我会阅读答案并尝试在我的代码中使用该方法 @npretto,感谢您提供的链接、您发送的答案以及 Justinfront 下面留下的答案很好地解决了我的问题 【参考方案1】:

有多种方法。如果您有一部名为“mySwf”的电影,在主时间线上设置了一个带有“holder”链接的 MovieClip,您可以按照这个 Haxe NME 示例(OpenFL 非常相似)附加它并使用 Enterframe 循环进行控制。没有用 html5 尝试过,因为我的代码是 NME,我经常比 OpenFL 更喜欢它,但不幸的是 NME 不支持 html。您可以在 NME haxelib 中的 NyanCat 示例中找到另一种方法,在 OpenFL 示例文件夹中使用“swf”库可能有类似的方法,因此希望这只是一个问题或切换导入。

package;
import nme.display.Sprite;
import nme.display.StageAlign;
import nme.display.StageScaleMode;
import nme.Assets;
import format.SWF;
import format.swf.instance.MovieClip;
import flash.events.Event;
class Main extends Sprite
  public function new()
     super ();
     loadMovie( 'mySwf');
  
  var mc: format.swf.instance.MovieClip;
  public function loadMovie( movie: String )
     var swf = new SWF ( Assets.getBytes ("assets/"+movie + ".swf") );
     mc  = swf.createMovieClip("holder");
     mc.gotoAndStop(0);
     mc.play();
     mc.addEventListener( Event.ENTER_FRAME, loop ,false,0,true );
     addChild( mc );
  
  function loop( e )
     if( mc.totalFrames == mc.currentFrame )
        mc.stop();
        mc.removeEventListener( Event.ENTER_FRAME, loop );
     
  
 

确保将要附加的电影剪辑命名为链接标识符,例如代码需要为“持有者”,将链接设置为“导出为动作脚本”和“在第一帧中导出”并放置在时间线的第一帧。上面这个例子适用于 CS3 flash swf ( as3 ) 或更新版本,我认为 NyanCat 例子需要更新的 flash 版本,例如 Animate。

如果您想使用 webgl 和 canvas 后备查看更简单、更有效的方法,您需要将时间线导出为一组来自 Flash 的 png,然后您可以将图像加载到应用程序中并在每帧显示不同的图像。例如,如果您使用 Kha 而不是 OpenFL,您可以在渲染循环中执行类似...

function render2D( g2: kha.graphics2.Graphics )
        g2.begin(false);
        g2.transformation = FastMatrix3.translation( dx, dy ); // or rotation etc..
        if( count < images.length )
            g2.drawImage( images[count++], posx, posy );
        
        g2.transformation = FastMatrix3.identity();
        g2.end();
    

显然,您还可以探索在 Kha、Luxe、OpenFL、NME、Flambe 中支持的 Flump(将嵌套结构从 fla 导出为 png 和 json/xml)。或者您可以查看 SpriteSheet/TileSheet 解决方案。然而,Swf 很好,受支持但使用不多,可能是最佳文件大小,但我想对于 html 来说这是一个相当大的开销,并且可能在 OpenFL Javascript 目标上得到很好的支持,至少可能不如对 C++ 的支持。此外,对 NME/OpenFL 的 swf 支持对于渐变并不完美,并且不支持操作。但是精灵表 png 总是可以的。其他替代方法可能是尝试将帧导出为 svg。

【讨论】:

好的,感谢您的回答,使用其 MovieClip 方法控制动画似乎是正确的解决方案。并且检查 totalFrames 和 currentFrame 的相等性是一种有趣的方法,可以准确地播放动画 1 次

以上是关于等待 Haxe/OpenFL 中的动画结束的主要内容,如果未能解决你的问题,请参考以下文章

如何查看 Haxe 中的可用空间?

animation-fill-mode属性的理解

UIPanGestureRecognizer 状态结束后动画中的小问题

Recycler View 中的约束设置动画未正确设置动画

vue中的半程动画

使用 KID 测试 UI 动画