アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » ActionScript 3.0で始めるオブジェクト指向スクリプティング » 第15回 配列を使ったキーコードとプロパティの扱い

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

第15回 配列を使ったキーコードとプロパティの扱い

前回の第14回「キー操作とif以外の条件判定」では,switchステートメントでキーコードを判定した。今回は,配列とも呼ばれるArrayクラスを使って,条件判定なしにキーコードの処理を行ってみよう。

配列と配列エレメントの扱い

Arrayクラスのインスタンスは「配列」とも称され,複数の値をひとつのインスタンスに納められる。いわば容れ物のような機能をもったインスタンスだ。納められた各値は,配列の要素とか「エレメント」という。配列エレメントには,0から始まる整数の整理番号がつけられて,管理される。この番号は,「インデックス」と呼ばれる。

配列インスタンスは,Dateクラスと同じく,new演算子を使って生成する。そして,値を加えるには,配列アクセス演算子[ ] でインデックスを指定し,値を代入する。たとえば,新規のArrayインスタンス(配列)のインデックス0に文字列"日曜日"を納めるには,つぎのようなスクリプトを記述すればよい。

var my_array:Array = new Array();
my_array[0] = "日曜日";
trace(my_array[0]);   // 出力: 日曜日

なお,Arrayインスタンスの生成は,以下のステートメントで行うこともできる。つまり,配列アクセス演算子[ ] を空で記述することが,空の配列を作成することになる。

var my_array:Array = [ ];

さらに,配列アクセス演算子[ ] の中にエレメントを記述すれば,エレメントの入った配列が生成される。つまり上記スクリプトの最初の2行は,つぎの1行で記述することもできる(※1)。

var my_array:Array = ["日曜日"];

上記スクリプトのとおり,Arrayインスタンスから値を取出すときにも,配列アクセス演算子[ ] でインデックスを指定する。さて,第7回「Dateクラスの日付と文字列の操作」で紹介したDate.dayプロパティは,曜日を0から6までの整数で返した。すると,以下のスクリプトは,今日の曜日を配列から取出した漢字で[出力]する(図1)。

var my_array:Array = new Array();
my_array[0] = "日曜日";
my_array[1] = "月曜日";
my_array[2] = "火曜日";
my_array[3] = "水曜日";
my_array[4] = "木曜日";
my_array[5] = "金曜日";
my_array[6] = "土曜日";
trace(my_array[new Date().day]);

図1 今日の曜日を配列から取出した漢字で[出力]

図1 今日の曜日を配列から取出した漢字で[出力]

配列インデックスは,別に連番で使わなければいけない訳ではない。たとえば,いきなりインデックス10に値を代入してもよい。だからといって,インデックス0から9までのメモリが無駄に確保されたりはしない。Arrayインスタンス内では,インデックスはいわば変数名と同じで,今の例なら10という名前のメモリに値が納められているだけだからだ。

すると,これから扱おうとしているキーコードは,整数でしかも互いに値が重複することはない。配列で管理するには,きわめて好都合といえる。まずは,左右の矢印キーの操作について,Arrayインスタンスを使って処理してみよう(スクリプト1)。処理の大きな流れは,前回のスクリプト2と基本的に同じだ。

スクリプト1 配列を使って左右矢印キーによるインスタンスの移動を処理

// MovieClip: キー操作で動かすインスタンス
var nMove:int = 1;
var nShiftMove:int = 10;
var keys_array:Array = new Array();
keys_array[Keyboard.LEFT] = -1;
keys_array[Keyboard.RIGHT] = 1;
stage.addEventListener(KeyboardEvent.KEY_DOWN, xKeyDown);
function xKeyDown(eventObject:KeyboardEvent):void {
  var nKeyCode:int = eventObject.keyCode;
  var bShiftKey:Boolean = eventObject.shiftKey;
  xMove(nKeyCode, bShiftKey);
}
function xMove(nKeyCode:int, bShiftKey:Boolean):void {
  var nPixels:Number = keys_array[nKeyCode];
  if (nPixels) {
    x += nPixels*xGetPixels(bShiftKey);
  }
}
function xGetPixels(bShiftKey:Boolean):int {
  var nPixels:int = bShiftKey ? nShiftMove : nMove;
  return nPixels;
}

上記スクリプト1は,Arrayインスタンスを作成し,左右矢印キーのキーコードをインデックスに指定して,それぞれの水平移動の向きを±1として代入した。そして,関数xMove()は,押されたキーのコードをインデックスに指定して,配列から値を取出す。左右の矢印キーが押されれば,±1の値が得られる。

押したキーが左右の矢印以外で,インデックスに指定したエレメントが存在しなければ,未定義を意味するundefinedという値が配列から返される。しかし,Number型で指定した変数(nPixels)にundefinedを代入すると,数値演算の対象にならないことを示すNaNという値に変わる。したがって,変数値が数値かNaNかを判定する必要がある。

上記スクリプト1の関数xMove()では,if条件に直接変数(nPixels)を指定している。すると,ifステートメントは,変数の値そのものを評価して,trueまたはfalseと判定する。そして,Number型の値は,NaNと0以外はtrueと評価される。よって,if条件に指定したNumber型変数(nPixels)がtrueと評価されれば,左右の矢印キーのいずれかが押されて変数に±1の値が入っていると判別できるので,インスタンスの座標をその値にしたがって移動させればよい(※2)。

これで,どのキーが押されて,どちらの方向にインスタンスを動かすべきかは,条件判定によることなく処理できた。前述のifステートメントは,単に有効なキーが押されたかどうかを確かめているだけだ。[ムービープレビュー]で試すと,左右の矢印キーでインスタンスが移動する。[shift]キーにより移動距離を変更することも可能だ。

※1)

複数のエレメントを指定する場合は,カンマ区切りでたとえばつぎのように記述する。

var my_array:Array = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"];
※2)
インスタンスの移動ピクセル数は,関数xGetPixels()の戻り値を掛合わせて算出している。つまり,配列(keys_array)に代入した±1という値は,ピクセル数という意味ではなく,単に移動方向(±の符号)を決める数値となっている。

著者プロフィール

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

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(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で取り上げてほしいネタは?

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

その他の連載

読むウェブ ~本とインタラクション

ディスプレイで読む活字とそのインタラクション(interaction:相互作用)について,最新Webを紹介しながら読み解いていく。

いま,見ておきたいウェブサイト

この連載では,国内外の最新のウェブサイトを隔週更新で取り上げ,これら最新サイトの特徴や素晴らしい部分を,さまざまな角度から解説していきます。

Windows phoneアプリケーション開発入門

Windows Marcketplace for Mobileがサービス開始され,作成したアプリケーションを個人でも世界をターゲットに公開できる環境が整ってきました。これを機にWindows phoneアプリケーションの開発をしてみませんか?

ここは知っておくべき!Windows Server 2008技術TIPS

5年ぶりのサーバOSとなったWindows Server 2008が出荷されて早2年。2009年にはR2が出荷され,再び注目を集めています。発売前から実施したトレーニングによって感じた,インフラエンジニアの方々に知っておいていただきたい機能を中心にご紹介します。

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

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

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

連載一覧

gihyo.jp

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

書籍案内

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

定期刊行物一覧

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