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

# convertToFrameByFrameAnimation メソッドとは
![](https://qiita-image-store.s3.amazonaws.com/0/3307/3e94b18d-74fa-5f00-26f2-9ea59802fbb1.png)
こんな感じのトゥイーンが入ったフレームを

![](https://qiita-image-store.s3.amazonaws.com/0/3307/128660a3-73ce-d2ec-6ea2-ea3753f7641a.png)
こんな感じにトゥイーンを削除してキーフレームに変換する jsfl のメソッドです。
このメソッドは Frame オブジェクトの中に入ってます。

公式ドキュメントの解説
[frame.convertToFrameByFrameAnimation()](http://help.adobe.com/ja_JP/flash/cs/extend/WS849c47c2a95c100747ca9dfc13b0a9a26e9-8000.html)


# キーフレームに変換した後の各フレームにアクセスしたい

```jsfl: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 の部分を通った瞬間に
![](https://qiita-image-store.s3.amazonaws.com/0/3307/3e94b18d-74fa-5f00-26f2-9ea59802fbb1.png)
▲こんなタイムラインが
▼こんなタイムラインに変わってるはずなのですが
![](https://qiita-image-store.s3.amazonaws.com/0/3307/128660a3-73ce-d2ec-6ea2-ea3753f7641a.png)

トレース表示結果を確認すると

```出力結果
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 配列を再取得する事
下記のようにコードに追記してみる。

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