子から親へ選択的なデータアクセスを行うクラス構成
AS3 でゲームを作る場合に僕が良く使うクラス構成です。
[caption id=“attachment_2481” align=“alignnone” width=“605” caption=“コンテキストを用いたデータのやり取り図”][/caption]
各オブジェクトのメイン処理は各クラスの execute() で行います。
各クラスのデータのみ使用する処理の場合は特に特殊な考えは不要ですが、
例えばキャラクターオブジェクトの攻撃動作で炎オブジェクトを出現させたい場合、
自クラスのみでは解決出来ません。
そういう場合は、ctx によって公開されている親オブジェクトのメソッドに対し、
「炎を作って!」と依頼します。(↓みたいなイメージ)
ctx.createFire(x, y);
親オブジェクトは各キャラクターと炎との当たり判定処理を行い、
当たり有りと判定した場合、炎の例えば hit(this) 等呼び出します。
炎クラスの hit() 内では ctx を介して
ctx.damageCharacter(10); // キャラクターにダメージを与える
ctx.removeFire(this); // 自分自信を消す
等実行します。
まぁつまり、キャラクターと炎のデータやり取りを親に任せることで、
オブジェクト同士のやり取りが自由になるわけです。
親は子のデータやり取りを選択的に開放しているので、
コードが無秩序ということもなく、ある程度ルールに基づいた実装が可能です。
(限度はありますが。)
些細な問題かもしれませんが、上記図の通り、 孫→親のデータアクセスのためには、子に親オブジェクトを持たさなければならなそうで、 これが気持ち悪く思っています。 どうにかならないものですかねぇ。
for each で末尾データの処理をスキップする方法
ちっちゃいネタですが、今まで気づかなかったので。
僕は AS3 で、できることなら for each を使いたがるのですが、この場合インデックスの情報を持っていないので、 「~番目のデータは処理しない」 とかの処理が出来ません。 まあそれは仕方ないのですが、 「末尾のデータは処理しない」 ということは結構簡単に出来ます。
var fooList:Vector.
// データ登録 // :
var savedFoo:Foo = fooList.pop();
for each (var foo:Foo in fooList) { // なんか処理 }
fooList.push(savedFoo);
パフォーマンスについては知りません!
Flexで何か作る前に
ちょっと前から、 Air for Android でアプリを作ろうとしているのですが、適当に作り始めてみると案の定苦労しました。 根本的に勉強し直そうと Adobe のサイトを探ってると、以下のページを発見。
1週間でFlexを学ぶ | Adobe Developer Connection
最初は、ビデオとか時間を縛られるし・・・とか思っていましたが、まぁ騙されたと思って。
基本的には MXML での作り方なのですが、 MXML って大分色々楽できるように出来てます。 ということが分かる内容です。 通常の Flex/Air アプリでも Air for Android でも、作る前に見ておいて損はないです。
「個人的に目指せアルバトロスゴルフ」を発表しました
久々の新作です。
「あほげー」という 24 時間で"あほ"なゲームを作るイベントへの参加作品です。テーマは「アルバトロス」。今回は早めにネタが決まったので、普通に寝ても締切り 3 時間ぐらい前には思ってたものが出来ました。テーマで連想して適当に「ゴルフ」で調べてたら、「サンテレビ|原田伸郎のめざせパーゴルフⅢ」を見つけたので、デザイン的なコンセプトをパクマネさせて頂いた形です。
技術的な部分では以下のとおりつらつら。 あほなこと考える傍ら、以前書いた「Flex SDK で作った外部 swf の中で定義されているクラスを取り出す方法」を試してみました。 やり方としては、使う予定の素材をFlashでガリガリ描画。MovieClip シンボルとしてリンケージに名前を設定。Flash 上では特に何も配置せずにそのままパブリッシュ。ゲームの本開発ではいつも通り FlashDevelop × FlexSDK でやりました。 やってみた感覚としては、「超楽」という感じです。今まで作ってきたやり方の中では一番楽でした。特に素材管理が。最近では Bitmap オンリーでよくゲームを作るのですが、「Bitmap(キリッ」と言っても、Flash でキャラのアニメーションを作って、PNG で書き出しってやってて、ガサッとローディング・・・という感じで実装していましたが、書き出しもローディングもいちいち一手間です。素材の修正をする度に PNG 書き出ししなきゃならなかったし・・・。というか、そもそもそんな作り方はオススメされるものじゃなかったですね・・・。今回のやり方だと、Flash の MovieClip の良いところもまるまる引き継げます(アニメーションは Flash に任せられる等)し、ロードも MovieClip の複製も簡単。当たり判定領域等をアルファ 0 にして Flash で定義するかとかは今後色々考えていきたいと思います。
あほげーは、また 9 月とかに開催されるかも?とのことで、また参加したいです。
FlashDevelop 4.0.0 Beta で MXML を使った Android アプリ開発環境を作る
FlashDevelop 3 では、Air for Android 用テンプレートを自分で取り込む必要がありましたが、FlashDevelop 4.0.0 Beta では標準でテンプレートが用意されていました。アプリのパッケージングやらインストールやらデバッグやらを実行するバッチファイルも整理されていて、結構使いやすくなってます。しかし、このテンプレートって、普通にビルドすると、MXMLでモバイルコンポーネントを使うことが出来ないようです・・・。ということを念頭に置いて、FlashDevelop 4.0.0 Beta で MXML を使った Android アプリ開発環境を作ってみます。 もちろん無料だよ!!!!!!!!!
前書いたやつも整理して書きなおしてみます。
- Flex SDK 4.5 インストール 以下サイトから「Adobe Flex SDK」をダウンロード、任意の場所に展開しておきます。 Download Flex 4.5 - Flex SDK - Adobe Open Source
- Android SDK インストール 以下サイトから「android-sdk_r11-windows.zip」をダウンロード、任意の場所に展開しておきます。 Android SDK | Android Developers 展開したフォルダ内の「SDK Manager.exe」を実行して、なんかしらアップデートっぽい何かをインストールします。よく分からないので全部インストール。
- FlashDevelop 4.0.0 Beta のインストール FlashDevelop 4.0.0 Beta をインストールします。 FlashDevelop 4.0.0 Beta については以下エントリーがとても参考になります。 馬鹿全 - FlashDevelop4.0.0 βテスト インストール後、言語を日本語に、Flex SDK 4.5 のパス登録をしておきます。
-
Android 端末準備
USB ドライバを入れて Android 端末を開発機と繋ぎます。
機種によっては
- 一般の USB ドライバ
- 開発者向けの ADB 用 USB ドライバ
-
プロジェクトの作成、設定
- FlashDevelop にて「AS3 Android App」プロジェクトを作成します。
-
「bat/SetupSDK.bat」設定
対象行 設定内容 3行目 「set FLEX_SDK=」に Flex SDK 4.5 のインストールパスを設定します。 ※FlashDevelop に Flex SDK の登録をしている場合、自動的に設定されてるかも。 6行目 「set ANDROID_SDK=」に Android SDK のインストールパスを設定します。 - 「bat/SetupApplication.bat」設定 必要あらば設定を変更します。変えるとしても「set CERT_PASS=fd」の値を変えるぐらいかと。
- MXML のモバイルコンポーネントを使えるようにする 「プロジェクト」パネルから「プロジェクト設定」を開きます。 「コンパイラー設定」パネルの「Advanced | 高度な設定 > Additional Compiler Options」を選択。 右に出てくる「...」ボタンを押下し、出てきたウインドウに「+configname=airmobile」を設定。 この設定によって、コンパイル時に「airmobile-config.xml」が参照されるようになり、MXML のモバイルコンポーネントを利用出来るようになります。
- コンパイル 適当にプロジェクト内に mxml ファイルを追加し、ドキュメントクラスとして設定しておきます。 アプリケーションとして記述する mxml タグには ViewNavigatorApplication や TabbedViewNavigatorApplication を使用します。 (くわしくはこちら) 「F8」を押下してコンパイルします。
- 証明書作成 「bat/CreateCertificate.bat」を実行します。 「<プロジェクト名>.p12」というファイルが作成されれば成功です。
- Android アプリとしてパッケージング、Android 端末で実行 プロジェクトフォルダ直下の「PackageInstallApp.bat」を実行します。 Android 端末にてアプリがプレビューされれば成功です。
これで後はガリガリ作っていくだけです。 FlashDevelop 4.0.0 Beta のテンプレートは、大分色々用意してくれていてとても便利です。さらに「application.xml」の設定も GUI で提供してくれているし、乗り換えるしか無いですね!!!!!!!!!!!!!!!!
分からないこと
手探りでAir for Android開発環境を作った
開発環境にお金を掛けたくない人向けに、とりあえずAirアプリをAndroidアプリで書き出し、Androidの端末へインストールする所までメモ。Androidの実機は用意しておいてね!!!!!
FlexSDK、AirSDK、FlashDevelop 以下サイトがステキにまとめてくださっています。 AIR for AndroidのためのFlashDevelop設定
AndroidSDK こちらからAndroidSDKをダウンロードします。 Android SDK | Android Developers 僕はとりあえず「android-sdk_r11-windows.zip」をダウンロード。 解凍したら、「SDK Manager.exe」を実行。いろいろアップデートっぽいものが出てくるので、とりあえず全部インストールしました。 (結構時間かかる)
Android端末の準備 開発機とAndroid端末を繋ぎます。 繋ぐに当たっては、各メーカーのUSBドライバをインストールする必要がある模様。 メーカーによっては、一般のUSBドライバ+開発者向けのADB用USBドライバとかもあるみたい。 (うちのIS03はそうだった。) AndroidSDKのフォルダの「tools\ddms.bat」を実行して立ち上がるウインドウに、自端末が表示されればOKらしいです。
FlashDevelopのプロジェクト設定 FlashDevelopで「AIR AS3 Projecter for Android」プロジェクトを作成する。 「CreateCertificate.bat」編集 9行目の「PATH」にFlexSDKのbinフォルダパスを設定する。 「APK_PackagerApplication.bat」編集 8、10行目の「PATH」にFlexSDKのbinフォルダパス、AndroidSDKのplatform-toolsフォルダパスを設定。 12行目の「AIR_INSTALLER」に「FlexSDK配下runtimes\air\android\emulator\Runtime.apk」のパスを設定。 「adb -e install -r %AIR_INSTALLER%」とか「adb -e install -r %APK_FILE%」とかコマンドがありますが、これで実行すると「デバイスが見つからない」みたいなエラーが出てアプリのAndroid端末へのイン ストールがうまくいきませんでした。よく分からん。 とりあえず「adb install %AIR_INSTALLER%」、「adb install %APK_FILE%」に変更。
コンパイル、アプリのAndroid端末インストール コンパイル F8を押してコンパイル。
CreateCertificate.bat実行 うまくいけば「SelfSigned.p12」ってのが出来ます。
APK_PackagerApplication.bat実行 パスワードは変更してなければ「fd」。 都度キーを押して進めていく。 Airランタイムのインストールは、Android端末にAirがインストールされてたら、「既にインストール済み」となる。 次にプロジェクトで作ったパッケージが端末にインストールされる。 うまくいったら、端末にプロジェクト名のアプリがインストールされてるはず。
自作アプリアンインストール用に「adb uninstall %APK_FILE%」というコマンドを用意しておくのもヨサゲ。
あとは好きに作っていくだけ!!!!!!!
手探りすぎて、よく吟味しないで作業しました。ここを起点に色々ためしてみようと思います。