Stageサイズが変わったときにMovieClipを動かすクラス [AS2]
- 2008-07-29
- flash
クラスを書くのに少しずつ慣れてきたところで、拙いクラスを開き直って公開してみようと思います。※注意!AS2です。
横幅、縦幅が100%のFlashで、Stageサイズを変えたときにムービークリップの位置をアニメーションで移動させる効果を使うことがよくあると思います。
例えば有名なHYBRIDWORKSさんのサイトがそうですね。
やり方はStage.onResizeリスナーイベントを使って、リサイズされたときにムービークリップを動かすよう指示するだけで特に難しくないのですが、動かしたいムービークリップがひとつだけならともかく、何個ものムービークリップをそれぞれ左上、右上、左下、右下のような位置に動かしたいとき、いちいち計算して指定するのもなかなか面倒です。
そこでそれを簡単に指示するためのクラスを作りました。
flaファイルとソースファイル一式はこちら。
(fusekitつかっています。)
使い方
ダウンロードして解凍したファイルの中から「stageresize_test.fla」を開いてください。srcフォルダにクラスパスを通してパブリッシュすれば動きます。
動かしたいムービークリップは、好きな場所に配置できます。
右上に置きたいものは右上をムービークリップの中心点に、左下は左下、右下は右下、その他は左上に設定してください。
タイムラインに書くスクリプトは「script」レイヤーの1フレーム目を参考に。
-
var stageObj:StageOnResize = new StageOnResize(_root, 800, 520);
StageOnResizeクラスのインスタンスを作ります。引数は1つ目が動かしたいムービークリップを置いているムービークリップ名(ここでは_root)、2つ目と3つ目はStageの横幅と縦幅です。
-
stageObj.addMovie({m:"right_mc", pos:"right"});
stageObj.addMovieで動かしたいムービークリップを登録してください。ムービークリップは何個でも登録できます。mはムービークリップの名前、posは置きたい場所。
・"right" 右付
・"bl" 左下
・"br" 右下
・"center" 横も縦も中央
・"cw" 横だけ中央
・"ch" 縦だけ中央
・"cr" 右付で縦の中央
・"cb" 下付で横の中央
左付のムービークリップはStageサイズが変わっても動かないので登録する必要はありません。
-
stageObj.setEase(0.7, "easeOutQuint");
移動スピードを設定します。省略するとデフォルトのスピードで動きます。
引数の1つ目は移動終了までの時間(秒)、ふたつめはイージングの種類です。FuseKitのPennerEasingです。イージングの違いは以下のページなどを参考にしてください。
にゃあプロジェクト - ウェブログ - FuseKitのイージング
一応、StageOnResize.asのソースは以下。
正直、もっとスマートな書き方があると思います。
特にcase文のあたり。だらだらと分岐で計算しているだけです。
赤ペン先生募集中。
-
import com.mosesSupposes.fuse.ZigoEngine;
-
import com.mosesSupposes.fuse.Shortcuts;
-
import com.mosesSupposes.fuse.PennerEasing;
-
-
class usr.StageOnResize {
-
-
private var root:MovieClip;
-
private var mcList:Array = new Array;
-
private var stagew:Number;
-
private var stageh:Number;
-
-
private var fuseSec:Number = 0.8;
-
private var fuseEase:String = "easeOutCubic"
-
-
function StageOnResize(mc:MovieClip, w:Number, h:Number) {
-
-
// FuseKit
-
ZigoEngine.simpleSetup(Shortcuts, PennerEasing);
-
ZigoEngine.SKIP_LEVEL = 2;
-
-
root = mc;
-
stagew = w;
-
stageh = h;
-
-
// Flashムービーを左上に配置
-
Stage.align = "TL";
-
// 伸縮を拡大/縮小なしに
-
Stage.scaleMode = "noScale";
-
// MovieClipをリスナーに登録
-
Stage.addListener(root);
-
var scope = this;
-
root.onResize = function():Void {
-
scope.moveMovie();
-
}
-
-
}
-
-
//動くスピード
-
public function setEase(sec:Number, ease:String):Void {
-
fuseSec = sec;
-
fuseEase = ease;
-
}
-
-
//動かすMovieClipを登録
-
public function addMovie(obj:Object):Void {
-
//xy初期値
-
obj.x = root[obj.m]._x;
-
obj.y = root[obj.m]._y;
-
//配列化
-
mcList.push(obj);
-
//ターゲット位置取得
-
getPosition(obj);
-
//初期位置へ移動
-
root[obj.m]._x = obj.nx;
-
root[obj.m]._y = obj.ny;
-
}
-
-
private function moveMovie():Void {
-
for (var i:String in mcList) {
-
//ターゲット位置取得
-
getPosition(mcList[i]);
-
//移動(Fusekit)
-
root[mcList[i].m].slideTo(mcList[i].nx, mcList[i].ny, fuseSec, fuseEase);
-
}
-
}
-
-
private function getPosition(p_obj:Object):Void{
-
switch(p_obj.pos) {
-
case "right": //右付
-
p_obj.nx = Math.round(Stage.width - (stagew-p_obj.x));
-
p_obj.ny = p_obj.y;
-
break;
-
-
case "bl": //左下
-
p_obj.nx = p_obj.x;
-
p_obj.ny = Math.round(Stage.height - (stageh - p_obj.y));
-
break;
-
-
case "br": //右下
-
p_obj.nx = Math.round(Stage.width - (stagew-p_obj.x));
-
p_obj.ny = Math.round(Stage.height - (stageh - p_obj.y));
-
break;
-
-
case "center": //縦も横も中央
-
p_obj.nx = Math.round((Stage.width - root[p_obj.m]._width) / 2);
-
p_obj.ny = Math.round((Stage.height - root[p_obj.m]._height) / 2);
-
break;
-
-
case "cw": //横だけ中央
-
p_obj.nx = Math.round((Stage.width - root[p_obj.m]._width)/2);
-
p_obj.ny = p_obj.y;
-
break;
-
-
case "ch": //縦だけ中央
-
p_obj.nx = p_obj.x;
-
p_obj.ny = Math.round((Stage.height - root[p_obj.m]._height) / 2);
-
break;
-
-
case "cr": //右付で縦の中央
-
p_obj.nx = Math.round(Stage.width - (stagew-p_obj.x));
-
p_obj.ny = Math.round((Stage.height - root[p_obj.m]._height) / 2);
-
break;
-
-
case "cb": //下付で横の中央
-
p_obj.nx = Math.round((Stage.width - root[p_obj.m]._width) / 2);
-
p_obj.ny = Math.round(Stage.height - (stageh - p_obj.y));
-
break;
-
}
-
}
-
}