/** @language japanese
* 新しい LAnimation インスタンスを作成します。
* LAnimation クラスは、スプライトシートでアニメーションをつくる。。
* @class LAnimation
* @extends LSprite
* @constructor
* @param {LSprite} layer LSprite オブジェクト。
* @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 LAnimation(backLayer,data,list);
* backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
* }
* function onframe(){
* player.onframe();
* }
* @examplelink <p><a href="../../../api/LAnimation/index.html" target="_blank">実際のサンプルを見る</a></p>
* @since 1.3.1
* @public
*/
var LAnimation = (function () {
function LAnimation(layer, data, list){
var s = this;
LExtends(s, LSprite, []);
/** @language japanese
* オブジェクトのタイプ
* @property type
* @type String
* @default LAnimation
* @since 1.3.1
* @public
*/
s.type = "LAnimation";
s.rowIndex = 0;
s.colIndex = 0;
s._ll_stepIndex = 0;
s._ll_stepArray = [];
s.mode = 1;
s.isMirror = false;
s.bitmap = new LBitmap(data);
s.imageArray = list;
s.addChild(s.bitmap);
if (layer != null) {
layer.addChild(s);
}
s.onframe();
s.colIndex = 0;
}
var p = {
/** @language japanese
* 再生するフレームを設定します。
* @method setAction
* @param {int} rowIndex 行番号。
* @param {int} colIndex 列番号。
* @param {int} mode 下記の三つの値を設定することができます。(1,0,-1):(正シーケンス進める,ストップ,逆シーケンス進める)。
* @param {Boolean} isMirror 水平方向に反転するかどうか。
* @since 1.3.1
* @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 = new LAnimation(backLayer,data.clone(),list);
* player.setAction(2,0,1,true);
* player2.setAction(2,0,1,false);
* player2.x = 150;
* backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
* }
* function onframe(){
* player.onframe();
* player2.onframe();
* }
* @examplelink <p><a href="../../../api/LAnimation/setAction.html" target="_blank">実際のサンプルを見る</a></p>
*/
setAction : function (rowIndex, colIndex, mode, isMirror){
var s = this, changed = false;
if (rowIndex != null && rowIndex >= 0 && rowIndex < s.imageArray.length) {
s.rowIndex = rowIndex;
changed = true;
}
if (colIndex != null && colIndex >= 0 && colIndex < s.imageArray[rowIndex].length) {
s.colIndex = colIndex;
changed = true;
}
if (mode != null) {
s.mode = mode;
changed = true;
}
if (isMirror != null) {
s.isMirror = isMirror;
if (s.isMirror) {
s.bitmap.x = s.bitmap.getWidth();
s.bitmap.scaleX = -1 * Math.abs(s.bitmap.scaleX);
}else{
s.bitmap.x = 0;
s.bitmap.scaleX = Math.abs(s.bitmap.scaleX);
}
changed = true;
}
if (changed) {
s._ll_stepIndex = 0;
}
},
/** @language japanese
* 今動いているフレームのプロパティを取得。
* @method getAction
* @return {Array} フレームのプロパティ:[rowIndex,colIndex,mode,isMirror]([行番号,列番号,(正|逆)モード,水平方向に反転するかどうか])。
* @since 1.3.1
* @public
* @example
* LInit(200,"legend",800,450,main);
* var player;
* 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);
* backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
* }
* function onframe(){
* player.onframe();
* var result = player.getAction();
* trace(result);
* }
* @examplelink <p><a href="../../../api/LAnimation/getAction.html" target="_blank">実際のサンプルを見る</a></p>
*/
getAction : function () {
var s = this;
return [s.rowIndex, s.colIndex, s.mode, s.isMirror];
},
/** @language japanese
* 次のフレームのアニメーションを表示します。
* @method onframe
* @since 1.3.1
* @public
* @example
* LInit(200,"legend",800,450,main);
* var player;
* 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);
* backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
* }
* function onframe(){
* player.onframe();
* }
* @examplelink <p><a href="../../../api/LAnimation/onframe.html" target="_blank">実際のサンプルを見る</a></p>
*/
onframe : function (){
var s = this, arr, stepFrame = null;
if (s.colIndex >= s.imageArray[s.rowIndex].length) {
s.colIndex = 0;
}
arr = s.imageArray[s.rowIndex][s.colIndex];
if (s._ll_stepArray[s.rowIndex] && s._ll_stepArray[s.rowIndex][s.colIndex]) {
stepFrame = s._ll_stepArray[s.rowIndex][s.colIndex];
} else {
stepFrame = 0;
}
if (s._ll_stepIndex == 0) {
if (typeof arr.script == "function") {
arr.script(s, arr.params);
}
if (typeof arr.width != UNDEFINED && typeof arr.height != UNDEFINED) {
s.bitmap.bitmapData.setProperties(arr.x, arr.y, arr.width, arr.height);
} else {
s.bitmap.bitmapData.setCoordinate(arr.x, arr.y);
}
if (typeof arr.sx != UNDEFINED) {
s.bitmap.x = arr.sx;
}
if (typeof arr.sy != UNDEFINED) {
s.bitmap.y = arr.sy;
}
}
if (s._ll_stepIndex++ < stepFrame) {
return;
}
s._ll_stepIndex = 0;
s.colIndex += s.mode;
if (s.colIndex >= s.imageArray[s.rowIndex].length || s.colIndex < 0) {
s.colIndex = s.mode > 0 ? 0 : s.imageArray[s.rowIndex].length - 1;
s.dispatchEvent(LEvent.COMPLETE);
}
},
/** @language japanese
* 新しい LAnimation オブジェクトとして、元のインスタンスのクローンを返します。オブジェクトはまったく同じコピーになります。
* @method clone
* @return {LAnimation} 元のオブジェクトと同一の新しい LAnimation オブジェクトです。
* @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/LAnimation/clone.html" target="_blank">実際のサンプルを見る</a></p>
*/
clone : function () {
var s = this, 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);
return a;
}
};
for (var k in p) {
LAnimation.prototype[k] = p[k];
}
return LAnimation;
})();
/** @language japanese
* アニメーションは最後のフレームを実行する時。
* <p><a href="LEvent.html#property_COMPLETE">LEvent.COMPLETE</a></p>
* @event LEvent.COMPLETE
*/