/** @language japanese
* 新しい LAnimation インスタンスを作成します。
* LAnimationTimeline クラスはLAnimation クラスの上にいくつの便利な機能をサポートしています。LAnimation クラスでアニメーションを再生する時、自身のonframe函数を呼び出し無ければなりません、LAnimationTimelineクラスは自動的にアニメーションを再生することができます。
* @class LAnimationTimeline
* @extends LAnimation
* @constructor
* @param {LBitmapData} data LBitmapData オブジェクト(スプライトシート),アニメーションのひとコマひとコマをひとつにまとめた画像ファイルです。
* @param {Array} list <p>frameごとの属性。</p>
* <p>フォーマットは{x : 0, y : 0, width : 100, height : 100, sx : 0, sy : 0}の通りです。 x, y, width, heightはLBitmapData オブジェクトの各属性の値です,sx, syはひとコマのアニメーションを表示する時の座標です。</p>
* <p>もしスプライトシートのframeの大きさが全部同じであれば、LGlobal.divideCoordinate関数を使って画像を分割することができます。</p>
* @example
* LInit(50, "legend", 800, 480, main);
* function main () {
* var loader = new LLoader();
* loader.addEventListener(LEvent.COMPLETE, loadBitmapdata);
* loader.load("player.png", "bitmapData");
* }
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* player = new LAnimationTimeline(data,list);
* backLayer.addChild(player);
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/index.html" target="_blank">実際のサンプルを見る</a></p>
* @since 1.8.0
* @public
*/
var LAnimationTimeline = (function () {
function LAnimationTimeline (data, list) {
var s = this;
LExtends(s, LAnimation, [null, data, list]);
/** @language japanese
* オブジェクトのタイプ
* @property type
* @type String
* @default LAnimationTimeline
* @since 1.8.0
* @public
*/
s.type = "LAnimationTimeline";
/** @language japanese
* アニメーションのスピード。
* @property speed
* @type int
* @default 0
* @since 1.8.0
* @example
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* var player = new LAnimationTimeline(data,list);
* player.speed = 10;
* backLayer.addChild(player);
* var player2 = new LAnimationTimeline(data.clone(),list);
* player2.speed = 5;
* player2.x = 150;
* backLayer.addChild(player2);
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/speed.html" target="_blank">実際のサンプルを見る</a></p>
* @public
*/
s.speed = 0;
s._speedIndex = 0;
s.ll_labelList = {};
s.addEventListener(LEvent.ENTER_FRAME, s._ll_onframe);
};
var p = {
/** @language japanese
* 新しい LAnimationTimeline オブジェクトとして、元のインスタンスのクローンを返します。オブジェクトはまったく同じコピーになります。
* @method clone
* @return {LAnimationTimeline} 元のオブジェクトと同一の新しい LAnimationTimeline オブジェクトです。
* @since 1.8.8
* @public
* @example
* LInit(200,"legend",800,450,main);
* var player;
* var player2;
* function main(){
* var loader = new LLoader();
* loader.addEventListener(LEvent.COMPLETE, loadBitmapdata);
* loader.load("player.png", "bitmapData");
* }
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* player = new LAnimation(backLayer,data,list);
* player2 = player.clone();
* player2.setAction(2,0);
* player2.x = 150;
* backLayer.addChild(player2);
* backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
* }
* function onframe(event){
* player.onframe();
* player2.onframe();
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/clone.html" target="_blank">実際のサンプルを見る</a></p>
*/
clone : function () {
var s = this, k, o, a = new LAnimation(null, s.bitmap.bitmapData, s.imageArray.slice(0));
a.copyProperty(s);
a.childList.length = 0;
a.bitmap = s.bitmap.clone();
a.addChild(a.bitmap);
for (k in s.ll_labelList) {
o = s.ll_labelList[k];
a.ll_labelList[k] = {rowIndex : o.rowIndex, colIndex : o.colIndex, mode : o.mode, isMirror : o.isMirror};
}
return a;
},
setFrameSpeedAt : function (rowIndex, colIndex, speed) {
var s = this;
if (!s._ll_stepArray[rowIndex]) {
s._ll_stepArray[rowIndex] = [];
}
s._ll_stepArray[rowIndex][colIndex] = speed;
},
_ll_onframe : function (event) {
var self = event.target;
if (self._ll_stop) {
return;
}
if (self._speedIndex++ < self.speed) {
return;
}
self._speedIndex = 0;
self.onframe();
},
/** @language japanese
* LAnimationTimeline インスタンスのタイムライン内にラベルを追加します。
* @method setLabel
* @since 1.8.0
* @public
* @example
* LInit(200,"legend",800,450,main);
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* var player = new LAnimationTimeline(backLayer,data,list);
* player.setLabel("right",2,0,1,true);
* backLayer.addChild(player);
* player.gotoAndPlay("right");
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/setLabel.html" target="_blank">実際のサンプルを見る</a></p>
*/
setLabel : function (name, _rowIndex, _colIndex, _mode, _isMirror) {
this.ll_labelList[name] = {rowIndex : _rowIndex, colIndex : _colIndex, mode : _mode, isMirror : _isMirror};
},
/** @language japanese
* LAnimationTimeline オブジェクトの再生を開始します。
* @method play
* @since 1.8.0
* @public
* @example
* LInit(200,"legend",800,450,main);
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* var player = new LAnimationTimeline(backLayer,data,list);
* player.setLabel("right",2,0,1,true);
* backLayer.addChild(player);
* player.gotoAndPlay("right");
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/play_stop.html" target="_blank">実際のサンプルを見る</a></p>
*/
play : function () {
this._ll_stop = false;
},
/** @language japanese
* LAnimationTimeline オブジェクトの再生を停止します。
* @method stop
* @since 1.8.0
* @public
* @example
* LInit(200,"legend",800,450,main);
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* var player = new LAnimationTimeline(backLayer,data,list);
* player.setLabel("right",2,0,1,true);
* backLayer.addChild(player);
* player.gotoAndPlay("right");
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/play_stop.html" target="_blank">実際のサンプルを見る</a></p>
*/
stop : function () {
this._ll_stop = true;
},
/** @language japanese
* 指定されたフレームで LAnimationTimeline オブジェクトの再生を開始します。
* @method gotoAndPlay
* @param {String} label 再生ヘッドの送り先となるフレームのラベルを表すストリングです。
* @since 1.8.0
* @public
* @example
* LInit(200,"legend",800,450,main);
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* var player = new LAnimationTimeline(backLayer,data,list);
* player.setLabel("right",2,0,1,true);
* backLayer.addChild(player);
* player.gotoAndPlay("right");
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/gotoAndPlay.html" target="_blank">実際のサンプルを見る</a></p>
*/
gotoAndPlay : function (name) {
var s = this, l = s.ll_labelList[name];
s.setAction(l.rowIndex, l.colIndex, l.mode, l.isMirror);
s.play();
},
/** @language japanese
* このムービークリップの指定されたフレームに再生ヘッドを送り、そこで停止させます。
* @method gotoAndStop
* @param {String} label 再生ヘッドの送り先となるフレームのラベルを表すストリングです。
* @since 1.8.0
* @public
* @example
* LInit(200,"legend",800,450,main);
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* var player = new LAnimationTimeline(backLayer,data,list);
* player.setLabel("right",2,0,1,true);
* backLayer.addChild(player);
* player.gotoAndStop("right");
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/gotoAndStop.html" target="_blank">実際のサンプルを見る</a></p>
*/
gotoAndStop : function (name) {
var s = this, l = s.ll_labelList[name];
s.setAction(l.rowIndex, l.colIndex, l.mode, l.isMirror);
s.onframe();
s.stop();
},
/** @language japanese
* 指定されたフレームにスクリプトを追加する。
* @method addFrameScript
* @param {String} label 指定されたフレーム。
* @param {Function} func 関数。
* @param {Array} params 関数を実行する時のパラメータ。
* @since 1.8.0
* @public
* @example
* LInit(200,"legend",800,450,main);
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* var player = new LAnimationTimeline(backLayer,data,list);
* player.setLabel("right",2,0,1,true);
* player.addFrameScript("right",scriptTest,["testParams1","testParams2"]);
* backLayer.addChild(player);
* player.gotoAndPlay("right");
* }
* function scriptTest(param1,param2){
* trace("scriptTest Run : " + param1 + "," + param2);
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/addFrameScript.html" target="_blank">実際のサンプルを見る</a></p>
*/
addFrameScript : function (name, func, params) {
var l = this.ll_labelList[name];
var arr = this.imageArray[l.rowIndex][l.colIndex];
arr.script = func;
arr.params = params ? params : null;
},
/** @language japanese
* 指定されたフレームにあるスクリプトを削除する。
* @method removeFrameScript
* @param {String} label 指定されたフレーム。
* @since 1.8.0
* @public
* @example
* LInit(200,"legend",800,450,main);
* function loadBitmapdata(event){
* var backLayer = new LSprite();
* addChild(backLayer);
* var list = LGlobal.divideCoordinate(480,630,3,4);
* var data = new LBitmapData(event.currentTarget,0,0,120,210);
* var player = new LAnimationTimeline(backLayer,data,list);
* player.setLabel("right",2,0,1,true);
* player.addFrameScript("right",scriptTest,["testParams1","testParams2"]);
* backLayer.addChild(player);
* player.gotoAndPlay("right");
* }
* function scriptTest(param1,param2){
* trace("scriptTest Run : " + param1 + "," + param2);
* }
* @examplelink <p><a href="../../../api/LAnimationTimeline/removeFrameScript.html" target="_blank">実際のサンプルを見る</a></p>
*/
removeFrameScript : function (name) {
var l = this.ll_labelList[name];
this.imageArray[l.rowIndex][l.colIndex].script = null;
}
};
for (var k in p) {
LAnimationTimeline.prototype[k] = p[k];
}
return LAnimationTimeline;
})();