前回の第23回
今回の課題は,
マウスポインタの位置に応じてインスタンスの回転スビードを変える
まずは,
今のところ,
public class EllipticMotion extends MovieClip {
// ...[中略]...
public function EllipticMotion(nDegree:Number, myCenter:Point, myRadius:Point) {
degree = nDegree;
center = myCenter;
radius = myRadius;
addEventListener(Event.ENTER_FRAME, rotate); // 後に削除
setRotation();
}
しかし,
そうだとすれば,
Flashムービー
var instances_array:Array = new Array(); // 追加: 配列を変数として宣言・初期化
for (var i:int = 0; i < nCount; i++) {
var _mc:EllipticMotion = new EllipticMotion(nDegree * i,myCenter,myRadius);
addChild(_mc);
instances_array.push(_mc); // 追加: 配列にインスタンスを加える
}
これで,
var deceleration:Number = 0.1;
// ...[中略]...
addEventListener(Event.ENTER_FRAME, rotate);
function rotate(EventObject:Event):void { // 追加: リスナー関数
var nSpeed:Number = (stage.mouseX - myCenter.x)*deceleration;
var nLength:uint = instances_array.length;
for (var i:int = 0; i<nLength; i++) {
var _mc:EllipticMotion = instances_array[i]; // インスタンスの取出し
_mc.rotate(nSpeed); // インスタンスのrotate()メソッドを呼出す
}
}
rotate()関数本体では,
以上ふたつの修正を加えたフレームアクションが,
スクリプト1 マウスポインタの中央からの水平位置に応じてインスタンスの回転スピードを変える
// タイムライン: メイン
var myCenter:Point = new Point(stage.stageWidth / 2, stage.stageHeight / 2);
var myRadius:Point = new Point(100, 50);
var nCount:uint = 6;
var nDegree:Number = 360 / nCount;
var instances_array:Array = new Array();
var deceleration:Number = 0.1;
for (var i:int = 0; i < nCount; i++) {
var _mc:EllipticMotion = new EllipticMotion(nDegree * i, myCenter, myRadius);
addChild(_mc);
instances_array.push(_mc);
}
addEventListener(Event.ENTER_FRAME, rotate);
function rotate(EventObject:Event):void {
var nSpeed:Number = (stage.mouseX - myCenter.x) * deceleration;
var nLength:uint = instances_array.length;
for (var i:int = 0; i < nLength; i++) {
var _mc:EllipticMotion = instances_array[i];
_mc.rotate(nSpeed);
}
}
- ※1
- マウスポインタのステージ中央からの水平位置に応じてアニメーションのスピードを変える処理については,
第12回 「マウスポインタとスクロールの連動」 を参照してほしい。