格ゲーコマンド入力判定


対戦格闘ゲームの必殺技コマンド入力の実験をしてみました。カーソルキーまたはテンキーでレバー、スペースキー・Ctrlキーでパンチボタン、Shiftキーでキックボタンです。技の名前は気にしない方向でひとつ。

判定方法は、リングバッファに過去一定フレームの入力状態を蓄積して、バッファに各コマンドのパターンが含まれているかどうかを毎フレームチェックしています。

いろんな種類のコマンドを、できるだけ簡単なスクリプトひとつで検出できるよう考えてみたんですが(コナミコマンドも大丈夫!)、実際のゲームで汎用的に使えるかどうかは自信がないです。たぶん何か不都合が出てくると思う。そうでなくても、たとえば溜めコマンドなら、溜めはじめた時点でモーションを移行したりする必要が出てくるでしょうし。

Warp Smashにしょーもないバグを発見。あとでこっそり直しておこう……。

2009年5月20日

Warp Smash


どこかの絵を見て連想したので作ってみました。いわゆるポンのバリエーションで、マウスクリックでパドルが反対側にワープします。せっかくなので、BlurFilterを使ってパドルにモーションブラーをかけてみたりしました。

パドルをボールに合わせるのに加えて、パドルを早く反対側に移動させないとボールが返しにくい、でも早くクリックしすぎても駄目というタイミングゲームにもなっているのがミソかなと勝手に思ってます。だいたいゲームというのは、アクションにせよ何にせよ、プレイヤーに2つ以上のことを同時にさせると面白くなるんじゃないかと。1つだとどうすればいいかすぐ分かってしまうので。

ただ、マウスカーソルがFlashからはみ出さないように頑張るという不自然な3つ目が出てきてしまって微妙。マウスカーソル自体邪魔だし、ブラウザゲームでは、マウスが使えるといってもネイティブアプリケーションと同じようには扱えないってことでしょうか。

今日活躍のプチ関数。

private function clamp(n:Number, min:Number, max:Number):Number {
	if (n < min) { n = min; }
	if (n > max) { n = max; }
	return n;
}

スコアのカンストつき加算にまで乱用してたり。

 
score = clamp(score + 1, 0, 9999);
 

作る前は100行ゲームを意識してたんですが、こういうのが好きな体質なので無理っぽいです……。

2009年5月11日

気体のような何か

gas10000

wonderflのパーティクル祭りがすごいことになってるので急遽制作。マウスでピストンを動かして圧縮したりできます。物理的ツッコミはなしの方向で……。

2009年4月17日

うごく三角形トリック


Tweenerの練習がてら、有名な三角形トリックをアニメーションさせてみました。けど、こうやって動かすとバレバレになってしまうかなー。

配色や線の太さなどがなかなか決まらなくて、かなり無駄なリビルドを繰り返しました。これくらい簡単な絵でも、最初にきちんとスケッチしたほうがいいようです。僕の場合。

で、Tweener面白いですね(いまさらすぎる。何周遅れだろう?)。正直、ウェブでぼーっと眺めていた限りでは、こんな処理をライブラリ化する必要があるんだろうかと首を傾げてたんですが、簡単なシーケンスも組めるし、ベジェ曲線やスプライン曲線でも動かせるし、何より動きを試すコストがぐっと下がるのが大きいです。なるほど、Flasherの人たちはこれで心地よい動きをさくさく作ってたのか、と納得。

簡単そうなことが実は意外に重荷になっていて、さらに簡単にすることで大きな利益が得られるようなことがあるのかもしれないなと思いました。その系統だと、例えばこういうプチ関数が好きなんですが、どうでしょうね。

// [n, m)の乱数を取得
function random(n:Number, m:Number):Number {
	return n + Math.random() * (m - n);
}

// 自乗を取得
function square(n:Number):Number {
	return n * n;
}

// nを[s0, s1]から[d0, d1]に変換
function linearTransform(n:Number, s0:Number, s1:Number, d0:Number, d1:Number):Number {
	return (d0 + (n - s0) * (d1 - d0) / (s1 - s0));
}

インライン最適化のないActionScriptだとちょっと使うのをためらいますが。

2009年4月1日

Flash 10でPS2の花火デモ

wonderfl初投稿。パーティクル&モーションブラーな花火です。

firework1

元ネタはPS2が出たときのこれ。

この花火デモ、洗面台のアヒルと並んで人気でしたけど、難度は一番低いですよね。MSが対抗意識丸出しでXboxでも似たようなデモを出してきたり、DirectX SDKのサンプルにも入れてきたりして、当時ちょっと面白かったです。

Flashについてですが、直径0?16ピクセルでプリレンダリングしたパーティクルをBitmapDataにcopyPixelsで描画してフレームを作成し、drawで加算半透明で10枚合成してモーションブラーをかけています。最初はパーティクルをShapeやBitmapDataのdrawで描画していたんですが、案の定ものすごく遅かったのでcopyPixelsに置きかえました。アンチエイリアスがかからないので描画品質は落ちますが、7倍くらい速くなってます。copyPixelsだとパーティクルの重なりで加算合成ができませんが、そこはモーションブラーで明るくなってくれるだろうと。

ちなみにマウスをぐりぐり回すとブラーで楽しいです。こんな感じ。

firework2

火花の照り返しは、テクスチャにdrawで適当なサイズとアルファで描画して、床ポリゴン2枚に貼りつけています。Flash 10ではパースペクティブ補正つきでポリゴンが描画できるので、普通に火花と描画位置がぴったり合うのが嬉しいところです。

また、座標変換にFlash 10で新しく追加された3Dベクトル・行列クラスを使用しています。wonderflのおかげでこのAPIの存在を知りました。ただ、このAPIについてはかなり独特の癖やバグがあったり、Flash Playerがクラッシュしたりして(まさにCrash Playerってやかましい)、あれこれ調べまわるはめに。せっかくなので、これまで分かったことについて後でまとめてみるつもりです。

あと、ActionScriptの最適化で気づいたポイントですが、アクセサ(set、get)はあくまで関数だということ。APIのプロパティにアクセスするときなど、つい普通の変数を読み書きしているつもりで、遅い関数呼び出しをしてしまっていることに気づきにくいので要注意だと思いました。そのあたりをチェックしたら描画込みであっさり倍以上速くなったりしています。他にもいろいろチューニングして、それでもCore 2 Duo E8500-3.16GHz機で1フレームに20ミリ秒ほどかかってますが……wonderflを見るような人なら大丈夫でしょう、たぶん。

それと、wonderflのコードがうまく埋め込めない感じなんですが、他のブログでも同じ表示になってるみたい? 一時的なものなんでしょうか。

2009年1月17日

トップページ
プロフィール

はてなブックマーク
wonderfl