gihyo.jp » DEVELOPER STAGE » 連載 » ActionScript 3.0で始めるオブジェクト指向スクリプティング » 第23回 クラスのデザインとループ処理

ActionScript 3.0で始めるオブジェクト指向スクリプティング

第23回 クラスのデザインとループ処理

前回の第22回「MovieClipシンボルにクラスを定義する」では,MovieClipシンボルに設定するクラスEllipticMotionを定義した(図1)。シンボルに設定したクラスは,シンボルのグラフィックやタイムラインなどのアセットに関連づけられる。その結果,インスタンスは,シンボルのアセットをデータとしてもつことになる。

図1 [シンボルプロパティ]のダイアログボックスに[クラス]を設定

図1 [シンボルプロパティ]のダイアログボックスに[クラス]を設定

EllipticMotionインスタンスをタイムラインに配置すると,シンボルのグラフィックが表示され,楕円を描いて3D風にアニメーションした(図2)。もっとも,前回のEllipticMotionクラスの処理内容は,以前の第17回「3D風に回転するアニメーション」で書いたフレームアクションに,クラスとして最小限の手を加えたものに過ぎない。

図2 シンボルのグラフィックが3D風に回転のアニメーションをする

図2 シンボルのグラフィックが3D風に回転のアニメーションをする

今回は,まずEllipticMotionクラスの処理について,今後の拡張まで考えてデザインを整理してみたい。その後,タイムラインに複数のインスタンスを配置するといった,繰返し処理のテクニックをご紹介しよう。

クラスのデザインを考える

クラスEllipticMotionのスクリプトには,大きく3つの修正を加える。第1に,インスタンスプロパティの整理だ。第2は,それらのプロパティの修正にメソッドを対応させ,さらにメソッド間の呼出しの構成についても手を入れたい。第3に,get/setアクセサメソッドをひと組追加する。

それでは,第1のプロパティの整理からいこう。まず,前回フレームアクションからは,つぎのようにコンストラクタメソッドの引数として,楕円軌道の中心座標やxy半径をPointインスタンスで渡した。したがって,EllipticMotionクラスでもこれらの値を数値でなく,Pointインスタンスのままプロパティとしてもつようにする。

var myCenter:Point = new Point(stage.stageWidth / 2, stage.stageHeight / 2);
var myRadius:Point = new Point(100, 50);
var _mc:EllipticMotion;
// コンストラクタの呼出し
_mc = new EllipticMotion(0, myCenter, myRadius);   // 中心座標とxy半径はPointインスタンスで渡す

つぎに,EllipticMotionクラスには角度のプロパティとして,度数とラジアンが併存していた。しかし,一方の値がわかれば,他方は変換比率から直ちに導ける。そのため,プロパティは度数のみとし,ラジアンは削除する(※1)。最後に,プロパティとして宣言してあった度数からラジアンへの変換比率は,constキーワードを使って「定数」とした。この「定数」の意義については,つぎのスクリプトを見てから説明しよう。

public class EllipticMotion extends MovieClip {
  private var degree:Number = 0;
  // private var radian:Number = 0;   // 削除
  private var speed:Number = 5;
  // private var degreeToRadian:Number = Math.PI / 180;
  private const DEGREE_TO_RADIAN:Number = Math.PI / 180;   // 定数として宣言
  // private var centerX:Number;
  // private var centerY:Number;
  private var center:Point;   // Pointクラスで宣言
  // private var radiusX:Number;
  // private var radiusY:Number;
  private var radius:Point;   // Pointクラスで宣言
  // private var cos:Number = Math.cos(radian);
  private var cos:Number = Math.cos(degree * DEGREE_TO_RADIAN);   // 度数をラジアンに変換
  // private var sin:Number = Math.sin(radian);
  private var sin:Number = Math.sin(degree * DEGREE_TO_RADIAN);   // 度数をラジアンに変換

さて,定数はvarでなくconstキーワードで宣言する。それ以外は,ひとつの点を除いて,プロパティと異なることろはない。その違いというのは,「定数」という名前のとおり,設定した値が変更できないことだ。円周率πはギリシャの昔から変わらない。したがって,その値を使った比率は変えないし,変えられない方がよい。そのような場合に,定数を宣言する。ちなみに,プログラミングでは,定数名はすべて大文字にする習慣がある(※2)。

const 定数名:型指定   // 定数名はすべて大文字が習慣

EllipticMotionクラスのデザインについて,変更点の第2はメソッドだった。第1のプロパティの整理にともなう修正を,先に済ませておこう。とくに難しいものはない。楕円軌道の中心座標とxy半径をPoint型のプロパティに変えたことと,ラジアン値を定数から計算することに対応させた。

public function EllipticMotion(nDegree:Number, myCenter:Point, myRadius:Point) {
  degree = nDegree;
  // centerX = myCenter.x;
  // centerY = myCenter.y;
  center = myCenter;   // プロパティにPointインスタンスを設定
  // radiusX = myRadius.x;
  // radiusY = myRadius.y;
  radius = myRadius;   // プロパティにPointインスタンスを設定
  addEventListener(Event.ENTER_FRAME, moveX);
  addEventListener(Event.ENTER_FRAME, moveY);
  addEventListener(Event.ENTER_FRAME, scale);
  addEventListener(Event.ENTER_FRAME, blur);
  addEventListener(Event.ENTER_FRAME, update);
}
private function moveX(eventObject:Event):void {
  // x = centerX + cos * radiusX;
  x = center.x + cos * radius.x;   // Pointインスタンスから値を取得
}
private function moveY(eventObject:Event):void {
  // y = centerY + sin * radiusY;
  y = center.y + sin * radius.y;   // Pointインスタンスから値を取得
}
private function update(eventObject:Event):void {
  degree+=speed;
  degree = (degree%360+360)%360;
  // radian=degree*degreeToRadian;
  var radian:Number=degree*DEGREE_TO_RADIAN;   // ラジアン値を定数で計算
  cos=Math.cos(radian);
  sin=Math.sin(radian);
}
※1)
処理としておもに使うのは,三角関数を計算するラジアン値だ。そのため,ラジアンのプロパティを残す方が,効率としてはよいかもしれない。ただ,複数のインスタンスを等間隔で配置するときなどは度数の方が扱いやすいので,ラジアンをなくすことにした。
※2)
これまで見てきたように,ActionScript 3.0の定義済みのクラスでも,Math.PIやイベント定数などはすべて大文字で定義されている。

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書

  • ActionScript 3.0プロフェッショナルガイド

    ActionScript 3.0プロフェッショナルガイド(毎日コミュニケーションズ)

  • ActionScript 3.0辞典 [FlashPlayer 10/9対応]

    ActionScript 3.0辞典 [FlashPlayer 10/9対応](翔泳社)

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

Ruby Freaks Lounge

Rubyに関わる,執筆者自身の旬なテーマを扱った,リレー形式の連載です。

これでできる! クロスブラウザJavaScript入門

JavaScriptはウェブ制作において避けては通れない重要な言語ですが,JavaScriptに苦手意識を持たれている方は少なくないようです。 その最大の原因がクロスブラウザ対応という課題であり,本連載ではクロスブラウザ対応のテクニックを詳細に解説します。

ビジネスで成功するためのシステム運用管理のポイント

システムの多様化,技術進歩に伴い,ITシステムの運用管理の必要性が年々高まっています。本連載では,システムの運用管理とは何かについて,現場のニーズと具体的な指針を押さえながらを解説します。

2010年版SEO体得講座

本連載では,いまや企業サイトの戦略の1つとして欠かすことのできないSEOについて,最新トレンドからすぐに使えるTipsまでを紹介します。

小型Linuxサーバの最高峰 OpenBlockS 600活用指南

搭載メモリの増加,CPUクロックの向上など,あらゆる面が強化された期待の新モデルOpenBlockS 600。この記事ではOpenBlockS 600の紹介から,活用するためのさまざまなノウハウを紹介していきます。

はじめMath! Javaでコンピュータ数学

プログラミング言語入門者向けに,知っていると役立つ数学的トピックスを紹介します。簡単な演習問題と解説で,即活用できる知識を目指します。

教科書には載っていない ネットワークエンジニアの実践技術

ネットワークエンジニア,インフラエンジニアのトラブル対応には,時には「教科書通りにいかない」テクニックが必要となります。資格試験では得られないこうした実践的な技術について,実例を元に紹介します。

Googleケータイ,世に現る

2008年9月,Googleが中心となって開発されている「Android」を採用した携帯電話「T-Mobile G1」が発表されました。本連載ではT-Mobile G1を中心にGoogleケータイに迫ります。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス

最近のコメント