@if exp="typeof global.quakesp_object == 'undefined'" @iscript //*-------------------------------------------------------------------------------------------* // //FileName : QuakeSpPlugin.ks // //Version : 1.10 // //Description : 指定したレイヤーのみを揺らすプラグイン // 指定した前景レイヤーの表裏レイヤーを揺らす。 // // // タグ名 quakesp // // 属性   必須? 説明 // laynum ○   揺らす前景レイヤー番号を指定 ","(カンマ)で区切ると // 複数の前景レイヤーを指定可能。 // 例 laynum="0,1" 前景レイヤー0と1が揺れる // time × 揺らす時間を指定(ミリ秒単位) // デフォルトは1000 // [例 time=5000] 1000=1秒 // timemode × time属性の単位 // (詳しくはタグリファレンスのquakeタグを参照) // hmax × 揺れの横方向への最大振幅(pixel単位) // デフォルトは10 // vmax × 揺れの縦方向への最大振幅(pixel単位) // デフォルトは10 // usesin × 三角関数を使った揺らしを行うか // デフォルトはfalse // speed × 揺らすスピード(ミリ秒単位) // デフォルトは50 // // // タグ名 stopquakesp 揺れを停止 // // 属性 なし // // // タグ名 wqsp 揺れ終了まで待つ // // 属性 なし // // // 注意 // *laynum属性にはbase,メッセージレイヤーは指定できない。 // 背景を揺らしたいなら、quakeタグを使う。 // // //*--------------------------------------------------------------------------------------------* class QuakeSpPlugin extends KAGPlugin { var window; // Windowオブジェクト var quakeSpTimer; // quake 用のタイマ var spquaking = false; // quake中か? var spquakeEndTick = 0; // 終了tick var spquakeHorzMax = 0; // 水平方向の最大振幅数 var spquakeVertMax = 0; // 垂直方向の最大振幅数 var spquakePhase = 0; // 揺らす方向 var laynum = []; // 揺らす前景レイヤの番号を格納する配列 var laynum_or; // laynum属性に入力された値を保存 var laypos = []; // 前景レイヤーの初期位置 var count = 0; // 三角関数揺らし用変数 var usesin = false; // アルゴリズムに三角関数を使用するか var speed = 0; // 振幅のスピード var time = 0; // 終了時間 var loop; //*----------------------------------------------------------------* //Name : QuakeSpPlugin // //Purpose : コンストラクタ // オブジェクト作成時に呼ばれる // //in : window (Windowオブジェクト) // //out : なし //-----------------------------------------------------------------* function QuakeSpPlugin(window) { super.KAGPlugin(); this.window = window; } //*----------------------------------------------------------------* //Name : finalize // //Purpose : デストラクタ // オブジェクト消滅時に呼ばれる // //in : なし // //out : なし //-----------------------------------------------------------------* function finalize() { // 揺れを停止 stopQuake(); // タイマーを破棄 invalidate quakeSpTimer if quakeSpTimer != void; super.finalize(...); } //*----------------------------------------------------------------* //Name : doQuakeSp // //Purpose : 揺れ開始 // quakespマクロから呼ばれる // //in : elm (属性として設定された値) // //out : なし //-----------------------------------------------------------------* function doQuakeSp(elm) { // レイヤー番号を代入 laynum = ((string)elm.laynum).split(",", ,true); // 元データを保存 laynum_or = elm.laynum; // レイヤー座標を代入(ロード後の場合) if(elm.laypos != void) { // ずれを修正 setLayersPosition(); // ロードした値を代入 laypos = elm.laypos; } // 普通の場合 else { // 揺らすレイヤー数 var laycount = laynum.count; for(var i=0; i spquakeEndTick) { // loop属性が無効だったら if(!loop) { // 揺れ停止 stopQuake(); return; } } var laycount; // 揺らすレイヤー数 var x; // x座標の増加or減少量 var y; // y座標の増加or減少量 // 要素数を代入 laycount = laynum.count; // メッセージ履歴表示中は揺らさない if(kag.historyShowing) { // すべての前景レイヤーを初期位置に戻す setLayersPosition(); return; } // アルゴリズムに三角関数を使用するか? if(usesin) { x = (int)( spquakeHorzMax * Math.sin(count) ); y = (int)( spquakeVertMax * Math.sin(count) ); } else { // x座標とy座標への増加量を計算 if( spquakeHorzMax == spquakeVertMax ) { // だいたい同じ x = int( Math.random() * spquakeHorzMax - spquakeHorzMax ); y = int( Math.random() * spquakeVertMax - spquakeVertMax ); } else if( spquakeHorzMax < spquakeVertMax ) { // 縦揺れ x = int( Math.random() * spquakeHorzMax - spquakeHorzMax ); y = int( (spquakePhase ? Math.random() : -Math.random() ) * spquakeVertMax); } else { // 横揺れ x = int( (spquakePhase ? Math.random() : -Math.random() ) * spquakeHorzMax ); y = int( Math.random() * spquakeVertMax - spquakeVertMax ); } // 揺らす方向を逆にする spquakePhase = !spquakePhase; } // レイヤーを座標に配置 for(var i=0; i