LoginSignup
0
0

More than 5 years have passed since last update.

[jsfl] Frame オブジェクトの convertToFrameByFrameAnimation メソッドを実行した後は frames 配列を再取得しないといけない

Last updated at Posted at 2017-05-02

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 オブジェクトのプロパティが変わらないとは思わず、しばらくハマりましたが、なんとか無事に解決出来ました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0