スポンサーサイト

.-- -- スポンサー広告 comment(-) trackback(-)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ActionScript最初の一歩(3)

.06 2010 ActionScript comment(0) trackback(0)
無事情報数学の試験も終わって今日からしばらく開発に専念できそうです。

とかいいつつも今日はあんまりやる気が起きないんですね~

やる気がないときはActionScriptみたいに開発環境からデバッグ環境から何から何まで整備されているもので遊んで何かを作った気分になっているのが一番幸せなんだろうな~ というわけで今日はActionScriptで遊びます。

あ~ゆとり世代はこれだからw

今日の目標はキーボードの状態を取得すること。マウスは…必要になったらそのときに調べます。
キーボードに関してFlashが普通のWindowプログラミングと違うところは「キーボードの状態を取得する関数」が用意されていないことです。
Win32APIには確かGetAsyncKeyStateみたいな関数があって、それを呼び出せばその時点でのキーの状態を取得できました。
が、ActionScriptでは、キーが押されたときと離されたときにイベントハンドラが呼ばれるように設定して、キーの状態を格納する変数の値を書き換える必要があります。面倒ですね。
さらに面倒なのはFlashはフォーカスを失うとキーが離されてもイベントハンドラが呼ばれないため、フォーカスを失ったときにキーが離されたことにしないとずっと押しっぱなしになっているように見えてしまうことです。
そんなわけでキーボードの処理に必要なコードはこんな感じ。
/* 変数、定数 */
	private const KBD_NUM: int		= 1;
	private const KBD_RIGHT: int	= 0;
	private var keyState: Vector.<int>	= new Vector.<int>(KBD_NUM, true);
	
/* initに記述 */
	stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownProc);
	stage.addEventListener(KeyboardEvent.KEY_UP, keyUpProc);
	stage.addEventListener(Event.DEACTIVATE, deactiveProc);

/* Event Handler */
private function keyDownProc(event: KeyboardEvent): void
{
	if (event.keyCode == Keyboard.RIGHT) {	// right
		keyState[KBD_RIGHT] = 1;
	}
}

private function keyUpProc(event: KeyboardEvent): void
{
	if (event.keyCode == Keyboard.RIGHT) {	// right
		keyState[KBD_RIGHT] = 0;
	}
}

private function deactiveProc(event: Event): void
{
	// clear all key state
	for (var i: int = 0; i < KBD_NUM - 1; i++) {
		keyState[i] = 0;
	}
}

ArrayよりもVectorの方が高速ってことで今回はVectorを使ってみました。が、VectorはFlashのバージョンが10以上でないとサポートされていないとかで普通にコンパイルしようとしたら文句言われました。
なのでFlashDevelopの設定でオプションに
-target-player=10
ってのをつければctrl + F6でいけるはず…なのですが、
良く分からないけどエラーが消えなかったです。
なので諦めてコマンドプロンプトから
mxmlc -target-player=10 test_timer.as

さすがにこれなら文句はないようです。
というわけでキーボードがらみの使い方が分かりました。今日は以上。

土日はもう少しましなことをやります。
スポンサーサイト

ActionScript最初の一歩(2)

.03 2010 ActionScript comment(0) trackback(0)
今回はタイマーです。
タイマー処理の方法はいくつかあるようですが、一般的なのはTimerイベントを使う方法。ただし、この方法はあまり良くないようです。理由は次の通り。
  • 実際に呼び出される間隔は (Timerで指定した時間) + (イベントハンドラで処理にかかった時間) になる。
  • 実際に描画される間隔(画面が更新されるタイミング)はフレームレートによって決まる。すなわちWindowsのInvalidateRect的なもので強制的に再描画させることはできない。
そうするとフレームレートにあわせて呼んでくれたらなーと思うわけです。
そんな時の強い味方ENTER_FRAMEイベント。
コンストラクタに
addEventListener(ENTER_FRAME, func);
と書くだけでフレーム毎にfuncを呼んでくれます。
フレームレートは先日紹介した方法で指定できます:
	[SWF(width="300", height="200", backgroundColor="0xFFCC00", frameRate="24")]
早速タイマー処理を使って簡単なフラッシュを作ってみました。
test_timer
それではスキー行ってきます。

ActionScript最初の一歩(1)

.31 2009 ActionScript comment(-) trackback(0)
ゲームを作ろうと思ったときに最低限必要なことはだいたい次のようなことではないでしょうか。
  • 画像ファイルを表示する
  • キーボードやマウスの状態を取得する
  • タイマーを設定する
  • ファイルの読み書きをする
  • 音声ファイルの再生
逆に言えばこれだけできればマリオみたいなアクションゲームは作れそうです。 そもそもActionScriptを始めようと思ったきっかけはActionScriptでActionGameを作りたくなったことなのでこれだけできれば自分としてはとりあえず満足です。

秋のうちに開発環境は整えていたので今日は上に挙げたもののうち画像周りを制覇することを目標にいろいろ調べてみます。

その前にコンパイル方法。忘れてたのでメモ。
FlashDevelop統合開発環境の場合、ctrl-F8。コマンドラインからなら
% mxmcl hoge.as
でコンパイルできます。


いよいよ本題。
画像を読み込んで表示する
package
{
	// import宣言省略

	public class test_bmp extends Sprite
	{
		public function test_bmp(): void
		{
			init();
		}
		
		private function init(): void
		{
			var loader:Loader = new Loader();
			var request:URLRequest = new URLRequest("CharA.png");
			loader.load(request);
			addChild(loader);
		}
	}
}

ここで使っているLoader、非常に便利なのですが、AS3から導入されたのだそうです。
注意:この方法ではbmpファイルは読み込めないようです。今回はpngファイルを使いました。

デバッグしてみるとFlashPlayerが勝手に伸縮をかけてきて画像が微妙に変になったので次を追加。コンストラクタの頭にでも書いておけばよさそうです。
stage.scaleMode = "noScale";

これで自動伸縮をoffにしています。
あとはこれをhtmlで読み込む方法:
<embed src="test_bmp.swf" type="application/x-shockwave-flash" width="300" height="200">

それからもう一つ。ActionScriptでflashの幅、高さを指定する方法:
[SWF(width="300", height="200", backgroundColor="0xFFCC00", frameRate="24")]

こんなメタタグをimportの後に書いておくといいようです。


次は画像をフラッシュに埋め込んでそれを表示するようにします。

package
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	
	[SWF(width="300", height="200", backgroundColor="0xFFCC00", frameRate="24")]
	
	public class test_bmp2 extends Sprite
	{
		[Embed(source='CharA.png')]
			private var Image0 : Class;
		public function test_bmp2(): void
		{
			stage.scaleMode = "noScale";
			init();
		}
		
		private function init(): void
		{
			var charBmp: Bitmap = new Image0();
			addChild(charBmp);
		}
	}
}

画像をフラッシュに埋め込むにはEmbedメタタグを使えばいいんですね。(ってかこっちの方がLoadしなくていい分楽ですね。)

続いて画像をコピーするときに背景色を透過するようにします。
initをこんな感じにするとうまくいきました。
private function init(): void
{
	var charBmp: Bitmap = new Image0();
	var bk: BitmapData = new BitmapData(300, 200, true, 0);
	var pt: Point = new Point(0, 0);
	var rc: Rectangle = new Rectangle(0, 0, 244, 192);
	bk.threshold(charBmp.bitmapData, rc, pt, "==", 0x003200c8, 0xffffff, 0xffffff, true);
	var charBmp2: Bitmap = new Bitmap(bk);
	addChild(charBmp2);
}

では最後に画像の一部分を取り出してきて好きなところにコピーする方法。ここまでできればBitBlt相当のことができます。
private function init(): void
{
	var charBmp: Bitmap = new Image0();
	var bk: BitmapData = new BitmapData(300, 200, true, 0);
	var pt: Point = new Point(0, 0);
	var rc: Rectangle = new Rectangle(0, 0, 244, 192);
	charBmp.x = 100;
	charBmp.y = 10;
	bk.threshold(charBmp.bitmapData, rc, pt, "==", 0x003200c8, 0xffffff, 0xffffff, true);
	var charBmp2: Bitmap = new Bitmap(bk);
	
	var disp: BitmapData = new BitmapData(300, 200, true, 0);
	disp.draw(charBmp2, null, null, null, new Rectangle(32, 32, 32, 32), false);
	
	var dispBmp: Bitmap = new Bitmap(disp);
	dispBmp.x = 100;
	dispBmp.y = 30;
	addChild(dispBmp);
}

ひとつ気になるのがメモリの解放。普通のWindowプログラミングでは最後にBtimapを解放したり、 newで作ったオブジェクトに対してはdeleteで解放したりしますがASの場合はどうなんでしょう。
GCがちゃんと機能してくれるなら確かに手動で解放する必要はないんですが本当に大丈夫なんでしょうかね。

とにかくこれでActionGameで最低限必要な画像処理ができるようになりました。

長くなってきたので一旦ここで切ります。 # 諸事情によりこの記事へのコメントは無効にしています。
 HOME 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。