convertToFrameByFrameAnimation メソッドとは
こんな感じにトゥイーンを削除してキーフレームに変換する jsfl のメソッドです。
このメソッドは Frame オブジェクトの中に入ってます。
公式ドキュメントの解説
frame.convertToFrameByFrameAnimation()
キーフレームに変換した後の各フレームにアクセスしたい
convertoToFrameByFrameAnimation_test.jsfl
//タイムライン(Timeline オブジェクト)を取得
var timeline = fl.getDocumentDOM().timelines[0];
//一番上のレイヤー(Layer オブジェクト)を取得
var layer = timeline.layers[0];
//取得したレイヤーの全フレーム(Frame オブジェクト配列)を取得
var frames = layer.frames;
//フレーム総数を Number で取得(frames.length と同義)
var frameCount = layer.frameCount;
//フレーム配列からキーフレームを探索
for(var i = 0; i < frameCount; i++)
{
//▼これがキーフレームの探し方
if(i == frames[i].startFrame)
{
//キーフレームにクラシックトゥイーンかモーショントゥイーンが設定されていたら
if(frames[i].tweenType !== "none")
{
//トゥイーンアニメーションをキーフレームアニメーションに変換
frames[i].convertToFrameByFrameAnimation(); //※1
}
}
//現在の再生ヘッドのフレームのキーフレーム番号を、出力パネルにトレース表示
fl.trace("frames["+i+"].startFrame : " + frames[i].startFrame);
}
上記コードの ※1 の部分を通った瞬間に
▲こんなタイムラインが
▼こんなタイムラインに変わってるはずなのですが
トレース表示結果を確認すると
frames[0].startFrame : 0
frames[1].startFrame : 0
frames[2].startFrame : 0
frames[3].startFrame : 0
frames[4].startFrame : 0
frames[5].startFrame : 5
frames[6].startFrame : 5 //キーフレームに変わってない
frames[7].startFrame : 5 //キーフレームに変わってない
frames[8].startFrame : 5 //キーフレームに変わってない
frames[9].startFrame : 5 //キーフレームに変わってない
frames[10].startFrame : 10
frames[11].startFrame : 10
frames[12].startFrame : 10
frames[13].startFrame : 10
frames[14].startFrame : 10
frames[15].startFrame : 15
タイムライン上ではキーフレームに変換されてるのに、Frame オブジェクトの startFrame プロパティが更新されなくてハマりました。
解決策は frames 配列を再取得する事
下記のようにコードに追記してみる。
convertoToFrameByFrameAnimation_test.jsfl
var timeline = fl.getDocumentDOM().timelines[0];
var layer = timeline.layers[0];
var frames = layer.frames;
var frameCount = layer.frameCount;
for(var i = 0; i < frameCount; i++)
{
if(i == frames[i].startFrame)
{
if(frames[i].tweenType !== "none")
{
frames[i].convertToFrameByFrameAnimation(); //※1
}
}
fl.trace("frames["+i+"].startFrame : " + frames[i].startFrame);
}
/** ここから追記 **/
//frames 配列を再取得
frames = layer.frames;
fl.trace("\n===================\n");
//もう一回、全フレームのキーフレームを探索
for(i = 0; i < frameCount; i++)
{
//再生ヘッドのフレームのキーフレーム番号を出力
fl.trace("frames["+i+"].startFrame : " + frames[i].startFrame);
}
で、追記した後の出力結果を確認してみると
frames[0].startFrame : 0
frames[1].startFrame : 0
frames[2].startFrame : 0
frames[3].startFrame : 0
frames[4].startFrame : 0
frames[5].startFrame : 5
frames[6].startFrame : 5 //キーフレームに変わってない
frames[7].startFrame : 5 //キーフレームに変わってない
frames[8].startFrame : 5 //キーフレームに変わってない
frames[9].startFrame : 5 //キーフレームに変わってない
frames[10].startFrame : 10
frames[11].startFrame : 10
frames[12].startFrame : 10
frames[13].startFrame : 10
frames[14].startFrame : 10
frames[15].startFrame : 15
=================== //ここで frames 配列を再取得してます
frames[0].startFrame : 0
frames[1].startFrame : 0
frames[2].startFrame : 0
frames[3].startFrame : 0
frames[4].startFrame : 0
frames[5].startFrame : 5
frames[6].startFrame : 6 //ちゃんとキーフレームに変わった
frames[7].startFrame : 7 //ちゃんとキーフレームに変わった
frames[8].startFrame : 8 //ちゃんとキーフレームに変わった
frames[9].startFrame : 9 //ちゃんとキーフレームに変わった
frames[10].startFrame : 10
frames[11].startFrame : 10
frames[12].startFrame : 10
frames[13].startFrame : 10
frames[14].startFrame : 10
frames[15].startFrame : 15
配列を再取得しないと、Frame オブジェクトのプロパティが変わらないとは思わず、しばらくハマりましたが、なんとか無事に解決出来ました。