あんちょこ|web製作


Flash

制作工程:actionscript 2.0


Flash|基礎|応用

sample一覧↓

プロパティ値の往復運動:(1)alpha,scale,rotation


scriptの記述による運動の違い

alpha値の往復

参照
上部Flash-alpha:A、B、C、D
共通の値
形状
矩形:w85×h85
変化値
10
1フレームごとに10 (%)づつ値を変化する。
※この値が大きいほど1フレームごとの変化が大きい=変化の速度が速くなる。
最大最小値
20〜100
20(%)から100(%)の範囲で、透明度を10%づつ増加(または減少)して、
最大最小値を往復する。
actionscript記述場所
各ムービークリップに記述
(初期値100%の)矩形のalpha値が100%のときは値を10%づつ減少し、90,80,,,と20%まで徐々に減少。
20%になると、10%づつ値を増加させ、30,40,,,と100%まで徐々に増加。
以上を繰り返す。

各MCのactionscript

A|MC-actionscript

onClipEvent (load) {
this._alpha=100;//なくてもよい
speed = 10;
}
onClipEvent (enterFrame) {
this._alpha += speed;
if (this._alpha>100 || this._alpha<20) {
speed = -speed;
}
}


B|MC-actionscript

onClipEvent (load) {
mcA=100;//初期値の設定・・・必須
speed = 10;
}
onClipEvent (enterFrame) {
this._alpha=mcA;//左右逆転不可
mcA += speed;
if (mcA>100 || mcA<20) {
speed = -speed;
}
}


C|MC-actionscript

onClipEvent (load) {
mcA=100;//必須
speed = -10;
}
onClipEvent (enterFrame) {
this._alpha=mcA;//左右逆転不可
mcA += speed;
if (mcA<20) {
speed = 10;
} else if (mcA>100) {
speed = -10;
}
}


D|MC-actionscript

onClipEvent (load) {
mcA = 100;//必須
flg = 1;
speed = 10;
}
onClipEvent (enterFrame) {
this._alpha = mcA;//左右逆転不可
mcA += flg*speed;
if (mcA<20) {
flg = 1;
}
if (mcA>100) {
flg = -1;
}
}

解説

Aの記述が一番短く、直感的にわかりやすいが、原因不明のエラー(?)が起こる場合がある。具体的な現象は、往復の数回目に突如、一定の値でとまっているような微細なループ点滅を起こすというもの。比較演算子に=を足したり、ムービークリップを単独使用にしたり、初期値を追加削除しても、エラーが起こる場合と起こらない場合の条件がいまいち不明。ステージ上にalpha値を変化する他のムービークリップがあると、エラーが起こりやすいのかもしれないが、何も問題が起こらないこともある。
Bのように、this._alpha=mcAとひとつ代入式を追加すると、その問題は一回も起こらない。Aが他の式に比べ、往復回数が微妙に速いのもエラーが起こるのと同じ原因なのかも。不安定なので、alpha値の往復運動にはBを使用するのが妥当。
BDは同じ内容の式。指定した範囲をこえたら変化値の正負を逆転するやり方。(最大値100をこえたら10を-10に、最小値20をこえたら-(-10)に。)往復回数がACに比べ、揃っているのも同じ正負を逆転するやり方だからかも。
Dflg*speed、flg = 1;、flg = -1;と条件式をひとつにまとめたものがB
D は参考書などによく載っている例。もっと複雑な動きをする場合に応用が利きそう。
C は条件によって、speedの値を直接代入する式。一番確実な方法にみえるが、変化値を変更する際に少々面倒。減少のときと増加のときの速度が異なる場合などは重宝するかも。

scale値の往復

参照
上部Flash-scale:A、B、C、D、a、b、c、d
応用 shirokuma Link naviの風見鳥→
共通の値
形状
矩形(増減用):w200×h20(A、B、C、D)
魚(反転用):w200(a、b、c、d)
変化値
10
1フレームごとに10(%)づつ値を変化する。
※この値が大きいほど1フレームごとの変化が大きい=変化の速度が速くなる。
最大最小値
矩形(増減用):xscale|20〜100
20(%)から100(%)の範囲で、横幅を10%づつ増加(または減少)して、
最大最小値を往復する。

魚(反転用):xscale|-100〜100
※xscale値にマイナスの値を代入すると形状が左右反転する。
(yscaleのときは上下反転)

0(%)から100(%)の範囲で、横幅を10%づつ増加(または減少)して、
0(%)から-100(%)の範囲で、反転した魚の横幅を、10%づつ増加(または減少)する。三次元回転のようにy軸を中心に右向き左向きを反転し続ける。
actionscript記述場所
各ムービークリップに記述
矩形はxscale値が100%のときは値を10%づつ減少し、 20%になると、10%づつ値を増加する。
魚は100%から-100%までは10%づつ値を減少し、-100%から100%までは10%づつ値を増加する。
以上を繰り返す。

各MCのactionscript:増減

A|MC-actionscript

onClipEvent (load) {
this._xscale=100;//なくてもよい
speed = 10;
}
onClipEvent (enterFrame) {
this._xscale += speed;
if (this._xscale>100 || this._xscale<20) {
speed = -speed;
}
}


B|MC-actionscript

onClipEvent (load) {
mcA=100;//必須
speed = 10;
}
onClipEvent (enterFrame) {
this._xscale=mcA;//左右逆転不可
mcA += speed;
if (mcA>100 || mcA<20) {
speed = -speed;
}
}


C|MC-actionscript

onClipEvent (load) {
mcA=100;//必須
speed = -10;
}
onClipEvent (enterFrame) {
this._xscale=mcA;//左右逆転不可
mcA += speed;
if (mcA<20) {
speed = 10;
} else if (mcA>100) {
speed = -10;
}
}


D|MC-actionscript

onClipEvent (load) {
mcA = 100;//必須
flg = 1;
speed = 10;
}
onClipEvent (enterFrame) {
this._xscale = mcA;//左右逆転不可
mcA += flg*speed;
if (mcA<20) {
flg = 1;
}
if (mcA>100) {
flg = -1;
}
}

解説

基本的に式は_alphaと同じ。ただ、alpha値で起こっていたAのエラーが、確認する限り起こらない。
alphaの場合と同じように、BDに比べ速度が微妙にはやいので根本的な要因は残っているのかも。
Aの初期値は入れても入れなくても同じ結果になるが、以下の反転の場合は初期値が必須になる。

各MCのactionscript:反転

a|MC-actionscript

onClipEvent (load) {
this._xscale=100;//必須
speed = 10;
}
onClipEvent (enterFrame) {
this._xscale += speed;
if (this._xscale>100 || this._xscale<-100) {
speed = -speed;
}
}


b|MC-actionscript

onClipEvent (load) {
mcA=100;//必須
speed = 10;
}
onClipEvent (enterFrame) {
this._xscale=mcA;//左右逆転不可
mcA += speed;
if (mcA>100 || mcA<-100) {
speed = -speed;
}
}


c|MC-actionscript

onClipEvent (load) {
mcA=100;//必須
speed = -10;
}
onClipEvent (enterFrame) {
this._xscale=mcA;//左右逆転不可
mcA += speed;
if (mcA<-100) {
speed = 10;
} else if (mcA>100) {
speed = -10;
}
}


d|MC-actionscript

onClipEvent (load) {
mcA = 100;//必須
flg = 1;
speed = 10;
}
onClipEvent (enterFrame) {
this._xscale = mcA;//左右逆転不可
mcA += flg*speed;
if (mcA<-100) {
flg = 1;
}
if (mcA>100) {
flg = -1;
}
}

解説

上記にも記したとおり、Aの場合でも初期値が必須になる。その他にも、ABの場合は初期値と最大値が同じ値でないとエラーが起こる。この場合は、初期値(100)、最大値(>100)。値を一致すれば100(%)でなくてもよい。
ただ、オブジェクトの形状がshirokuma Link naviの風見鳥のように線が細い場合、最大値を100にすると実際のxscaleより横に膨張してみえる。99にすると、実際より伸縮してみえる。
CDは初期値と最大値が一致しなくても使えるので、風見鳥の設定はDを使用して、初期値を100、最大最小値をそれぞれ99、-99にしてちょうど良い形状を保っている。

rocation値の往復

参照
上部Flash-rotation:A、B、C、D
共通の値
形状
矩形(垂直):w10×h120
基準値:下辺中央
変化値
10
1フレームごとに10 (度)づつ値を変化する。
最大最小値
-90〜90
-90(度)から90(度)の間を10度づつ増加(または減少)して、
最大最小値を往復する。
※Flashのrotationでは時計回りが正、反時計回りが負になる。
actionscript記述場所
各ムービークリップに記述
(初期値0度、基準点下中央)矩形を10度づつ回転し90度をこえたら-10度づつ回転(反回転)する。
-90度をこえたら、正の方向に10度づつ回転する。
以上を繰り返す。

各MCのactionscript

A|MC-actionscript

onClipEvent (load) {
this._rotation=0;//なくてもよい
speed = 10;
}
onClipEvent (enterFrame) {
this._rotation += speed;
if (this._rotation>90 || this._rotation<-90) {
speed = -speed;
}
}


B|MC-actionscript

onClipEvent (load) {
mcA=100;//必須
speed = 10;
}
onClipEvent (enterFrame) {
this._rotation=mcA;//左右逆転不可
mcA += speed;
if (mcA>90 || mcA<-90) {
speed = -speed;
}
}


C|MC-actionscript

onClipEvent (load) {
mcA=100;//必須
speed = -10;
}
onClipEvent (enterFrame) {
this._rotation=mcA;//左右逆転不可
mcA += speed;
if (mcA<-90) {
speed = 10;
} else if (mcA>90) {
speed = -10;
}
}


D|MC-actionscript

onClipEvent (load) {
mcA = 100;//必須
flg = 1;
speed = 10;
}
onClipEvent (enterFrame) {
this._rotation = mcA;//左右逆転不可
mcA += flg*speed;
if (mcA<-90) {
flg = 1;
}
if (mcA>90) {
flg = -1;
}
}

解説

よく見るとAだけ微妙に速度がずれてるが、それ以外は特に問題なし。
rotationによる角度の制御のついでに、三角関数による角度の制御について、以下。

[上記、rotation値の往復増減の説明↑を折りたたむ]

三角関数とactionscript(簡易版)

参考URL
(adobe):三角関数の基礎の中でFlashに必要な部分だけ教えてくれる。
http://support.adobe.co.jp/faq/faq/qadoc.sv?228615+002
(adobe pdf)
ActionScript辞書:必須だが重い。Flash付属のヘルプのほうが良いかも。
http://download.macromedia.com/pub/documentation/jp/
flash/mx2004/fl_actionscript_reference.pdf

Flashゲーム講座&サンプル集:円運動の関数が載ってる
http://hakuhin.hp.infoseek.co.jp/main/as/move.html#MOVE_03
[使用目的1]
平面上の位置の特定

レーダー
「北北西1キロに●●」
↑↑中心からの方向と距離によって、平面上の位置(x,y)を求めることができる。
三角関数とはこれを直交座標(直角三角形)に変換し、方向を角度、距離を中心点からの円の半径として
平面座標を数式化したもの。
角度の把握(θ)と 距離の把握(円の半径)・・・位置の把握(x座標、y座標)

直交座標
・原点(0,0):円の中心
・原点(0,0)からの距離:円の半径=直角三角形の斜辺
・原点(0,0)から直線をのばした時、x軸との間の角度:θ
・原点(0,0)から直線をのばした時、円と交わる座標:(x座標,y座標)

原点からの距離が1のとき[半径1]
(x座標、y座標)=(cosθ,sinθ)

原点からの距離がDのとき[半径D]
(x座標、y座標)=(D*cosθ,D*sinθ)

cosθ=底辺/斜辺sinθ=高さ/斜辺で値が求められるが、
flashではこの計算をしてくれるMathメソッドがすでに用意されている。

コサインの計算
Math.cos(ラジアン)=Math.cos(度数*Math.PI/180)
cosθ=x座標=Math.cos(度数*Math.PI/180)×原点からの距離D(半径)

サインの計算
Math.sin(ラジアン)=Math.sin(度数*Math.PI/180)
sinθ=y標=Math.sin(度数*Math.PI/180)×原点からの距離D(半径)

ラジアン
三角関数Mathメソッドの角度の単位にはラジアン(円周(=1)上の移動の割合、のようなもの)を使用する。
※ちなみに、半径rの円周を求める式は「円周=2πr」

とある円を一周するときラジアンは2π、角度は360度、半周するとき円周は1/2、ラジアンは1/2×2πでπ、角度は180度、1/4周するときラジアンは1/4×2πで1/2π、角度は90度・・・
・360度=(360/360:円を一周した)        2πラジアン
・180度=(180/360:円を半周した)        πラジアン
・90 度=(90/360:円を1/4周した) 2π×1/4=  1/2πラジアン
・45 度=(45/360:円を1/8周した) 2π×1/8=  1/4πラジアン
つまり
ラジアン=2π × 度数/360

πの値は、Math.PI(定数)とする

ラジアン=Math.PI * 度数/180 =度数*Math.PI/180
度数=180 * ラジアン/Math.PI =ラジアン*180/Math.PI

[使用目的2]
角度の算出

tanθの発想
・直角の点=物体の位置
・物体から影の先端までの距離=(底辺D,0)
・太陽光線の角度(θ)
・・・物体の高さ=D*tanθ
高さ・・・とあるy座標ー基準となるy座標
底辺・・・とあるx座標ー基準となるx座標

tanθ=高さ/底辺
つまり基準となる点が(0,0)のときは
tanθ=y/x

flashではx座標,y座標の正負を評価した上で値を返すMath.atan2()メソッドがある。

逆関数
座標(x,y)から角度θを求める。

tanθ=(y/x)
atan(アークタンジェント):タンジェントの逆関数
θ=atan(tanθ)
=atan(y/x)

Math.atan2(y,x)
y座標、x座標を引数として渡すと、x軸から正(反時計回り)の角度をラジアン単位で計算して返すメソッド。
※座標の順番注意:y座標から

つまりFlashで角度を求めるときは
θ(ラジアン)=Math.atan2(高さ、底辺)
ラジアンを度数に変換するときは
度数=ラジアン*180/Math.PI
以上の式に値を代入するだけで良い

[実用例]
マウスポインタに角度を追随するMCの関数の設定、および三角関数での角度の制限
[上記、三角関数の説明からここまで↑を折りたたむ]

マウスポインタを追随するMCの関数の設定、および三角関数での角度の制限

参照
上部Flash-rotation-special:E、1、2
応用:shirokuma Link naviのTVアンテナ→
共通の値、設定
制作の注意点
オブジェクトは水平右方向がマウスを追随する先端になるように作成。「→」
シンボルに変換するときは、基準点は左辺中央に設定。「+→」
※ラジアンの基準は水平右方向(x軸正)
actionscriptの注意点
※Mac OS上ではx,yの値がともに0のとき値0ではなく、NaNを返すことがある。
アクションが実行されないのを防ぐために、
設定する際は、if文でx,yの値がともに0のときのアクションを改めて指定する。
actionscript記述場所
各ムービークリップに記述。
1|MC-actionscript
基本タイプ

onClipEvent (enterFrame) {
xM = _root._xmouse-this._x;
yM = _root._ymouse-this._y;
this._rotation = thisR;
if (xM == 0 && yM == 0 ) {
thisR = 0;
} else {
Radian = Math.atan2(yM, xM);
thisR = Radian*180/Math.PI;
}
}

2|MC-actionscript
上半分180度だけ角度を移動するタイプ

onClipEvent (enterFrame) {
xM = _root._xmouse-this._x;
yM = _root._ymouse-this._y;
this._rotation = thisR;
if (xM == 0 && yM == 0) {
thisR = 0;
} else if (yM<0) {
Radian = Math.atan2(yM, xM);
thisR = Radian*180/Math.PI;
}
}

E|MC-actionscript
下半分のマウスを上半分の位置に変えて、180度だけ角度を移動するタイプ

onClipEvent (enterFrame) {
xM = _root._xmouse-this._x;
yM = _root._ymouse-this._y;
this._rotation = thisR;
if (xM == 0 && yM == 0 ) {
thisR = 0;
} else {
if (yM<0) {
Radian = Math.atan2(yM, xM);
thisR = Radian*180/Math.PI;
} else if (yM>0) {
Radian = Math.atan2(yM, xM);
thisR = (Radian*180/Math.PI)*-1;
}
}
}

解説


_root._xmouse、_root._ymouseでステージ上のマウスの座標を取得。ムービークリップの基準点を引いて、それぞれ高さと底辺を求めている。角度を求めている式はRadian = Math.atan2(yM, xM);の部分。値はラジアンで、水平方向の右(x軸正)を基準にしたマウスの方角をタンジェントの逆関数で計算している(Flashが)。thisR = (Radian*180/Math.PI)でラジアンを度数に変換し、this._rotation = thisR;でムービークリップのrotation値に度数を代入している。この関数がenterframeにより表示中ずっと読み込まれ続けるので、マウスを動かすたびにムービークリップのrotation値が変更される。
は高さ(上図参照、式ではyM)の値が正か負かによってマウスを追随する角度を制限。Flashの基準は左上なので、ムービークリップの基準点より、マウスのy座標が上にあるとき、_root._ymouse-this._yの値は負になる。この場合だと値をyM<0で条件を負に制限し、上半分のみ反応するようにしている。yM>0だと下半分のみになる。横方向の場合は底辺(上図参照、式ではxM)の値が正か負かによって角度を制限できる。やはりFlashの基準は左上なので、マウスのx座標がムービークリップの基準点より左にあるとき_root._xmouse-this._xの値は負、xM<0で左側に制限。右にあるとき_root._xmouse-this._xの値は正、xM>0で右側に制限できる。
ステージのxy数値をそのまま使って_x、_yの移動範囲を制限すれば180度以下も簡単に設定できる。角度のある扇型範囲で制限するときはthisR = Radian*180/Math.PIの式の後に任意の角度をたす。(+60など。)ただ、の方法だと、マウスが片側(例えば右から下)を抜け、条件を満たさなくなってムービークリップが停止し、反対側(左)で条件を満たしたときに、瞬間移動してくる。
Eは角度を上半分に制限しつつ、条件を満たさない下半分にマウスがあるときも、計算式の値に-1をかけて、角度を反転してマウスを追随し続けるようにした。


(c) 2007-2009 anchoco @ web