[ CATEGORY ] tips…

http://www.dango-itimi.com/blog/archives/flash/

FLASH tips 子をn個持つ親クラスのコンストラクタには引数は指定しない

ようやっと初めての AS3 の業務に取り掛かっています。今までなんだかんだの制約があり AS3 でまともな業務を行なったことはありませんでした。早速 AS3 で気付いた点を以下に記述します。恐らくとっても何をいまさらなエントリーです。


親クラスのコンストラクタに引数が指定してある場合、子クラスでは明示的に super メソッドを呼び出す必要がでてくるようです。
例えば以下のような Person クラスを親に持つ Boy クラスと Girl クラスを Sample クラスから利用するには以下のようになります。

※package記述は略

public class Person{
	private var name:String;
	public function Person(name:String){
		this.name = name;
	}
}
public class Boy extends Person{
	public function Boy(name:String){
		super(name);
	}
}
public class Girl extends Person{
	public function Girl(name:String){
		super(name);
	}
}
public class Sample{
	public function Sample(){
		var boy:Boy = new Boy("boy");
		var girl:Girl = new Girl("girl");
	}
}

ここで Person クラスを親に持つクラスが Boyクラス、Girl クラス以外に複数増える場合、それら複数のクラス全てに明示的なコンストラクタの実装と super メソッドの呼び出しを行なう記述が必要になってしまいます。また、Person コンストラクタに引数を追加したいという場合、子クラス全てのコンストラクタと super メソッド呼び出しの箇所に修正を入れる必要がでてきてしまいます。

これを避けるためには、Personクラスのコンストラクタに引数を指定するのはやめ、別メソッドで同処理を行なうようにします。

public class Person{
	private var name:String;
	public function create(name:String):void{
		this.name = name;
	}
}
public class Boy extends Person{
}
public class Girl extends Person{
}
public class Sample{
	public function Sample(){
		var boy:Boy = new Boy();
		var girl:Girl = new Girl();
		boy.create("boy");
		girl.create("girl");
	}
}

[ FLASH ] [ tips ] 2008年08月12日 20:33 | コメント (0) | トラックバック

FLASH tips update 透視投影 再々勉強

業務に必要になりそうなので再度透視投影について勉強。最近丁度 Flashによる透視投影方法について詳しく解説してある記事があったので参考にさせてもらいました。

 ■てっく煮ブログ
 AS3.0 で 3D プログラミングを1から勉強する (1)
 AS3.0 で 3D プログラミングを1から勉強する (2) - 行列の導入
 AS3.0 で 3D プログラミングを1から勉強する (3) - 透視投影

なんともシンプルな式と方法で透視投影ができてしまうようで、今まで私が知っていた方法はなんだったのと言わんとぞばかりです。

試しとして以前作成したローグライクマップ自動生成処理と組み合わせてみました。

▽続きを読む

[ FLASH ] [ tips ] [ update ] 2008年07月09日 10:31 | コメント (4) | トラックバック

FLASH tips Action Script 2.0 三項演算子内 getter 使用のコンパイルエラー

Action Script 2.0 三項演算子内で getter を使用する場合、代入対象の値を全て getter にするとコンパイルエラーが発生します。

以下のような Sampleクラスがあるとします。

class Sample{

	private var num1:Number = 1;
	private var num2:Number = 1;
	public function get _num1():Number{ return num1; }
	public function get _num2():Number{ return num2; }
}


ここで、以下の Test クラスのような三項演算子での Sample クラスの getter の利用は問題はありません。

class Test{

	public function Test(flg:Boolean){

		var sample:Sample = new Sample();

		var num1:Number = flg ? 1 : 2;
		var num2:Number = flg ? sample._num1 : 2;
		var num3:Number = flg ? 1 : sample._num2;
	}
}


しかし以下の用な記述を行うと、コンパイルエラーが発生します。

class Test{

	public function Test(flg:Boolean){

		var sample:Sample = new Sample();

		//コンパイルエラー発生
		var num:Number = flg ? sample._num1 : sample._num2;
	}
}
■エラー内容

代入ステートメントが一致しません。Function が見つかりましたが、Numberが必要です。

getter の sample._num1 と sample1._num2 がNumber型ではなく Function型として評価されてしまうようです。

上記エラーを避け、なおかつ三項演算子を使用したい場合は、キャストを用いて型変換を行えばよいようです。

class Test{

	public function Test(flg:Boolean){

		var sample:Sample = new Sample();

		//コンパイルエラーは発生せず
		var num:Number = flg ? Number(sample._num1) : Number(sample._num2);
	}
}

[ FLASH ] [ tips ] 2008年05月14日 20:27 | コメント (0) | トラックバック

ETC FLASH info tips 雑記といくつかメモ

山にこもって二ヶ月ほど経過しましたが、現在取り組んでいる仕事がなかなか終わりません。中途 細かい仕事がいくつか入り、頭がいい具合に煮詰まっております。

以下、業務を通していくつか覚えた事を参考サイトと共にメモ。


【 Subversion 上の html ファイルのブラウザ表示設定 】

Subversion 上の html ファイルにブラウザからアクセスすると、html のソースがブラウザに表示されます。しかし html ファイルに属性設定を行と、html をブラウザで開いたときのそのままの表示にすることができるようになります。この設定をしたおかげで、打ち合わせ時に Subversion 上のファイル一式を PC上にダウンロードしなくても 表示確認を簡単に行えるようになりました。

 日常の備忘録:: HTMLをSubversionで管理しながらWebで参照可能に
 http://www.kaede-software.com/2008/01/htmlsubversionw.html


【 デバイスフォント シェイプマスク適用にフィルタ設定 】

デバイスフォントにマスクをかける際、マスクはどのような形をしていようと、矩形マスクとして適用されてしまう問題があるようです。その問題を解決するために以下のサイトのような ビットマップキャッシュを用いた方法があります。

 fumiononaka.com : デバイスフォントが表示されない
 http://www.fumiononaka.com/TechNotes/Flash/FN0502002.html

上記サイトの他の方法として、デバイスフォントのテキストフィールドにフィルタ設定を行うと、ビットマップキャッシュを用いずとも、マスクは矩形として適用されず、シェイプの形そのままで適用することができるようです。


【 ローカル上で確認する際の 他バージョンへのswfへの変数アクセスの制限 】

FlashPlayer8で書き出した swf(8.swf) から FlashPlayer7 で書き出された swf(7.swf)を読み込む場合、ローカルPC上に配置している 8.swfを表示するhtmlをブラウザで開いて動作確認を行おうとしても、8.swf から 7.swf への変数へはアクセスできませんでした。

Flashのムービープレビューやネットワーク上では問題なく動作するため、おそらく他バージョンへのswfのローカルアクセスは制限されているのかもしれません。表示確認に、やや手間がかかってしまうのが面倒です。

[ ETC ] [ FLASH ] [ info ] [ tips ] 2008年05月14日 20:17 | コメント (0) | トラックバック

FLASH info tips FDT 3.0 Enterprise beta版で Refactor Moveコマンドがサポート

最近情報収集にうとくなっており見逃していました。
FlexBuilder なり FDT なり、早く Refactor Move コマンドがサポートされるようにならないかなあ、と鼻をほじほじしながら待ち望んでいたところ、FDT 3.0 Enterprise beta版 で Move コマンドがサポートされたとのこと。

http://fdt.powerflasher.com/blog/?p=40

早速利用してみましたが、oh ブラボー!としかいいようがありません。プログラミング中に、クラス名、メソッド名、変数名はおろか パッケージ名やパッケージ構造もモリモリ変更したくなる方にはうってつけのツールとなりました。

追記)ベータ版のせいなのか、パッケージ名付でクラスを newを行っている箇所に対しては Moveが実行されない等、まだ動作は完全ではない模様。

---

以下、Action Script での Refactor Rename コマンド実行における注意事項。
配列演算子による変数へのアクセスの記述は注意が必要となります。

▽続きを読む

[ FLASH ] [ info ] [ tips ] 2008年03月13日 21:42 | コメント (0) | トラックバック

FLASH tips Excelで開いているファイルは URLLoaderで読み込めない

今後のネットでの検索用に、20分ほどつまずいた ファイル読み込み時の簡単なエラーのメモ。

URLLoaderでcsvファイルを読み込む処理を作成し ローカルPC上で動作検証してみたところ、次のような csv ファイルが読み込めないという旨のメッセージが表示されました。

[IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2
text="Error #2032: ストリームエラー。 URL: file:///~/viewer.csv"]

原因は、読み込み対象の csv ファイルを Excel で開いていたからでした。Excelで開くことにより読み込み対象のファイルがロックされてしまっていたようです。Microsoft Office系のソフトは皆このようになるのでしょうか。メモ帳等のテキストエディタの場合は、この現象は起きません。csvファイルをExcelで開くようにファイル関連付けをしていると、ローカルPC上でのcsvファイル読み込み検証時、同じようにつまずく事があるかもしれません。

[ FLASH ] [ tips ] 2008年02月18日 16:57 | コメント (1) | トラックバック

FLASH tips update トレジャーボインゴ11

会社の携帯端末 docomo SO905i の Flash Lite 3.0 にてトレジャーボインゴの動作確認を行ってみました。そして見事動作させることができました。

---

■Flash Lite 3.0 搭載 携帯用アドレス

・サンプル5 直アドレス
 http://m.dango-itimi.com/trebo/test/5.swf

・携帯電話用 団子一味のアドレス
 http://m.dango-itimi.com/

・QRコード

携帯端末での操作方法は、「2」「8」「4」「6」キーでキャラクター移動&攻撃となっております。

携帯用のトレジャーボインゴは、フレーム分割処理というものを組み込んでいるため、マップ生成からステージ表示まで20秒くらい時間を必要とします。携帯版ではマップ生成中は「マップ生成中...」といった表示を行う予定です。

---

Flash Lite 3.0 が搭載されている docomo 905i シリーズのワークメモリは以下のページによると 一律 3072KB とのこと。

http://www.nttdocomo.co.jp/service/imode/make/content/spec/flash/index.html

Adobe Device Central CS3 のエミュレータ上では、トレジャーボインゴのワークメモリ使用数は 2400~2600KB 程度となっているので、携帯端末上でも問題なく動作してくれました。

現状わかっている問題点として、フロア切り替え後、階段をすぐさま下り次のフロアへ移動すると メモリ解放が上手く行われない、といったことがあるようです。使用メモリが上がったままになってしまい どんどん 3000KB に近づいいってしまう、という現象が起こってしまいます。

端末の性能がアップしていることからか、Flash Lite 2.0 が搭載されていた au よりも処理速度は早く動作しています。キャラクター等の移動速度は PC に比べると遅いですが、au よりは早く動作するようになりました。

docomo 905i シリーズから画面領域がいままでの倍となったので swf表示サイズを当初の予定通り倍にしています。ドット感が出ていい感じです。


■PC版はこちら

▽続きを読む

[ FLASH ] [ tips ] [ update ] 2008年01月14日 22:21 | コメント (0) | トラックバック

FLASH tips 処理フレーム分割

「ローグライクマップ自動生成処理」を 現在作成しているFlashLiteゲーム「トレジャーボインゴ」に組み込んでみた所 携帯端末上ではエラーが発生し動作しなくなった、と以前blogに記述しました。1フレーム内で処理する行数が多すぎたためエラーが発生しているものと思われます。

「ローグライクマップ自動生成処理」のみを携帯端末で動作させてみたところ、同じくエラーが発生。「ローグライクマップ自動生成処理」を行う各クラス内のメソッドを複数のフレームをまたぎつつ呼び出す必要がありそうです。

対処として以下のような方法をとることにしました。


【 メインクラスの変更 】

メインとなる Sampleクラス があるとします。

class Sample{

	private var testA:TestA;
	private var testB:TestB;
	private var testC:TestC;

	public function Sample(root:MovieClip){

		testA = new TestA();
		testB = new TestB();
		testC = new TestC();

		testA.run();
		testB.run();
		testC.run();
	}
}

TestA~Cクラスの runメソッドを実行すると それぞれの処理行数が多すぎてエラーが発生してしまう、という場合、各runメソッドを1フレームにつき一つずつ実行するためには以下の様に変更します。

class Sample{

	private var testA:TestA;
	private var testB:TestB;
	private var testC:TestC;

	private var main:Function = null;

	public function Sample(root:MovieClip){

		testA = new TestA();
		testB = new TestB();
		testC = new TestC();

		main = funcA;
		var sc:Sample = this;
		root.onEnterFrame = function(){ sc.run(); }
	}
	private function run():Void{

		main();
	}
	private function funcA():Void{

		testA.run();
		main = funcB;
	}
	private function funcB():Void{

		testB.run();
		main = funcC;
	}
	private function funcC():Void{

		testC.run();
		main = end;
	}
	private function end():Void{
		~
	}
}

上記変更により、一つのフレームで実行される処理は mainメソッドのみとなります。実際は、mainメソッドの参照先メソッド(funcA~C)が実行されます。参照先メソッド内の処理終了後 次に行いたい処理を再び mainメソッドに代入し、次々とTestA~Cクラスの runメソッドを実行していきます。

【 各クラスの変更 】

ここで TestA クラス の内容が以下のようになっているとします。

class TestA{

	public function TestA(){}

	public function run():Void{

		func1();
		func2();
		func3();
	}
	private function func1():Void{
		~
	}
	private function func2():Void{
		~
	}
	private function func3():Void{
		~
	}
}

TestAクラスの func1~3 メソッドの処理行数が多く、TestA.runメソッドを実行するとエラーが発生してしまう場合、以下の用に変更します。

class TestA{

	private var main:Function = null;

	public function TestA(){}

	public function run():Boolean{

		if(main == null) main = func1;
		main();
		return main == null;
	}
	private function func1():Void{
		~
		main = func2;
	}
	private function func2():Void{
		~
		main = func3;
	}
	private function func3():Void{
		~
		main = null;
	}
}

また、Sampleクラス の funcAメソッド を以下の用に変更します。

	~
	private function funcA():Void{

		if(testA.run()) main = funcB;
	}
	~
}

これにより、TestAクラス内の各メソッドが1つのフレームで一つだけ実行されるようになります。TestA.runメソッドから true が返ると、TestAクラス内のすべての処理が終了したことを意味します。


現在は「ローグライクマップ自動生成処理」に上記のような対処を各クラスに追加/変更中...
しかしなかなか動作してくれず。

[ FLASH ] [ tips ] 2007年11月14日 20:28 | コメント (0) | トラックバック

FLASH tips Flashのバージョンの違いで FlashLite用 swf書き出しに容量の差が出る

Flash8で作成していたFlashLite用ゲームを Flash CS3(Flash9)でパブリッシュしてみると、Flash CS3で書き出される swfの方が容量が大きいことがあります。原因は詳しく調査はしていないのでわかりませんが、100KBの容量ギリギリにswfを作成している場合は とても困る問題です。

Flash CS3では ラスタデータの画像の書き出し処理に何か不備がある、といった記事をどこかで見かけたことがありますが、そこらへんが関係しているのかもしれません。

[ FLASH ] [ tips ] 2007年09月21日 10:40 | コメント (0) | トラックバック

FLASH tips Flex 3 パブリックベータ Refactorコマンド試用

Flex 3 パブリックベータがダウンロード可能になったようです。新機能の一つとして「コードのリファクタリング機能」がついたとのこと。こいつは待ちに待っていた機能ではありませんか、というわけで早速試してみることに。

Flex Builder 3 Public Beta
http://labs.adobe.com/technologies/flex/flexbuilder3/

ActionScript Project を作成し、メインクラスとなる Sample.asファイルを作成。

次にNavigatorウインドウから右クリックでメニュー表示を見てみると、ありました「Refactor」コマンド。
「Refactor」コマンドの項目内には「Rename」がありました。

ベータなのでまだこれだけなのかな、と思いつつ、Renameの項目からクラス名「Sample」を「Sample2」に変更してみると次のようなエラーダイアログが表示されました。

An unexpected exception occurred while performing the refactoring. See the error log for more details.

See the error log for more details.

なんだか Flex Builder 2 を使用していた時もこのようなエラーメッセージが表示されたことがあったような気がします。エラーの原因は少しわかりませんが、Flex Builderを何度か再起動してみたらエラーがでなくなりました。

「Rename」が成功すると、Sample.as内の「Sample」というクラス名とコンストラクタが「Sample2」にすべて変更されました。

次にtest.Testクラス(Test.as)を作成し、Sample2クラスからTestクラスのインスタンスを生成します。そしてTestクラスをRefactorコマンドでRenameし、クラス名を「Test2」にしてみるとどうなるか試してみます。

Previewボタンを押してみると、Testクラスを使用している全てのファイルの修正点を閲覧することが可能のようです。Sample2クラス内の「Test」の記述が「Test2」に変わることを教えてくれます。こ、こいつを待っていたんだぜ…!

今後できるようになるのかはわかりませんが、パッケージ名をRefactorコマンドで Rename等することはできない模様。属するパッケージを変更したい場合、今までどおり一個一個全てのクラスを修正していかなくてはならないようです。

Javaでeclipseによるリファクタリング機能説明のすごそうなページがありましたが、このようなことができるようになるのですかなあ。

実践!リファクタリング
http://gihyo.jp/magazine/wdpress/information/2007/vol37-refactoring

[ FLASH ] [ tips ] 2007年06月11日 19:12 | コメント (0) | トラックバック

FLASH tips ローグライクマップ自動生成3

■パーツ配置処理実装

自動生成したマップに、プレイヤー、次のフロアへ行くための階段、敵、背景パーツ、アイテム、グループ背景パーツをランダム配置可能にしました。


【 自動生成したマップ 】

□□□□□□□□□☆□□□□□□□□☆□□□□□☆□□□□□
□□□□□□□□□☆□□□□□□□□☆□□□□□☆□●■●□
□□□□□□□□□☆□□□□□□□□☆□●■●□◆◆◆◆◆□
□□□□□□□□□☆□□□□□□□□◆◆◆◆◆◆◆□●■■□
□□□□□□□□□☆□●■■■■●□◆□●◆●□☆□■■■□
□□□□□□□□□☆□■■■■◆◆◆◆□■◆■□☆□■■■□
□□□□□□□□□☆□■■■■◆●□☆□●◆●□☆□●■●□
□□□□□□□□□☆□■■■■◆■□☆□□◆□□☆□□□□□
□□□□□□□□□☆□●■■■◆■□☆☆☆◆◆◆☆☆☆☆☆☆
□□□□□□□□□◆◆◆◆◆■◆■□☆□□□□◆□□□□□□
□□□□□□□□□◆□●■◆■◆●□☆□●■●◆●■■■●□
□●■■■■■●□◆□■■◆■◆◆◆◆◆◆■■◆■■■■■□
□■■■■■■■□◆□■■◆◆◆●□☆□●■■◆■■■■■□
□■■■■■■■□◆□●●◆●■●□☆□●■■◆■■■■●□
□■■■■■■●□◆□□□◆□□□□☆□□□□□□□□□□□
□■■■■■◆◆◆◆☆☆☆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆☆☆
□■■■■■◆●□☆□□□□□□□□□□□□□□□□□◆□□
□■■■■■◆■□☆□□□□□□□□□□□□□□□□□◆□□
□■■■■■◆■□☆□□□□□□□□□□□□□□□□□◆□□
□■■■◆◆◆■□☆□□□□□□□□□□□□□□□□□◆□□
□●■●◆●■●□☆□□□□□□□□□□□□□□□□□◆□□
□□□□◆□□□□☆□□□□□□□□□□□□□□□□□◆□□
☆☆☆☆◆☆☆☆☆☆□□□□□□□□□□□□□□□□□◆□□
□□□□◆□□□□☆□□□□□□□□□□□□□□□□□◆□□
□●■●◆●■●□☆□□□□□□□□□□□□□□□●●◆●□
□■■■◆■■■□☆□□□□□□□□□□□□□□□■■◆■□
□■■■◆■■●□☆□□□□□□□□□□□□□□□●■◆■□
□■■■◆■■◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆■◆■□
□●■■◆■■●□☆□□□□□□□□□□□□□□□●■◆●□
□□□□□□□□□☆□□□□□□□□□□□□□□□□□□□□

【 各パーツ配置 】
                          ■■■ 
                    ■I2■ ■■■■■ 
                  ■■■■■■■ ■E1■ 
           ■■■■E3■ ■ ■■■   B1■E1 
           B2■■■■■■■ ■■■   ■■■ 
           ■■■■■■   ■■■   ■■■ 
           ■■■■■■    ■        
           ■■■■■■    ■■■      
         ■■■■■■■■      ■      
         ■ ■■■■■■   ■■■■■■■■■ 
 ■■■■■■■ ■ ■■■■■■■■■■■■■■■■■■ 
 ■■■■■■■ ■ ■I1■■■■   B1■■■■■■■■ 
 ■■■■■■■ ■ ■■■■■■   ■■■■■■■■■ 
 ■■■■■■■ ■   ■                
 ■■■■■■■■■   ■■■■■■■■■■■■■■■  
 ■E2■■■■■                   ■  
 ■■■■■■■                   ■  
 ■■■■■PE1                   ■  
 ■■E3■■■■                   ■  
 ■■■■■E2■                   ■  
    ■                      ■  
    ■                      ■  
    ■                      ■  
 ■■■■■■■                 ■■■■ 
 ■■■■■■■                 ■B2■■ 
 ■B5B6■■■■                 ■■■■ 
 ■B7B8■■■■■■■■■■■■■■■■■■■■■■■S■ 
 ■■■■■■■                 ■■■I1

P : プレイヤー
S : 階段
En : 敵
In : アイテム
Bn : 背景パーツ

nはIDを示す
10以上のIDはXと表示される

登場させたい各パーツのID一覧をメインクラスに渡すことでランダム配置されるように処理しています。

プレイヤーと階段は、すべての部屋が繋がるための通路上に配置されます。プレイヤーと階段以外は、すべての部屋が繋がるための通路上には配置されません。(ローグライクマップ自動生成2参照)

グループ背景パーツは、複数チップで構成される大きな背景パーツを配置したい場合に指定します。上記例ではB5~b8の四つの背景パーツが固まっている箇所がグループ背景パーツとなっています。

配置処理順序は以下のようにしています。

 1.指定した各パーツを最低ひとつずつ配置
 2.各パーツをランダム数配置

パーツ配置可能なチップがなくなった時点で配置処理は終わります。
グループ背景パーツに関しては、配置可能なチップをランダムで探索させているため、特定の探索数を上回った場合、配置はとりやめになるように処理しています。よって、グループ背景パーツを配置するように指定したにもかかわらず、フロア上には配置されない事もあります。FlashLiteでは1フレーム内で実行する処理行数はさほど多くはないと思われるので、探索可能上限はあまり大きく設定はできません。

■敵登場位置設定

1フロア内で一定以下の敵の数になったら敵がどこかに登場するようにします。
一歩一歩プレイヤーが歩くたびに敵がどこに登場するかを決定する処理は行わず、あらかじめどの位置に敵が登場するかを設定して処理軽減を行います。

設定したマップは以下のようになります。

                          ■■■ 
                    ■E■ ■■■■■ 
                  ■■■■■■■ ■■■ 
           ■■■■■■ ■ ■■■   ■■■ 
           ■■■■■■■■ ■■E   ■■■ 
           ■■■E■■   ■■■   ■E■ 
           ■■■■■■    ■        
           ■■■■■■    ■■■      
         ■■■■■■■■      ■      
         ■ ■■■E■■   ■■■■■■■■■ 
 ■■■■■■■ ■ ■■■■■■■■■■■■■■■■■■ 
 ■■■■■■■ ■ ■■■■■■   ■■■■■■■■E 
 ■■■■■■■ ■ ■■■■■■   ■E■■■■■■■ 
 ■■■■■■■ ■   ■                
 ■■■■■■■■■   ■■■■■■■■■■■■■■■  
 ■■■■■■■                   ■  
 ■■■■■■■                   ■  
 ■■■■■■■                   ■  
 ■■■■■■■                   ■  
 ■■■■■■■                   ■  
    ■                      ■  
    ■                      ■  
    ■                      ■  
 ■■■■■■■                 ■■■■ 
 ■■■■■■■                 ■■■■ 
 ■■■■■E■                 ■■■■ 
 ■■■■■E■■■■■■■■■■■■■■■■■■■■■■ 
 ■■■■■E■                 ■■■■

指定した数値分、敵登場位置が設定されます。

これにてローグライクマップ自動生成処理はほぼ完成。

[ FLASH ] [ tips ] 2007年05月31日 02:24 | コメント (0) | トラックバック

FLASH tips ローグライクマップ自動生成2

【 ランダム通路作成 】

全ての部屋が繋がるように通路を繋げた後は、各部屋からランダムで通路を延ばします。
その場合の独自に設定した仕様は以下の通りです。

・ランダムで延ばす通路は直進するのみ (処理軽減のため)
・部屋の角には通路は作らない (見た目を整えるため)
・二本以上の通路が隣り合わせることはないようにする (見た目を整えるため)

ランダムで通路を延ばすようにしたマップ自動生成例は次のようになります。

□□□□□□□☆□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□☆□□□□●■■■■■■■■■■■■■■■●□
□□□□□□□◆◆◆◆◆◆■■■■■■■■■■■■■■■■□
□□□□□□□◆□□□□●■■■■■■■■■■■■■■■■□
□□□□□□□◆□□□□■■■■■■■■■■■■■■■■■□
□□□□□□□◆□□□□■■■■■■■■■■■■■■■■■□
□□□□□□□◆□□□□●■■■■■■■■●◆●■■●◆●□
□□□□□□□◆□□□□□□□□□□□□□□◆□□□□◆□□
□□□□□□□◆☆☆☆☆☆☆☆☆☆☆☆☆☆◆◆☆☆☆☆◆☆☆
□□□□□□□◆□□□□□□□□□□□□□◆□□☆□□◆□□
□□□□□□□◆□□□□□□□□□□□□□◆□□☆□□◆□□
□□●■■●□◆□●■■■■■■■■■■●◆●□☆□●◆●□
□□■■■●□◆□■■■■■■■■■■■■■■□☆□■■■□
□□■■■◆◆◆□■■■■■■■■■■■■■■□☆□●■■□
□□■■■●□☆□■■■■■■■■■■■■■●□◆◆◆■■□
□□■■■■□☆□■■■■■■■■■■■■■◆◆◆□●■■□
□□■■■■□☆□●■■●◆●■■■■■■■●□☆□●◆●□
□□■■■■□☆□□□□□◆□□□□□□□□□□☆□□◆□□
□□■■■■□☆☆☆☆☆☆◆◆◆◆◆◆◆◆☆☆☆☆☆☆◆☆☆
□□■■■■□☆□□□□□□□□□□□□◆□□□☆□□◆□□
□□■■■■□☆□□□□□□□□□□□□◆□□□☆□●◆●□
□□■■■■□☆□□□□□□□□□□□□◆□□□☆□■■■□
□□■■■■□☆□□□□□□□□●■■●◆●●□☆□■■■□
□□■■■■□☆□□□□□□□□■■■■■■■□☆□■■■□
□□■■■■□☆□□□□□□□□■■■■■■●□☆□●■■□
□□■■■■□☆□□□□□□□□■■■■■■◆◆◆◆◆■■□
□□■■■■□☆□□□□□□□□■■■■■■●□☆□●■■□
□□■■■■□☆□□□□□□□□■■■■■■■□☆□■■■□
□□●■■●□☆□□□□□□□□●■■■■■●□☆□●■●□
□□□□□□□☆□□□□□□□□□□□□□□□□☆□□□□□

●は上下左右のチップに通路を作成できないチップです。部屋作成時に部屋の四隅に設定しています。また通路を作成する際、通路が開通した位置のチップの両側にあるチップに設定しています。こうすることで、部屋の角には通路は繋がらなくなり、また、通路が二本以上隣り合うことはならないように処理させています。

◆には移動しない背景オブジェクト(木や岩等)を配置できない箇所です。ランダムで背景オブジェクトを設置させたい場合、通路がふさがれて全ての部屋に移動できなくなってしまうことがないように設定しています。


【 部屋内部にも通路作成 】

ランダムで移動しない背景オブジェクトを配置する際、『プレイヤーオブジェクト』や次のフロアへ移動するための『階段』が、背景オブジェクトにふさがれてしまう可能性があることに気付きました。どちかでもふさがれてしまうと、次のフロアへ進むことができなくなってしまいます。

プレイヤーオブジェクトや階段が 背景オブジェクトにふさがれないようにするためには、一本の全ての部屋が繋がる通路を部屋内部にも作成します。通路がある箇所には背景オブジェクトは配置できないようにしているので、その通路上にプレイヤーオブジェクトや階段を配置すれば次のフロアへ進むことができないという事は起こらなくなります。

部屋内部にも通路を作成したマップ自動生成例は次のようになります。
この例ではランダム通路は作成していません。

□□□□□□□□□□□□□□□□☆□□□□□□□□□□□□□
□□□□□□□□□●■■■■●□☆□●■■■■■■■■■●□
□□□□□□□□□■■■■◆◆◆◆□■■■■■■■■■■■□
□□□□□□□□□■■■■◆●□◆□■■■■■■■■■■■□
□□□□□□□□□■■■■◆■□◆□■■■■■■■■■■■□
□□□□□□□□□■■■◆◆■□◆□■■■■■■■■■■■□
□□□□□□□□□●■●◆●●□◆□■■■■■■■■■■■□
□□□□□□□□□□□□◆□□□◆□■■■■■■■■■■■□
☆☆◆◆◆◆◆◆◆◆◆◆◆☆☆☆◆□■■■■■■■■■■■□
□□◆□□□☆□□□□□□□□□◆□■■■■■■■■■■■□
□●◆●●□☆□□□□□□□□□◆□■■■■■■■■■■■□
□■◆◆■□☆□□□□□□□□□◆□■■■■■■■■■■■□
□■■◆■□☆□□□□□□□□□◆□■■■■■■■■■■■□
□■■◆●□☆□□□□□□□□□◆□■■■■■■■■■■■□
□■◆◆◆◆◆□□□□□□□□□◆□■■■■■■■■■■■□
□●◆●●□◆□□□□□□□□□◆□■■■■■■■■■■■□
□□◆□□□◆□●■■■■■●□◆□■■■■■■■■■■■□
☆☆◆☆☆☆◆□■■■■■■■□◆□■■■■■■■■■■■□
□□◆□□□◆□■■■■■■■□◆□■■■■■■■■■■■□
□●◆●●□◆□■■■■■■■□◆□■■■■■■■■■■■□
□■◆■■□◆□■■■■■■■□◆□■■■■■■■■■■■□
□■◆■■□◆□■■■■■■■□◆□●■■■■■■■■■■□
□■◆■■□◆□●■■■■■■□◆◆◆◆◆◆◆◆◆◆◆◆◆□
□■◆■■□◆◆◆◆◆◆◆◆◆□☆□●■■■■■■■■■■□
□■◆■■□☆□●■■■■■■□☆□■■■■■■■■■■■□
□■◆■■□☆□■■■■■■■□☆□■■■■■■■■■■■□
□■◆■■□☆□■■■■■■■□☆□■■■■■■■■■■■□
□■◆■■□☆□■■■■■■■□☆□■■■■■■■■■■■□
□●◆■●□☆□●■■■■■●□☆□●■■■■■■■■■●□
□□□□□□☆□□□□□□□□□☆□□□□□□□□□□□□□

部屋内部に通路が二つ以上ある場合は、それら通路を接続し、通路が一つしかない部屋には、単純に通路がある壁と反対方向の壁まで必須通路を延ばしてします。

部屋内部にも通路開通後、ランダム通路を作成したマップ自動生成例は次のようになります。

□□□□□☆□□□□□□□□□□□□□□□□☆□□□□□□□
□□□□□☆□□□□□□□□□□□□□□□□☆□□□□□□□
□□□□□☆□□□□□□□□□□□□□□□□☆□□□□□□□
□□□□□☆□□□□□□□□□□□□□□□□☆□□□□□□□
□□□□□☆□□□□□□□□□□□□□□□□☆□□□□□□□
□●■●□☆□□□□□□□□□□□□□□□□☆□●■■■●□
□■◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆■■■■□
□■◆●□◆□□□□□□□□□□□□□□□□☆□●■■■■□
□■◆■□◆□□□□□□□□□□□□□□□□☆□●■■■■□
□■◆■□◆□□□□□□□□□□□□□□□□◆◆◆◆◆◆■□
□■◆■□◆□□□□□□□□□□□□□□□□◆□●■■◆■□
□■◆■□◆□□□□□□□□□□□□□□□□◆□■■■◆■□
□■◆■□◆□●■■■■■■■■■■■■●□◆□■■■◆■□
□■◆■□◆□●■■■■■■■■■■■■●□◆□■■■◆■□
□■◆■□◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆□●■●◆●□
□■◆■□☆□●■■■■■■■■■■■■●□☆□□□□◆□□
□●◆●□☆□●■●◆●■■■■■■■■●□☆☆☆☆◆◆☆☆
□□◆□□☆□□□□◆□□□□□□□□□□□☆□□□◆□□□
☆☆◆◆☆☆☆☆☆☆◆☆☆☆☆☆☆☆☆☆☆☆☆□□□◆□□□
□□□◆□□□☆□□◆□□□□□□□□□□□☆□□□◆□□□
□●●◆●●□☆□□◆□□□□□□□□□□□☆□□□◆□□□
□■■◆◆●□☆□□◆□□□□□□□□□□□☆□□●◆●●□
□■■■◆◆◆◆□□◆□□□□●■■■■●□☆□□■◆■■□
□■■■■●□◆◆◆◆◆◆◆◆◆◆◆◆◆◆□☆□□■◆■■□
□■■■■■□☆□□□□□□□●■■■■■□☆□□■◆■■□
□■■■■■□☆□□□□□□□■■■■■■□☆□□■◆■■□
□■■■■●□☆□□□□□□□●■■■■■□☆□□■◆■■□
□■■■■◆◆◆◆◆◆◆◆◆◆◆■■■■■□☆□□■◆■■□
□●■■■●□☆□□□□□□□●■■■■●□☆□□●◆■●□
□□□□□□□☆□□□□□□□□□□□□□□☆□□□□□□□

[ FLASH ] [ tips ] 2007年04月15日 18:28 | コメント (2) | トラックバック

FLASH tips ローグライクマップ自動生成

ネットのどこかにすでにあるかもしれませんが、↓こちらのサイトのアルゴリズムを参考にローグライク(不思議のダンジョン)系マップ自動生成プログラムをAS2で作成しました。
http://racanhack.sourceforge.jp/rhdoc/intromaze.html (Racanhack コード解説)

コードファイル一覧はこちらです。
・サンプルファイル game.zip

■使用方法

import game.automap.*;

var am:AutoMap = AutoMap._instance; //インスタンス取得
am.init(); //初期化&マップ生成
am.traceMap(); //マップ状態をtrace出力

■実行時のtrace出力内容例

□□□□□□□□□□□□□□□□□□☆□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□☆□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□☆□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□☆□□□□□□□□□□□
□□□□□□■■■■■■■■■■■■■□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□■□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□■□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□■□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□■□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□■□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□■□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□■□□□□□□□□□□□
□□□□□□■■■■■■■■■■■□■□□□□□□□□□□□
□□□□□□□□□□□□■□□□□□■□□□□□□□□□□□
☆☆☆☆☆☆■■■■■■■☆☆☆☆☆■□□□□□□□□□□□
□□□□□□■□□□☆□□□□□□□■□□□□□□□□□□□
□■■■■■■■■□☆□□□□□□□■□□□■■■■■■■□
□■■■■■■■■□☆□□□□□□□■■■■■■■■■■■□
□■■■■■■■■□☆□■■■■■□☆□□□■■■■■■■□
□■■■■■■■■□■■■■■■■□☆□□□■■■■■■■□
□■■■■■■■■□■□■■■■■□☆□□□□■□□□□□□
□■■■■■■■■□■□■■■■■□☆☆☆☆☆■■■■■☆☆
□■■■■■■■■□■□■■■■■□☆□□□□□□□□■□□
□■■■■■■■■■■□□■□□□□☆□□□□□□□□■□□
□■■■■■■■■□☆☆☆■■☆☆☆☆□□□□□□□□■□□
□■■■■■■■■□☆□□□■□□□☆□□□□□□■■■■□
□■■■■■■■■□☆□■■■■■□☆□□□□□□■■■■□
□■■■■■■■■□☆□■■■■■□☆□□□□□□■■■■□
□■■■■■■■■□☆□■■■■■□☆□□□□□□■■■■□
□□□□□□□□□□☆□□□□□□□☆□□□□□□□□□□□

黒い四角(■)は キャラクターが通れる場所、白い四角(□)が通れない場所、☆は暫定的に表示させているもので 上記サイトにある処理時に必要となる区切り線です(白い四角と同じ通れない場所です)。

デフォルトでマップサイズが30x30、部屋の最小サイズが3x3となっています。変更したい場合は、AutoMap.initメソッドに引数を設定します。

処理の流れとしては、AutoMap.initメソッドを実行すると、TipListクラスのlistプロパティにTipクラスのインスタンスが二次元配列(30x30)で格納されます。横から5番目、縦から10番目のTipクラスを取得したい場合、AutoMap.initメソッド呼出し後、以下のように記述します。

var tip:Tip = TipList._instance.getTip(5, 10);

Tipクラス内には、自身が通行可能な場所なのか、通行不可能な場所なのかの情報が格納されています。

今回のサンプルは、全ての部屋が必ずどこかの部屋に接続されるだけのものとなっています。ここからマップ構造に面白みを出していくためにランダムで通路をどこかに繋げたり、敵やアイテムをランダム配置するような処理を組み込んでいくことになります。

ソースコード内のSingletonの使い方は間違っているかもしれませんが、その時はごめんなさい。

[ FLASH ] [ tips ] 2007年03月21日 14:08 | コメント (0) | トラックバック

FLASH tips Singletonパターンでのインスタンス受け渡し省略化

デザインパターンのうちの一つである Singletonパターンは「指定したクラスのインスタンスが一つしか存在しないことを保証したい」場合に用いる、と文献に書いてあります。Singletonを適用したクラスのインスタンスをnewで生成しようとするとコンパイラがエラーを出して知らせてくれる、というものです。この用途では、結構大規模なプロジェクトではないと Singletonパターンを利用することは無いかなあ、と当初は考えスルーしてしまっておりました。

しかし Singletonパターンを用いると「どのクラスからも直に Singletonパターンを用いたクラスのインスタンスを 取得する事が可能になる」という用途もあることに気づきました。


一つしかインスタンスを生成しないAというクラスがあり、クラスAの機能を利用したいBというクラスがあるとします。

クラスAに Singletonパターンを適用しない場合、クラスBは、どこかのクラスで一度生成されたクラスAのインスタンスを、引数経由で取得します。ここで、クラスBのインスタンスが Cというクラス内で生成され、クラスCはクラスAの機能をまったく利用しない場合、クラスCには クラスAのインスタンスをクラスBへ受け渡すための通路を用意する必要があり、クラスCには不必要なクラスAに関する記述を用意する必要がでてきてしまいます。

クラスAに Singletonパターンを適用する場合、クラスBは引数経由でクラスAのインスタンスを取得する必要がなくなります。ここで、クラスBのインスタンスが Cというクラス内で生成される場合、クラスC内にはクラスAに関する記述はまったく必要がなくなります。


Singletonパターンを用いた簡単な例は以下の通りです。AS3では Singletonパターンの記述がやや困難なものになるようなので AS2で記述しています。上記例で言うと、ControlクラスがA、PersonクラスががB、UserクラスがC、となります。Mainクラスが Controlクラス(A)とUserクラス(C)を生成するメインとなるクラスです。
PersonクラスがControlクラス内に設定された文字列を利用したい場合のプログラムです。


//メインクラス
class Main {

	//初めに呼び出される
	public function Main(){
		
		var ctrl:Control = Control.getInstance();
		ctrl.init( "test" );
		
		var user:User = new User();
	}
}

//A : Singleton適用
class Control {
	
	private static var instance:Control = new Control();

	private var str:String;
	public function get _str():String{ return this.str; }
	
	private function Control(){}
	
	public static function getInstance():Control{
		return instance;
	}
	
	public function init( str:String ):Void{
		this.str = str;
	}
}

//C : Bを生成するクラス
class User {
	
	public function User(){
		new Person();
	}
}

//B : クラスAの機能を利用するクラス
class Person {
	
	public function Person(){
		var ctrl:Control = Control.getInstance();
		trace(ctrl._str); //testと出力される
	}	
}

Singletonパターンを用いない場合、Controlクラスのインスタンスを Userクラスのコンストラクタに引数で受け渡し、UserクラスからPersonクラスのコンストラクタの引数へ Controlクラスのインスタンスを受け渡す、という記述になります。Userクラスでは Controlクラスの機能は利用しないのに Controlクラスに関する記述が必要になってしまいます。

■AS3でのSingletonパターン記述法
akihiro kamijo : コンストラクタ (と Singleton)

[ FLASH ] [ tips ] 2007年01月28日 16:11 | コメント (2) | トラックバック

FLASH tips AS3 パッケージ記述簡略化

testパッケージ内にFirstというクラスが存在する場合、Class(Object)クラスを用いると以下のような記述が可能です。

var cls:Class = test.First;
new cls();

また、flash.utils.getDefinitionByName を用いると 文字列からクラスを取得できるようです。

var str:String = "test.First";
var cls:Class  = getDefinitionByName(str) as Class;
new cls();


異なるパッケージに同名のクラスが存在し、そのパッケージのネストがとても深く、ソースコードが横長になってしまうのを避けたい場合等に利用できそうです。

例)

var a1:Class = tkus.player.attack.sword.normal.action.First;
var a2:Class = tkus.player.attack.sword.normal.action.Second;

var e1:Class = tkus.player.attack.sword.normal.effect.First;
var e2:Class = tkus.player.attack.sword.normal.effect.Second;

//○○○が どのactionパッケージ内のクラスかを判別し、
//○○○に対応するeffectパッケージのクラスを配列に設定する
var list:Array = new Array();
     if( ○○○ is a1 ) list.push( new e1() );
else if( ○○○ is a2 ) list.push( new e2() );


[注意点1]
上記例の tkus.player.attack.sword.normal.action.First クラスのコンストラクタに引数が必要な場合でも swf書き出しが通ってしまいます。実行時に初めて引数の数が異なる旨のエラーが検出されます。

[注意点2]
flash.utils.getDefinitionByName は存在しないクラスの文字列を引数に渡しても FlexBuilderのエディターや、swf書き出し時 コンパイラはエラーを検出してくれません。swf実行時に初めてエラーが検出されます。
仮に flash.utils.getDefinitionByNameの 引数で渡したクラスのパッケージ構造が後に変更されることを考える場合、swf実行時のエラー(ReferenceError)をキャッチし、その内容をログに書き出す作りを想定する必要があるかもしれません。

[結論]
厳密な仕様にする場合、使用は禁物


[ Adobe LiveDocs ]
Class
getDefinitionByName()

[ FLASH ] [ tips ] 2007年01月23日 12:49 | コメント (0) | トラックバック

FLASH tips AS3 フレームに配置したサウンドの音量制御

ActionScript3ではサウンド制御方法が色々変更されているのでメモ。
オーサリングでフレームに配置したサウンドの音量制御方法です。

サウンドを配置したMovieClipシンボルがSampleクラスにリンケージ設定されている場合、スクリプトは以下の通り。

package {
	
	import flash.display.Sprite;
	import flash.media.SoundMixer;
	import flash.media.SoundTransform;
	
	public class Sample extends Sprite {
		
		//ボリューム(0~1)
		public static const VOL:Number = 0.3;
		
		public function Sample() {
			
			var transform:SoundTransform = SoundMixer.soundTransform;
			transform.volume = VOL;
			this.soundTransform = transform;
		}
	}
}

Sampleクラスが Document class ならば、Sampleクラスに属する全てのクラスのフレームサウンドの音量がいっせいに0.3に設定されます。

[ FLASH ] [ tips ] 2006年11月26日 17:34 | コメント (0) | トラックバック

FLASH tips リアルタイム 縁取り

指定したSpriteクラス内の描画データ周囲1ピクセルに、指定カラーをリアルタイムで付与するスクリプトを作成(AS3)。
Bitmap.drawメソッドでは、コピー対象となるオブジェクトの負の座標に位置する描画データはコピーできないものかと思っておりましたが、第二パラメータにMatrixオブジェクトを指定すれば可能だったのですね。Helpにしっかりと書いてありました。

コピー対象となるSpriteオブジェクト(spr)の負のX座標 -10ピクセルまでコピーしたい場合、以下のコードでBitmapDataにdrawが可能となります。

var n:int = 10;
var m:Matrix = new Matrix();
m.translate(n, 0);
var bmd:BitmapData = new BitmapData( spr.width + n, spr.height, true, 0x00000000 );
bmd.draw( spr, m );

▽続きを読む

[ FLASH ] [ tips ] 2006年10月29日 00:10 | コメント (0) | トラックバック

FLASH tips FlashLite2.0 W43Sでの検証2

引き続き auの W43S で性能検証。
ピンボールゲームのために作成したライブラリを用いて、直進するボールを反射させる動作のみを行うシンプルなFlashを作成し検証しました。

・Stage.scaleMode = "noScale" が使用可能

ドット絵Flashを用いる人には万歳といったところでしょうか。
今回の作成したFlashはステージサイズ200x200ピクセルで作成しましたが、Stage.scaleModeを設定することにより中心のドットのキャラクターが広がったりすることはありませんでした。

・速度

今回のFlashの速度は 24fps で書き出しましたが実機では体感 12fps 程度の速度となりました。
衝突と反射を行うライブラリはそこそこ処理が複雑になっているので、さらにシンプルなゲームならばもっと早い速度が出ると思われます。試しに反射処理は行わせず、X軸のボール移動のみ行わせたら 24fps 程度になりました。

速度はある程度がまんすれば、いままでより面白いFlashLiteゲームがどんどん作成できそうです。パズルゲーム等、今までは泣きながら作成してきましたが、FlashLite2.0が主流となれば容易く量産できそうです。
Docomo903iではFlashLite2.0は採用されなかった模様なので、無念で仕方がありません。

imode Flash対応端末の情報
http://www.nttdocomo.co.jp/service/imode/make/content/spec/flash/
一番下の欄に発売された(?) SH903i の項目があります。

今回の検証用に作成したFlashはこちら↓

▽続きを読む

[ FLASH ] [ tips ] 2006年10月22日 00:27 | コメント (0) | トラックバック

FLASH tips FlashLite2.0 W43Sでの検証

今までFlashLite2.0用に作成してきたピンボールゲームを au の W43S で動作検証。
PC上で動作するイメージで そのまま動いたらすごいだろうなあとワクワクしていましたが、案の定エラーが発生しゲーム起動すら行われませんでした。

少しずつソースをコメントアウトしつつ ようやく動作するようにまでこぎつけましたが、処理速度はヘロヘロで体感10fpsも出ていません。処理軽減を考えて制作してきましたが、これではちょっとピンボールゲームと呼ぶには厳しいですなあ。まともな速度を出すにはもっともっとシンプルな内容にしなくてはならなそうです。現在製作中のピンボールゲームは当面PC専用となりそうです。

今回わかったことは以下の通り。

・1フレーム内での処理つめこみすぎでエラー発生

PCのFlashLiteエミュレータでは問題ない 1フレーム内での処理行数でも、携帯端末のFlashLiteプレイヤーではエラーが発生する場合があるようです。どれくらいの処理行数でエラーが発生するかは端末によって異なると思います。エラー発生を防ぐにはフレームをまたいで処理を分割する必要がでてきそうです。MovieClip.onEnterFrameを織り交ぜたりせねばならなく面倒なことになりそうです。

・ビットマップ画像多様による画像赤色化現象は今までのFlashLiteと同じく起こる

W43S上で確認してみたところ、背景画像が真っ赤になってしまっていました。ビットマップ画像の多用は禁物。ベクターデータを使いましょう といったところでしょうか。おいどんはドット絵のビットマップ画像を多用したいんだ!


今後はもう少しシンプルなスクリプトで、どれほどの速度がでるのか検証したいところです。今回の結果は少しがっくりでしたが、全てActionScript2.0で書いたFlashが携帯端末上で動作したという点に関してはうれしいものです。

以下は最新版のピンボールゲーム。PC上でしか動作しません。

▽続きを読む

[ FLASH ] [ tips ] 2006年10月10日 19:47 | コメント (0) | トラックバック

FLASH tips update 軸測投影4 軸回転

FLASH tips Spriteクラスのインスタンス名はどうしよう

ソースコードをガリガリ書いていて引っかかりました。

AS3では MovieClipよりも多く使用するかもしれない Spriteクラス。
今まで MovieClipのインスタンス名はよく「mc」とすることが多かったのですが、Spriteクラスのインスタンス名はどうしたらよいものか。「sprite」では「mc」に比べちょっと長い気もします。いい名前はないものでしょうか。ただの「s」ではわかりにくいですよね。「st」かなあ…

また、MovieClip名には gameMC といった具合に MC を大文字でつけていました。マクロメディア推奨は game_mcといった具合にするのでしたっけ。SpriteシンボルがFlashオーサリング上で作成できるようになった時、どのような名前がメジャーになるのですかなあ。

[ FLASH ] [ tips ] 2006年08月29日 22:01 | コメント (0) | トラックバック

FLASH tips ActionScript3 as演算子

ActionScript3から使用可能な as 演算子。
括弧でくくる記述で利用してみました。

var list:Array = [ new Sample(1), new Sample(2), new Sample(3) ];
trace( (list[0] as Sample).x );

//Sampleクラスの内容
package{
	class Sample{
		public var x:Number;
		public function Sample( x:int ){ this.x = x; }
	}
}

通常list内の0番目の要素のプロパティxの値を取り出したい場合、次のような二行になります。

var s:Sample = list[0];
trace( s.x );

本当は以下のように一行にすっきりとまとめたいところですが、

trace( list[0].x );

これでは仮にSampleクラスのプロパティ x の変数名が、nx という変数名に変更されたとしても、コンパイラやソースエディタ(FlexBuilder2)はエラーを検出してくれないため、バグの元になる可能性があります。

ここで、一行で記述ができ、コンパイラがエラー検出もしてくれる as 演算子が役に立ちました。

trace( (list[0] as Sample).x );


ただしfor文で配列内の要素全てを回して利用する、といった場合、同じくActionScript3から使用可能な for each文を用いたほうが見栄えがよしなので、使いどころは限られてきそうです。

//for文
for( var i:int=0 ; i < list.length ; i++ ) trace( (list[i] as Sample).x );

//for each文
for each( var s:Sample in list ) trace( s.x );

・as 演算子についてはこちら

akihiro kamijo
http://weblogs.macromedia.com/akamijo/archives/2006/01/_as.cfm

[ FLASH ] [ tips ] 2006年08月28日 19:32 | コメント (2) | トラックバック

FLASH tips update 軸測投影3 ボックス

ボックス状に面を作り、そこにテクスチャをぺったんこ。

▽続きを読む

[ FLASH ] [ tips ] [ update ] 2006年08月28日 01:07 | コメント (0) | トラックバック

FLASH tips update 軸測投影2 テクスチャ

適当な面を作成し、そこにビットマップを貼り付け。

▽続きを読む

[ FLASH ] [ tips ] [ update ] 2006年08月27日 18:23 | コメント (0) | トラックバック

FLASH tips update 軸測投影

まずは、スクリプトで線を引くだけの軸測投影のサンプルを作成。
3D表現は計算量が多いからActionScript3ならば早く表示できるのではないかと考え、勉強がてらFlash9にて製作。
軸測投影は透視投影とは違い奥行きがありません。
クォータービューということもあり、今後団子一味のゲームに生かせそうです。

▽続きを読む

[ FLASH ] [ tips ] [ update ] 2006年08月27日 11:48 | コメント (0) | トラックバック

FLASH tips update 透視変換2 高さ

透視変換処理に高さの概念を追加。

▽続きを読む

[ FLASH ] [ tips ] [ update ] 2006年07月29日 18:51 | コメント (2) | トラックバック

FLASH tips update 透視変換 再勉強

1年くらい前に練習として制作した透視変換処理を再度見直しライブラリ化。

▽続きを読む

[ FLASH ] [ tips ] [ update ] 2006年07月27日 10:20 | コメント (2) | トラックバック

FLASH tips ActionScript3 PngEncoderクラス,JPEGEncoderクラス を用いてステージデータ画像化

せっかくActionScript3を勉強するならば、ActionScript3でのみできることを行うべきだ、というわけで、ActionScript2まででは結構大変だった swf画面の画像化を実装。
海外で公開されている、PngEncoderクラス または JPEGEncoderクラス を用いて実現します。

▽続きを読む

[ FLASH ] [ tips ] 2006年07月11日 00:11 | コメント (1) | トラックバック

FLASH tips ActionScript3勉強 事始め 手動で配置したステージ上のMC制御

Flash 9 Public Alpha と Flex Builder 2 を利用してAS3を勉強開始。

ネット上のAS3のサンプルを見てみるも、Flash 9のライブラリ内にあるMovieClipを動的に配置(addChildメソッドを利用)するサンプルはあるものの、手動でステージ上に配置したMovieClipの制御方法がわからず少々てこずりました。

解決までの悩んだ経路

1.お約束の Hello World! のみを表示する Sample.as ファイルを作成
2.Flash 9 上で「Document class」として「Sample」クラスを設定
3.パブリッシュしてみて Hello World! が表示されることを確認
4.Flash 9 上で適当な MovieClip を作成しステージ上に配置
5.配置した MovieClip のインスタンス名を mc と設定
6.パブリッシュしてみると以下のエラーが表示

ReferenceError: Error #1056: Sample のプロパティ mc を作成できません。
	at flash.display::Sprite/flash.display:Sprite::constructChildren()
	at flash.display::Sprite$iinit()
	at Sample$iinit()

7.小一時間悩む
8.Sample.as内のプロパティフィールドに次の一行を記述

public var mc:MovieClip;

9.パブリッシュが通る
10.Sample.as内から ステージ上に配置した mc を制御可能に

ううむ、なるほど。今までAS2では、MovieClipを継承したクラスを作成したことがなかったため、この発想はありませんでした。この仕様のおかげで、よりいっそう厳密にプロパティ管理が行え、安全なコーディングが可能になりそうです。

どうしてもソースコード内のプロパティに一々ステージ上のMovieClipのインスタンスを宣言するのが面倒という場合は、Sampleクラスをダイナミッククラスにすればよいようです。プロパティとして mc を宣言していなくても、Sampleクラス内では mc インスタンスを制御できるようになります。但しコンパイル時のチェックが甘くなるので注意。

参考 akihiro kamijo
dynamic クラス

[ FLASH ] [ tips ] 2006年07月10日 15:29 | コメント (0) | トラックバック

FLASH tips update ピンボール作成3 複雑な地形の仮背景組み込み

暫定的に複雑な地形の背景を組み込んでみました。
ピンボールゲームらしく動作するかどうかの検証用です。

▽続きを読む

[ FLASH ] [ tips ] [ update ] 2006年05月23日 23:24 | コメント (0) | トラックバック

FLASH tips ピンボールバーの処理 ボールがバーの裏表どちら側に衝突したか外積を用いて調査

以前作成したピンボールバーのサンプルにまだもろもろバグがあるようで、そのバグの原因を解決するために、ボールがバーの裏表どちら側に衝突したかを調べる必要がでてきました。
ボールがバーの裏表どちら側に衝突したかを調べるには、ベクトルの外積の性質を利用します。

▽続きを読む

[ FLASH ] [ tips ] 2006年05月19日 00:30 | コメント (0) | トラックバック

FLASH tips update レーザー状に反射 鋭角~鈍角頂点での反射

レーザー状に反射を行う処理で 複数の衝突対象オブジェクトが一点で交わっており、その一点にボール軌道が重なった場合、いらぬ方向に跳ね返ってしまっていたバグを修正。

▽続きを読む

[ FLASH ] [ tips ] [ update ] 2006年05月14日 19:29 | コメント (0) | トラックバック