我正在使用 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 和画布后备查看更简单更有效的方法,您需要将时间线导出为 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。