[ActionScript] モンハンでAbstract Factory
Tags: ActionScript, DesignPatterns
剣士装備・ガンナー装備
モンスターハンターの武器は大きくわけて二種類に分類できる。それは大剣やハンマーといった近接武器(剣士専用)と弓やボウガンなどの遠距離武器(ガンナー専用)である。面白いのは防具にも剣士専用のものとガンナー専用のものがあるところで、武器と防具の関係に以下のような制約が付けられているのが他のRPG(例えばドラクエ)と大きく異なる点であろう。
- 剣士専用武器を装備している時は剣士専用防具しか装備できない。
- ガンナー専用武器を装備している時はガンナー専用防具しか装備できない。
剣士・ガンナー武器の違いは予想できるとして、剣士・ガンナー防具の違いは何だろう。答えは防御力だ。ガンナー専用防具の防御力は剣士専用防具のそれに比べて著しく低い。これは妥当な設定だ。崖の上でスコープを構えて銃撃するハンターよりも、モンスターの足下すれすれで剣を振り回しているハンターの方がモンスターからダメージを受ける可能性が高いからであろう。ダメージを受ける頻度が異なる者同士をより平等に扱うためには防御力による差別化をはかったという風に考えれば、上記のような剣士・ガンナー防具の制約はとてもリーズナブルだ。
裸のハンター
さて剣士・ガンナー防具の制約、面白い仕組みなのだが、少しだけストレスになることがある。着替えをする時だ。モンハンをやったことがある人なら経験があると思うが、今例えば剣士専用装備(近接武器+近接武器用防具)をしているとしよう。この状態で武器をガンナー専用であるボウガンに替えたとするとどうなるか。答えは防具が全部外れて裸になる、である。なぜならボウガンを装備した時点でガンナー武器を装備していることになり、上記の剣士・ガンナー防具の制約から剣士防具が装備できなくなるからである。ボウガンだけを装備した裸のハンターはガンナー専用防具をイチから装備し直さないといけないのだ。そしてこの問題は剣士・ガンナー間の装備変更にはいつもつきまとうことになる。
便利な機能
そこでゲーム内に用意されているのが着替えを一括で行うマクロ機能だ。自分のお気に入りの武器と防具の組み合わせをあらかじめ登録しておくことで、次回からボタン一つで全身の装備コーディネートができてしまう。もちろん登録時の装備は自分が今現在装備しているものから選ばれているため、剣士・ガンナー防具の制約も必ず満たすことになる。登録スロットも20もあり(MHP2Gの場合)、好きなときに好きなスロットの装備にボタン一つで変身できるようになる。
本題
前置きが長くなったが、このモンハンの装備一括変更のマクロ機能、デザインパターンで言うところの何に相当するのか、ということで少し考えた。いくつか候補があったものの結局これに落ち着いた。Abstract Factoryパターンである。全く同じ操作でユーザーを煩わせることなく機能する、というところに重点を置いた結果である。Abstract Factoryパターンの解説は以下リンク先へどうぞ。簡単なActionScriptコード付き。
Design Patterns for ActionScript
Tags: ActionScript, DesignPatterns
Eric Gamma et al. - Desingn Patternsを全部Action Scriptで解説しようと思ったらなかなかハードで途中で力尽きてしまった。一応全体三部のうちのStructural Patterns(以下参照)については完成はしていたので公開することに。ただし注意。そもそもの動機が自分のための勉強だったため、単なる書物の和訳にならないように自分で本質だと感じた部分をメインに書いている。したがって内容に少しでも疑問を持った場合は原著をあたってください。
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
» Design Patterns for ActionScript
[iPhone]プロパティのsetter/getterの表示を変更する
Tags: ActionScript, Objective-C
コーディングの趣味の話なので必ずしも重要ではないが、個人的には大発見。
Problem
インスタンスプロパティ(Objective-Cではインスタンス変数と呼ぶ)の表示名とgetter/setter(Objective-Cではアクセサメソッドと呼ぶ)の表示名を異なるものにしたい。例えば、インスタンス変数をNSStringの”_name”と定義、そのアクセサメソッドは先頭のアンダースコアを除いた”name”で扱いたい。
Recipe
プロパティの定義は普通に”_name”とする。setter/getterを作成する際に以下のような細工をする。@propertyと@synthesizeの書き方が定義されたインスタンス変数と若干異なる(特に@synthesize)。
//TestClass.h @interface TestClass : NSObject{ NSString *_name; } @property (retain) NSString *name; @end //TestClass.m @implementation TestClass @synthesize name = _name; @end
クラス内部でのインスタンス変数への直接アクセス(”_name”)とアクセサメソッド経由のアクセス(”self.name”)が明確に区別できるのが利点。Xcodeの適当な色づけに頼るよりアンダースコアの有無による絶対的な判断の方がしっくりくるという理由もある。
ActionScriptで言うと
上記内容は以下のgetter/setterと同等。ほんとに趣味の問題。
protected var _name:String; public function get name():String{ return _name; } public function set name(value:String):void{ _name = value; }
Reference
【コラム】ダイナミックObjective-C (102) プロパティ(2) - プロパティの宣言 | エンタープライズ | マイコミジャーナル
ソースコードを色付けしてhtml化するPHPパッケージ - GeSHi
Tags: ActionScript, Objective-C, PHP
GeSHi - Generic Syntax Highlighterはプログラムソースを修飾語などにきれいに色付けした状態でhtmlソースとして出力してくれるPHPパッケージ。対応言語が豊富で、ActionScriptやObjective-Cも対応している。GeSHiを使ったWebサービスが見当たらないのはプロジェクトライセンスがGPLのためなのかな。
使い方
- sourceforge.netからパッケージをダウンロード。パッケージ全体をPHPが動作する環境に配置する。
- パッケージで定義されているGsShiクラスにhtml化したいソースファイルのストリング内容とパースしたい言語を引数に渡してパースさせる。
- パース内容を出力させたものがhtml化されたソースコードになる。
ActionScript 3.0の場合
例えばTest.asの中身を表示したい場合、PHPファイルに以下のように記述して実行。
<?php include(‘geshi.php’); //Language $lang = ‘actionscript3′; //Raw source code $path = ‘Test.as’; $src = file_get_contents($path); $geshi = new GeSHi($src, $lang); $geshi->enable_keyword_links(false); echo $geshi->parse_code(); ?>
上記PHPファイル実行時の出力内容は以下の通り。Flex Builderと全く同じ見た目が出力される。インデントがちょっと深いぐらい?
package { import flash.display.Sprite; /** * Test.as */ public class Test extends Sprite{ /** * Constructor */ public function Test(){ this.init(); } protected function init():void{ trace("Hello"); } } }
Objective-Cの場合
例えばTestAppDelegate.mの中身を表示したい場合、PHPファイルに以下のように記述して実行。
<?php include(‘geshi.php’); //Language $lang = ‘objc’; //Raw source code $path = ‘TestAppDelegate.m’; $src = file_get_contents($path); $geshi = new GeSHi($src, $lang); $geshi->enable_keyword_links(false); echo $geshi->parse_code(); ?>
上記PHPファイル実行時の出力は以下の通り。まあアリ?
// // TestAppDelegate.m // Test // // Created by boreal-kiss.com on 09/02/08. // Copyright boreal-kiss.com 2009. All rights reserved. // #import "TestAppDelegate.h" #import "TestViewController.h" @implementation TestAppDelegate @synthesize window; @synthesize viewController; - (void)applicationDidFinishLaunching:(UIApplication *)application { // Override point for customization after app launch [window addSubview:viewController.view]; [window makeKeyAndVisible]; } - (void)dealloc { [viewController release]; [window release]; [super dealloc]; } @end
その他
パッケージデフォルトだとSpriteやintなんかに変なURLのリンクがくっつくので、以下の設定でキーワードへのURLリンクを無効にしておくとよい。
$geshi->enable_keyword_links(false);
出力された内容をそのままブログなんかにコピー&ペーストしたいのであれば、以下のように出力内容を設定してやるとよい。出力内容がhtmlタグの形で表示される。
//echo $geshi->parse_code(); echo ‘<pre>’; echo htmlspecialchars($geshi->parse_code()); echo ‘</pre>’;
WonderFlで複数のクラスを使いたい場合
Tags: ActionScript
WonderFlでコンパイルできるのは1ファイルのみ(importできるのは指定されているライブラリのみ)。別ファイル化されているクラスを使いたくても使えないので、1ファイルに無理矢理押し込めてやる必要がある。» Fork me!!
一般仕様
//main.as package { import flash.display.Sprite; import com.borealkiss.Model; public class main extends Sprite{ public function main(){ } } }
//Model.as package com.borealkiss{ public class Model{ public function Main(){ } } }
WonderFl仕様
//All in one file package { import flash.display.Sprite; public class main extends Sprite{ public function main(){ } } } //No access modifier!!(i.e., public) class Model{ public function Model(){ } }
追記 2008/12/22
Flexアプリケーションが動いてる!!


