#概要
animateCCなどから出力されたオブジェクトに対して、下記のようにアニメーション再生の命令を出す。
var list = _lib.list;
list.gotoAndPlay("anim");
list.gotoAndStop("list_1");
親子関係をもつオブジェクトが多く、それぞれにアニメーションを設定することも多い。
例)
親 list
|
子 ---content1
|
子 ---content2
このオブジェクトの構造が上記のようになっている場合、
子(content1, content2)に対するアニメーション再生が向こうになってしまう場合がある。
var content1 = list.content1;
var content2 = list.content2;
content1.gotoAndPlay("anim1");
content2.gotoAndStop("anim2");
#原因
ムービークリップには、「autoReset」というプロパティが存在する
以下抜粋
autoReset Boolean
Defined in autoReset:170If true, the MovieClip will automatically be reset to its first frame >whenever the timeline adds it back onto the display list. This only >applies to MovieClip instances with mode=INDEPENDENT.
For example, if you had a character animation with a "body" child >MovieClip instance with different costumes on each frame, you could set >body.autoReset = false, so that you can manually change the frame it is >on, without worrying that it will be reset automatically.
Default: true
上記のような仕様が存在するため、親オブジェクトに対してgotoAndPlayなどを行ってから1f待ってからでないと、子オブジェクトに対してアニメーションを再生することができない(currentFrameが戻されるから)
#対策
##時間を空ける
親オブジェクトに対して、アニメーション再生を行ってから1f以上待ってから子オブジェクトに対してアニメーション再生を行う
var frameCounter = 0;
if(frameCounter == 0) {
parent.gotoAndPlay("anim");
}
if(frameCounter == 1) {
child.gotoAndPlay("anim")
}
##autoResetをfalseにする
原因にも書いたようにディスプレイオブジェクトには、autoResetというプロパティ(オブジェクトが生成されたときにcurrentFrameを0に初期化するという仕様)があり、デフォルトでtrueになっている。
画面を準備していく段階で、このプロパティをfalseにしておけば、親オブジェクトと子オブジェクトに対して、同じタイミングでアニメーションを再生することができる
※ただし、どちらのアニメーションも一定フレーム数あった場合どのように再生されるかは未検証
例)gotoAndPlay関数をラッパーする
function gotoAndPlay(animRoot, positionOrLabel, autoReset) {
if (animRoot == null) {
return;
}
var pos = Number(positionOrLabel);
if (isNaN(pos)) {
// 同じフレーム数だったら処理しない
if (animRoot.currentFrame != animRoot.timeline._labels[positionOrLabel] && typeof animRoot.timeline._labels[positionOrLabel] !== 'undefined') {
animRoot.gotoAndPlay(positionOrLabel);
}
} else {
// 同じフレーム数だったら処理しない
if (animRoot.currentFrame != pos) {
animRoot.gotoAndPlay(pos);
}
}
if (typeof autoReset !== 'undefined') {
animRoot.autoReset = autoReset;
}
}