等待 Haxe/OpenFL 动画结束

Waiting for the end of an animation in Haxe/OpenFL

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

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

方法多种多样。如果您有一部名为 '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 );
     }
  }
 }

确保将要附加的影片剪辑命名为链接标识符的不同名称,例如代码需要为 'holder',将链接设置为 'Export for Actionscript' 和 'Export in first Frame'并放在时间轴的第一帧。上面的示例适用于 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 支持对于渐变并不完美,并且不支持动作。但是 sprite sheet png 总是有效的。其他替代方法可能是尝试将帧导出为 svg。