0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

createJSのアニメーション再生の注意点

Last updated at Posted at 2020-01-17

#概要
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:170

If 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;
    }
}
0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?