Flash:ActionScript3.0で、動物ルーレットをTweenerで回してストップさせるボタンを追加する2(2/3)
この記事は3部作になっています。
前回より、動物ルーレットを回転スタート・ストップと、指定した絵柄でストップさせるボタンを追加してみるテストを行っています。
前回、コードを記述するために必要なシンボルを作成し、ステージ上にレイアウトするところまで終えました。
前回記事:「Flash:ActionScript3.0で、動物ルーレットをTweenerで回してストップさせるボタンを追加する1(1/3)」
今回はその続きで、ActionScript3.0を使って、動物ルーレットを仕上げていきます。
準備
前回からの続きの作業になります。
前回記事:「Flash:ActionScript3.0で、動物ルーレットをTweenerで回してストップさせるボタンを追加する1」
以前、ひたすら回り続けるルーレットを作成したときは、タイムラインのフレームの中に簡単なfunctionコードを記述することで足りていましたが、今回はそうはいきません。
ルーレットを回転・停止させる時、どの様なアクションが必要になるのか考えてみました。
- 1)スタートボタンを押す
- 2)スタートボタンをストップボタンに変える
- 3)ルーレットを回転させる
- 4)動物が領域外に出たら、逆のハジッコの末尾に、すき間をいれて移動させる
- 5)ストップボタン又はブタボタンを押す
- 6)停止絵柄を確定する(指定があれば従う)
- 7)それぞれの絵柄の停止位置を確定する
- 9)絵柄がそれぞれ停止開始位置に到達したら、ルーレット回転ループから抜ける
- 10)それぞれの絵柄を停止位置で止める
- 11)ストップボタンをスタートボタンに変える
以前の様に簡単にはいきそうにありません。
今回はClassを作成してルーレットの回転・停止を実現できるようにしたいと思います。
回転用のクラスファイルを作成・保存する
以前の延々まわる動物ルーレットでは、function kaiten() で実現していたものを、今回はClassで実現します。
Classは、別のasファイルとして保存して使います。
Flashで上メニューより、[ファイル]→[新規]と進み、「ActionScript3.0クラス」を選択してください。クラス名を「kaitenClass」として「OK」してください。
そのまま、とりあえず保存します。
前回より作成しているflaファイルと同じフォルダに、「kaitenClass.as」という名前で保存します。
flaファイルは特に設定をしなくても、同じフォルダ階層にあるasファイルを、「デフォルトライブラリ」として追加してくれる様です。
kaitenClassについては、記述が完成したものを最後に紹介します。
とりあえず、少しずつ紹介していきます。
まず、package{ の後に、次の記述をして、各ライブラリを使用する準備をします。
package { //イベントリスナーを使用する準備 import flash.events.Event; //ムービークリップを使用する準備 import flash.display.MovieClip; //Tweenerを使用する準備 import caurina.transitions.Tweener;
その後、Classの定義がはじまります。
各プロパティ(メンバ変数)を定義しておいて、体制を整えます。
//クラス定義開始 public class kaitenClass { //回転方向の指定。「l」は左回り、「r」は右まわり private var direc: String = "l"; //初期値は「l」 //対象のルーレットの列のムービークリップインスタンス(コンストラクタで設定) private var line_mc: MovieClip; //「line_mc」に含まれる動物インスタンス群(コンストラクタで設定) private var doubutu_array: Array = new Array(); //回転中フラグ(ルーレット回転中はtrue) private var rotating: Boolean = false; //当たり絵柄のインスタンス名 private var atari_name: String = ""; //停止基準位置 private var stop_x: int; //回転の設定 public var idou_px: int = 10; //移動する量 public var sukima_px: int = 0; //動物インスタンス間のすき間px //public var idou_time:int = 0.5; //移動にかける時間(秒) public var stop_time: int = 0.2; //停止にかける時間(秒) //停止フラグ private var kaiten_remove: Boolean = false;
いずれも、この後のアクションで計算するために必要な設定値です。
基本的に「private」で定義して、回転の制御に関する部分のみ「public」として外部からの変更を可能になるようにしました。
この後、Class名と同じ名前のfunctionで、コンストラクタを定義します。
コンストラクタ
コンストラクタで列のインスタンス(line1)を受け取って、各プロパティの値を設定します。
//コンストラクタ開始 ==================== public function kaitenClass(arg_line_mc: MovieClip) { // constructor code //ルーレットの列のムービクリップインスタンスを受け取って、プロパティに設定 this.line_mc = arg_line_mc; var i: uint = 0; if (this.line_mc.numChildren > 1) { //動物インスタンス間のすき間取得 var tmp_mc: MovieClip; var doubutu_width: int for (i = 0; i < this.line_mc.numChildren; i++) { doubutu_width += line_mc.getChildAt(i).width; } this.sukima_px = this.line_mc.width - doubutu_width; if (this.line_mc.numChildren > 2) { this.sukima_px = this.sukima_px / (this.line_mc.numChildren - 2); } } else { this.sukima_px = 0; } //受け取ったムービークリップに含まれる動物インスタンスをプロパティに設定 this.doubutu_array = new Array(); if (this.line_mc.numChildren > 0) { for (i = 0; i < this.line_mc.numChildren; i++) { if (this.line_mc.getChildAt(i) is MovieClip) { this.doubutu_array.push(this.line_mc.getChildAt(i)); } } } //停止基準位置取得(line_mcの中央) this.stop_x = this.line_mc.width / 2; //停止基準位置補正:動物インスタンスの幅(width)半分マイナス this.stop_x -= this.doubutu_array[0].width / 2; }
「arg_line_mc」には、列インスタンス(line1)を渡します。
動物インスタンス間のすき間を自動で計算している点と、doubutu_arrayに動物インスタンスの名前だけでなく、インスタンスをそのまま入れている点が以前と異なります。
列インスタンス(line_mc = line1)の幅(Width)から、動物インスタンスの幅の合計を引いて、その値を動物インスタンスの数から2引いた数(左右のはじっこの動物にはすき間がないので)で割って算出しています。
また、停止の基準とするX軸の値は、列インスタンス(line1)の中心から、動物インスタンス半個分引いた数に設定しています。
ここで注意が必要なのは、列インスタンス(line1)のX軸の値(line_mc.x)はステージからはみ出ているためマイナスの値になりますが、列インスタンス(line1)の一番左に配置されている動物インスタンスのX軸の値(line_mc.getChildAt(0).x)は「0」になっています。
つまり、列インスタンスの中の各インスタンスは、ステージではなく、その列インスタンスの左上が基準となって座標が設定されているの要注意です。
そのため、停止基準位置もステージの中央(stage.stageWidth / 2)ではなく、列インスタンスの中央(line_mc.width / 2)としなければ、意図している位置(中央)を指定できません。
さらに、動物インスタンスの左ハジがX座標の値となりますので、動物インスタンス半個分左にずらしています。
読取専用プロパティ?
プロパティの設定で、多くの項目をprivateで定義して外部から変更できないようにしましたが、このままでは外部から値の設定項目を取得することも許されません。
回転中フラグ(rotating)と現在の回転方向(direc)は、外部から設定値を知りたいので、読み取り専用に「public Function get」でメソッドを定義しておきます。
//読み取り専用プロパティ ==================== public function get get_rotating(): Boolean { return this.rotating; } public function get get_direc(): String { return this.direc; }
ルーレット回転のイベントリスナー追加:kaitenStart()
kaitenStart()を定義します。
- 当たり絵柄のインスタンス名(atari_name)をクリア
- 回転停止フラグ(kaiten_remove)をクリア
- 回転する方向(arg_direc)を受け取って決定し、プロパティ「direc」に設定。(rは右回転、それ以外は左回転)
- 後で定義する右(rStart)又は左(lStart)回転実行メソッドを、列インスタンス(line_mc)のイベントリスナーにENTER_FRAMEとして追加
- 回転中フラグ(rotating)を立てる
なお、このメソッドはClass Package外からもたたけるように「pubulic function」として定義してください。
//ルーレット開始 ==================== public function kaitenStart(arg_direc: String = "l"): void { //現在ルーレットが回転中でなければ実行 if (!this.rotating) { //当たり絵柄と回転停止フラグをクリア this.atari_name = ""; this.kaiten_remove = false; //受け取った回転方向の指示をプロパティに設定 this.direc = arg_direc; //回転方向の指示(direc)が「r」なら、右回転を実行(イベントリスナー追加) if (this.direc == "r") { this.line_mc.addEventListener(Event.ENTER_FRAME, this.rStart); //それ以外なら、左回転を実行(イベントリスナー追加) } else { this.line_mc.addEventListener(Event.ENTER_FRAME, this.lStart); } //ルーレット回転中フラグを立てる this.rotating = true; } }
ルーレット回転のメソッド
実際に動物インスタンスを移動させる「rStart」「lStart」のメソッドを定義します。
このメソッドはkaitenStart()でイベントリスナーにEvent.ENTER_FLAMEで登録されるので、イベントリスナーが削除されるまで延々と実行されるメソッドです。
- すべての動物インスタンスのX軸の値を、idou_pxで定義した値分変更(移動)
- 基準値(max_r、max_l)を超える動物(表示領域からはみ出た動物)は、すき間をつけて逆のはじっこに移動
さらに、プロパティの回転停止フラグをチェックして、停止のトリガーもしかけます。
- 回転停止フラグ(kaiten_remove)が立っている場合
- 停止指示を受けた当たり絵柄と、現在のフレームの当たり絵柄が一致する場合
上記2件の条件を満たしていたら
- kaitenStartで登録された回転のイベントリスナー(自身がリスナー関数)を削除
- 回転停止フラグ(kaiten_remove)をおろす
- 停止アニメーション開始(rStop()又はlStop())
と、回転停止フェーズに移行します。
//右回り開始 ==================== private function rStart(): void { var tmp_mc: MovieClip; //line_mcの右はじを基準にする var max_r: int = this.line_mc.width; for each(tmp_mc in this.doubutu_array) { //動物インスタンスを移動 tmp_mc.x += this.idou_px; //基準値を超えたら左の最後にすき間をつけて移動 if (tmp_mc.x > max_r) { //動物インスタンスをxの値が小さい順にソート this.doubutu_array.sortOn("x", Array.NUMERIC); //先頭の動物インスタンスを左はじに移動 tmp_mc.x = this.doubutu_array[0].x - this.sukima_px - tmp_mc.width; } } //停止チェック if (this.kaiten_remove && this.getTargetName() == this.atari_name) { // 回転のイベントリスナー停止 this.line_mc.removeEventListener(Event.ENTER_FRAME, arguments.callee); //停止フラグをおろす this.kaiten_remove = false; //停止アニメーション開始 this.rStop(); } } //左回り開始 ==================== private function lStart(): void { var tmp_mc: MovieClip; //0を領域の基準値にする(line_mc.xはステージ外なのでマイナス値) var max_l: int = 0; for each(tmp_mc in this.doubutu_array) { //動物インスタンスを移動 tmp_mc.x -= this.idou_px; //基準値を超えたら右の最後にすき間をつけて移動 if (tmp_mc.x < max_l) { //動物インスタンスをxの値が大きい順にソート(小さい順にしてから逆にする) this.doubutu_array.sortOn("x", Array.NUMERIC); this.doubutu_array.reverse(); //先頭の動物インスタンスを右はじに移動 tmp_mc.x = this.doubutu_array[0].x + this.doubutu_array[0].width + this.sukima_px; } } //停止チェック(停止処理実行) if (this.kaiten_remove && this.getTargetName() == this.atari_name) { // 回転のイベントリスナー停止 this.line_mc.removeEventListener(Event.ENTER_FRAME, arguments.callee); //停止フラグをおろす this.kaiten_remove = false; //停止アニメーション開始 this.lStop(); } }
この回転での当たり絵柄はプロパティ「atari_name」に動物インスタンス名で定義されています(atari_nameは、後述する「kaitenStop()」で設定されます)。
当たり絵柄判定(getTargetName)については後で定義しますが、現在のフレームでの当たりの動物インスタンスの名前を返す関数です。
つまり、フレームの当たり絵柄がatari_nameと一致するまでは条件を満たすことはないため、回転停止フェーズには進みません。
ルーレット停止のメソッド
このメソッドも、外部からたたけるように「public function」として定義してください。
- 「doubutu_namae」で、停止させる動物インスタンス名を受け取る
- ルーレット回転中にのみ機能する(rotatingフラグチェック)
- stopDoubutuNamae()で、停止させる絵柄を確定(atari_nameに設定)する
- 回転停止フラグ(kaiten_remove)を立てます
- 当たり絵柄のインスタンス名を返す
ここで立てた回転停止フラグ(kaiten_remove)は、イベントリスナーEvent.ENTER_FRAMEに登録されたstartKaiten()にチェックされているので、回転停止フラグが立ったらstartKaiten()によってルーレット停止フェーズに移行していきます。
//回転停止(this.line_mcにイベント登録されたrStart又はlStartがひろうプロパティ値を設定) ==================== public function kaitenStop(doubutu_namae: String = ""): String { if (this.rotating) { //停止させる絵柄を確定(インスタンス名を取得) this.atari_name = this.stopDoubutuName(doubutu_namae); //回転停止フラグを立てる this.kaiten_remove = true; } //当たり絵柄のインスタンス名を返す return this.atari_name; }
stopDoubutuName(doubutu_namae)は、空文字または存在しないインスタンス名を受け取った場合、getTargetName()で現フレームでの当たり絵柄のインスタンス名を取得して返します。
//停止する動物インスタンス名を確定 =================== //停止させたい絵柄がある場合はdoubutu_namaeで渡す public function stopDoubutuName(doubutu_namae: String = ""): String { var stop_doubutu_namae: String = ""; if (this.rotating) { //その名前の動物インスタンスがあるかチェック if (doubutu_namae.length) { var tmp_mc: MovieClip; for each(tmp_mc in this.doubutu_array) { if (tmp_mc.name == doubutu_namae) { stop_doubutu_namae = doubutu_namae; break; } } } if (stop_doubutu_namae.length == 0) { //現時点での当たり絵柄のインスタンス名を取得 stop_doubutu_namae = this.getTargetName(); } } return stop_doubutu_namae; }
現時点での当たり絵柄を確定するメソッド
停止位置に一番近くにある動物インスタンスの名前を返す「getTargetName()」を定義します。
イベントリスナーのEvent.ENTER_FRAMEで登録された関数から実行されるメソッドなので、「現フレームでの当たり絵柄を返す」関数という事になります。
特記することはありませんが、コンストラクタで設定した停止位置のプロパティ「stop_x」の値が重要になってきます。
- 右回転の時は、停止位置(stop_x)より左にある、X軸が一番近い動物インスタンス
- 左回転の時は、停止位置(stop_x)より右にある、X軸が一番近い動物インスタンス
//現時点で当たり判定される動物インスタンスの名前を返す ==================== private function getTargetName(): String { //doubutu_arrayをx座標の値が小さい順にソート this.doubutu_array.sortOn("x", Array.NUMERIC); var tmp_mc: MovieClip; var target_name: String = ""; if (this.direc == "r") { //右回転の場合 this.doubutu_array.reverse(); for each(tmp_mc in this.doubutu_array) { if (tmp_mc.x < this.stop_x) { //停止位置より小さいx座標を持つ、最初に見つかった動物インスタンスの名前 target_name = tmp_mc.name; break; } } } else { //左回転の場合 for each(tmp_mc in this.doubutu_array) { if (tmp_mc.x > this.stop_x) { //停止位置より大きいx座標を持つ、最初に見つかった動物インスタンスが指定絵柄の場合 target_name = tmp_mc.name; break; } } } return target_name; }
絵柄停止アニメーションのメソッド
当たり絵柄(停止絵柄)が確定し、現在のフレームの当たり絵柄と一致したら、絵柄を停止させます。
rStop()、lStop()は、どちらもcommonStop()を実行します。
commonStop()では、
- まず当たり絵柄と停止絵柄までの移動距離を算出する(tmp_idou_px)
その後、取得した移動距離の値をもとに、すべての動物インスタンスに対して、それぞれ次の処理を行います。
- 右回転の場合は動物のX軸から移動距離を引いて(左回転の場合は足す)停止位置を確定
- 停止位置に向かってTweenerアニメーションで動かす
当たり絵柄の場合は、Tweenerのアニメーションの種類(transition)と停止にかける時間(time)を変更しています。
さらに、当たり絵柄の場合はonCompleteで、アニメーションが完了するのを待って回転中フラグ(rotating)をおろします。
//回転ストップ ==================== private function rStop(): void { this.commonStop(); } private function lStop(): void { this.commonStop(); } //回転ストップ(共用) ==================== private function commonStop(): void { var tmp_mc: MovieClip; var tmp_idou_px: int = 0; //当たり絵柄と停止位置までの停止距離 for each(tmp_mc in this.doubutu_array) { if (tmp_mc.name == this.atari_name) { if (this.direc == "r") { //右回転の場合 tmp_idou_px = this.stop_x - tmp_mc.x; } else { //左回転の場合 tmp_idou_px = tmp_mc.x - this.stop_x; } break; } } for each(tmp_mc in this.doubutu_array) { // for each(tmp_mc in this.doubutu_array) { var tmp_stop_x: int = 0; if (this.direc == "r") { //右回転の場合 tmp_stop_x = tmp_mc.x + tmp_idou_px; } else { //左回転の場合 tmp_stop_x = tmp_mc.x - tmp_idou_px; } var tmp_stop_time: int = this.stop_time + 1; var tmp_transition: String = "linear"; //当たり絵柄以外のストップ処理 if (tmp_mc.name != this.atari_name) { Tweener.addTween(tmp_mc, { x: tmp_stop_x, time: tmp_stop_time, transition: tmp_transition }); //当たり絵柄のストップ処理 } else { tmp_stop_time += 1; tmp_stop_x = this.stop_x; tmp_transition = "easeOutBounce"; Tweener.addTween(tmp_mc, { x: tmp_stop_x, time: tmp_stop_time, transition: tmp_transition, //停止後に回転中フラグをおろす onComplete: function () { rotating = false; } }); } } }
Tweenerについては、「Flash:ActionScript3.0でTweenerのテスト」を参照してください。
kaitenClass.asのコード
kaitenClassのコードは以上です。
これまでのコードを続けて書くと、次の様になります。
package { //イベントリスナーを使用する準備 import flash.events.Event; //ムービークリップを使用する準備 import flash.display.*; //Tweenerを使用する準備 import caurina.transitions.Tweener; //クラス定義開始 ==================== public class kaitenClass { //回転方向の指定。「l」は左回り、「r」は右まわり private var direc: String = "l"; //初期値は「l」 //対象のルーレットの列のムービークリップインスタンス(コンストラクタで設定) private var line_mc: MovieClip; //「line_mc」に含まれる動物インスタンス群(コンストラクタで設定) private var doubutu_array: Array = new Array(); //回転中フラグ(ルーレット回転中はtrue) private var rotating: Boolean = false; //当たり絵柄のインスタンス名 private var atari_name: String = ""; //停止基準位置 private var stop_x: int; //回転の設定 public var idou_px: int = 10; //移動する量 public var sukima_px: int = 0; //動物インスタンス間のすき間px //public var idou_time:int = 0.5; //移動にかける時間(秒) public var stop_time: int = 0.2; //停止にかける時間(秒) //停止フラグ private var kaiten_remove: Boolean = false; //コンストラクタ開始 ==================== public function kaitenClass(arg_line_mc: MovieClip) { // constructor code //ルーレットの列のムービクリップインスタンスを受け取って、プロパティに設定 this.line_mc = arg_line_mc; var i: uint = 0; if (this.line_mc.numChildren > 1) { //動物インスタンス間のすき間取得 var tmp_mc: MovieClip; var doubutu_width: int for (i = 0; i < this.line_mc.numChildren; i++) { doubutu_width += line_mc.getChildAt(i).width; } this.sukima_px = this.line_mc.width - doubutu_width; if (this.line_mc.numChildren > 2) { this.sukima_px = this.sukima_px / (this.line_mc.numChildren - 2); } } else { this.sukima_px = 0; } //受け取ったムービークリップに含まれる動物インスタンスをプロパティに設定 this.doubutu_array = new Array(); if (this.line_mc.numChildren > 0) { for (i = 0; i < this.line_mc.numChildren; i++) { if (this.line_mc.getChildAt(i) is MovieClip) { this.doubutu_array.push(this.line_mc.getChildAt(i)); } } } //停止基準位置取得(line_mcの中央) this.stop_x = this.line_mc.width / 2; //停止基準位置補正:動物インスタンスの幅(width)半分マイナス this.stop_x -= this.doubutu_array[0].width / 2; } //読み取り専用プロパティ ==================== public function get get_rotating(): Boolean { return this.rotating; } public function get get_direc(): String { return this.direc; } //ルーレット開始 ==================== public function kaitenStart(arg_direc: String = "l"): void { //現在ルーレットが回転中でなければ実行 if (!this.rotating) { //当たり絵柄と回転停止フラグをクリア this.atari_name = ""; this.kaiten_remove = false; //受け取った回転方向の指示をプロパティに設定 this.direc = arg_direc; //回転方向の指示(direc)が「r」なら、右回転を実行(イベントリスナー追加) if (this.direc == "r") { this.line_mc.addEventListener(Event.ENTER_FRAME, this.rStart); //それ以外なら、左回転を実行(イベントリスナー追加) } else { this.line_mc.addEventListener(Event.ENTER_FRAME, this.lStart); } //ルーレット回転中フラグを立てる this.rotating = true; } } //右回り開始 ==================== private function rStart(): void { var tmp_mc: MovieClip; //line_mcの右はじを基準にする var max_r: int = this.line_mc.width; for each(tmp_mc in this.doubutu_array) { //動物インスタンスを移動 tmp_mc.x += this.idou_px; //基準値を超えたら左の最後にすき間をつけて移動 if (tmp_mc.x > max_r) { //動物インスタンスをxの値が小さい順にソート this.doubutu_array.sortOn("x", Array.NUMERIC); //先頭の動物インスタンスを左はじに移動 tmp_mc.x = this.doubutu_array[0].x - this.sukima_px - tmp_mc.width; } } //停止チェック if (this.kaiten_remove && this.getTargetName() == this.atari_name) { // 回転のイベントリスナー停止 this.line_mc.removeEventListener(Event.ENTER_FRAME, arguments.callee); //停止フラグをおろす this.kaiten_remove = false; //停止アニメーション開始 this.rStop(); } } //左回り開始 ==================== private function lStart(): void { var tmp_mc: MovieClip; //0を領域の基準値にする(line_mc.xはステージ外なのでマイナス値) var max_l: int = 0; for each(tmp_mc in this.doubutu_array) { //動物インスタンスを移動 tmp_mc.x -= this.idou_px; //基準値を超えたら右の最後にすき間をつけて移動 if (tmp_mc.x < max_l) { //動物インスタンスをxの値が大きい順にソート(小さい順にしてから逆にする) this.doubutu_array.sortOn("x", Array.NUMERIC); this.doubutu_array.reverse(); //先頭の動物インスタンスを右はじに移動 tmp_mc.x = this.doubutu_array[0].x + this.doubutu_array[0].width + this.sukima_px; } } //停止チェック(停止処理実行) if (this.kaiten_remove && this.getTargetName() == this.atari_name) { // 回転のイベントリスナー停止 this.line_mc.removeEventListener(Event.ENTER_FRAME, arguments.callee); //停止フラグをおろす this.kaiten_remove = false; //停止アニメーション開始 this.lStop(); } } //回転停止(this.line_mcにイベント登録されたrStart又はlStartがひろうプロパティ値を設定) ==================== public function kaitenStop(doubutu_namae: String = ""): String { if (this.rotating) { //停止させる絵柄を確定(インスタンス名を取得) this.atari_name = this.stopDoubutuName(doubutu_namae); //回転停止フラグを立てる() this.kaiten_remove = true; } //当たり絵柄のインスタンス名を返す return this.atari_name; } //停止する動物インスタンス名を確定 =================== //停止させたい絵柄がある場合はdoubutu_namaeで渡す public function stopDoubutuName(doubutu_namae: String = ""): String { var stop_doubutu_namae: String = ""; if (this.rotating) { //その名前の動物インスタンスがあるかチェック if (doubutu_namae.length) { var tmp_mc: MovieClip; for each(tmp_mc in this.doubutu_array) { if (tmp_mc.name == doubutu_namae) { stop_doubutu_namae = doubutu_namae; break; } } } if (stop_doubutu_namae.length == 0) { //現時点での当たり絵柄のインスタンス名を取得 stop_doubutu_namae = this.getTargetName(); } } return stop_doubutu_namae; } //現時点で当たり判定される動物インスタンスの名前を返す ==================== private function getTargetName(): String { //doubutu_arrayをx座標の値が小さい順にソート this.doubutu_array.sortOn("x", Array.NUMERIC); var tmp_mc: MovieClip; var target_name: String = ""; if (this.direc == "r") { //右回転の場合 this.doubutu_array.reverse(); for each(tmp_mc in this.doubutu_array) { if (tmp_mc.x < this.stop_x) { //停止位置より小さいx座標を持つ、最初に見つかった動物インスタンスの名前 target_name = tmp_mc.name; break; } } } else { //左回転の場合 for each(tmp_mc in this.doubutu_array) { if (tmp_mc.x > this.stop_x) { //停止位置より大きいx座標を持つ、最初に見つかった動物インスタンスが指定絵柄の場合 target_name = tmp_mc.name; break; } } } return target_name; } //回転ストップ ==================== private function rStop(): void { this.commonStop(); } private function lStop(): void { this.commonStop(); } //回転ストップ(共用) ==================== private function commonStop(): void { var tmp_mc: MovieClip; var tmp_idou_px: int = 0; //当たり絵柄と停止位置までの停止距離 for each(tmp_mc in this.doubutu_array) { if (tmp_mc.name == this.atari_name) { if (this.direc == "r") { //右回転の場合 tmp_idou_px = this.stop_x - tmp_mc.x; } else { //左回転の場合 tmp_idou_px = tmp_mc.x - this.stop_x; } break; } } for each(tmp_mc in this.doubutu_array) { // for each(tmp_mc in this.doubutu_array) { var tmp_stop_x: int = 0; if (this.direc == "r") { //右回転の場合 tmp_stop_x = tmp_mc.x + tmp_idou_px; } else { //左回転の場合 tmp_stop_x = tmp_mc.x - tmp_idou_px; } var tmp_stop_time: int = this.stop_time + 1; var tmp_transition: String = "linear"; //当たり絵柄以外のストップ処理 if (tmp_mc.name != this.atari_name) { Tweener.addTween(tmp_mc, { x: tmp_stop_x, time: tmp_stop_time, transition: tmp_transition }); //当たり絵柄のストップ処理 } else { tmp_stop_time += 1; tmp_stop_x = this.stop_x; tmp_transition = "easeOutBounce"; Tweener.addTween(tmp_mc, { x: tmp_stop_x, time: tmp_stop_time, transition: tmp_transition, //停止後に回転中フラグをおろす onComplete: function () { rotating = false; } }); } } } } }
次回は最後の仕上げです。
今回作成した、このkaitenClassを使って、動物ルーレットのスタート・ストップボタンを機能させるスクリプトを書いて完成です。
この記事は3部作になっています。
