var element = new Element( "LAYER" ); var startPosition = new Dimension( 100 , 100 ); var endPosition = new Dimension( 300 , 500 ); // EdgingMover クラスのインスタンスを生成 var emover = new EdgingMover( element , // 対象レイヤー startPosition , // 始点 endPosition , // 終点 30 , // 分割数 0 // イージング値 ); // この関数を実行すると、レイヤー LAYER が startPosition から、 // endPosition まで 30 ステップで等速移動(イージング値=0)します。 function move(){ if( emove.step() ) setTimeout( "move();" , 50 ); }
Element element ; // 対象レイヤー Dimension sPosition ; // 始点 Dimension ePosition ; // 終点 number tmpCount ; // ステップ数 number divCount ; // 分割数 number edging ; // イージング値多いように思いますが、これらについてはコンストラクタ↓で説明しています。
EdgingMover(); EdgingMover( Element target , Dimension endPosition , number count ); EdgingMover( Element target , Dimension startPosition , Dimension endPosition , number count ); EdgingMover( Element target , Dimension startPosition , Dimension endPosition , number count , number edging );インスタンスを生成します。宣言の仕方は上の 4 つです。
動かそうとするレイヤー( target )、
移動しはじめる始点のX座標、Y座標( startPosition )、
どこまで移動するかという終点のX座標、Y座標( endPosition )、
そして、何段階( count )で移動するか
では、コンストラクタの説明に戻ります。一番ややこしそうな
EdgingMover( Element target , Dimension startPosition , Dimension endPosition , number count , number edging );
はもう分かりますね。上述したアニメーションに必要な情報と edging 値を順に書いているだけです。
次に EdgingMover( Element target , Dimension startPosition , Dimension endPosition , number count );
は、上との違いは edging 値がないだけですね。
この場合、edging 値は 0 に設定されます。つまり等速アニメーションです。
次に EdgingMover( Element target , Dimension endPosition , number count );
です。
指定するのは 対象レイヤー(target)、終点(endPosition)、分割数(count) ですが、始点とイージング値がありませんよね。
この場合、始点は target で指定したレイヤーの現在位置となり、イージング値は 0 (等速)になります。
最後に引数なしの EdgingMover();
ですが、これはメンバ変数に何も設定されません。
変数の型等を明示的に示したいときや、値をあとで設定したいときに使用します。
この場合、各インスタンス変数はメソッド等で設定しなくてはいけません。
var element = new Element( "LAYER" ); var sPosition = new Dimension( 100 , 200 ); var ePosition = new Dimension( 300 , 500 ); var emover0 = new EdgingMover(); var emover1 = new EdgingMover( element , ePosition , 50 ); var emover2 = new EdgingMover( element , sPosition , ePosition , 50 ); var emover3 = new EdgingMover( element , sPosition , eposition , 50 , 0 );
void setElement( Element target );アニメーションさせる対象レイヤーを設定又は変更します。
var element = new Element( "LAYER" ); var emover = new EdgingMover( element , new Dimension( 100 , 100 ) , 50 ); emover.setElement( new Element( "ANOTHER_LAYER" ) );
void setPosition( Dimension endPosition ); void setPosition( Dimension startPosition , Dimension endPosition );始点と終点を設定又は変更します。
var element = new Element( "LAYER" ); var sPosition = new Dimension( 200 , 100 ); var ePosition = new Dimension( 400 , 500 ); var emover = new EdgingMover( element , sPosition , ePosition , 50 ); var sPosition0 = new Dimension(); var ePosition0 = new Dimension( 100 , 200 ); emover.setPosition( sPosition0 , ePosition0 );
void setDivCount( number count );何段階でアニメーションするかという分割数を設定又は変更します。
var element = new Element( "LAYER" ); var emover = new EdgingMover( element , new Dimension( 100 , 100 ) , 50 ); emover.setDivCount( 20 ); // 50 段階が 20 段階に変更されます。
void setEdging(); void setEdging( number edging );イージング値を設定します。
var emover = new EdgingMover(); emover.setEdging( -100 ); // 加速
boolean step();このメソッドが移動させるために必要なメイン関数です。
// インスタンス生成 // コンストラクタの形式は EdgingMover( element , startPosition , endPosition , divCount ) // イージング値は設定しないので 0 ( 等速 ) var emover = new EdgingMover( new Element( "LAYER" ), // 対象レイヤー new Dimension( 50 , 50 ), // 始点 new Dimension( 400 , 300 ), // 終点 100 // 分割数 ); // setTimeout を含める移動関数を作成 function move(){ // step メソッドは呼び出すたびに対象レイヤーをワンステップ進める。 // step メソッド自体は論理値を返す。 // 終点についたとき step メソッドは false を返し、再帰を終了する。 if( emover.step() ){ setTimeout( "move();" , 10 ); // 移動は 10msec 間隔 } } // 移動開始 move();
move()
)を再帰的に呼び出し、終点まで移動させるわけです。tmpCount < divCount
が成り立つ間、位置座標を計算し対象レイヤーを移動させ、step 関数自体は true を返します。tmpCount < divCount
が成り立たなくなったとき、step 関数は false を返し、tmpCount を 0 に戻します。
string toString();EdgingMover クラスの標準出力文字列を返します。
"EdgingMover : " + this.element.getID()
です。
var emover = new EdgingMover( new Element("LAYER") , new Dimension(200,100) , 50 ); status = emover // 結果は EdgingMover : LAYER
void auto( EdgingMover emover ); void auto( EdgingMover emover , number time );僕が楽したいために作成したメソッドです(^^);
var emover = new EdgingMover( new Element("LAYER") , new Dimension(100,100) , 50 ); EdgingMover.auto( emover , 10 );
型 | メソッド名 | 説明 |
---|---|---|
void | setElement | 対象レイヤーの設定 |
void | setPosition | 始点、終点の設定 |
void | setDivCount | 分割数の設定 |
void | setEdging | イージング値の設定 |
boolean | step | ワンステップ移動 |
string | toString | 標準出力文字列 |
クラスメソッド | ||
void | auto | 再帰関数の省略 |
y = a * Math.pow( x , 2 );
var tmpCount = 0 ; var divCount = 10 ; // 10 段階で加速 function move(){ if( tmpCount < divCount ){ var x = 10 * Math.pow( tmpCount++ , 2 ); element.setPositionX( x ); setTimeout( "move();" , 50 ) }else{ element.setPositionX( 800 ); } }
x = 10 * Math.pow( 9 , 2 ) = 810
です。var emovers = new Array(); for(var i=0;Elements["LAYER"+i]!=null;i++){ emovers[i] = new EdgingMover( Elements["LAYER"+i], new Dimension( 300 , 300 ), 50 ); }
function move0(){ if( emover[0].step() ) setTimeout( "move0();" , 10 ); } function move1(){ if( emover[1].step() ) setTimeout( "move1();" , 10 ); } function move2(){ if( emover[2].step() ) setTimeout( "move2();" , 10 ); } function move3(){ if( emover[3].step() ) setTimeout( "move3();" , 10 ); } function move4(){ if( emover[4].step() ) setTimeout( "move4();" , 10 ); } function move(){ move0(); move1(); move2(); move3(); move4(); }
var moves = new Array( emovers.length ); for(var i=0;i<moves.length;i++) moves[i] = function(i){ if( emovers[i].step() ) setTimeout( "moves["+i+"]("+i+")" , 10 ); } function move(){ for(var i=0;i<moves.length;i++) moves[i](i); }
var commonFlag = true ; function move(){ if( commonFlag ){ for(var i=0;i<movers.length;i++) commonFlag = movers[i].step(); setTimeout( "move();" , 10 ); } }
function move(){ if( movers[0].step() ){ for(var i=1;i<movers.length;i++) movers[i].step(); setTimeout( "move();" , 10 ); } }