等待 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。
我正在使用 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。