やわらかボール

剛体を動かすにはもうBox2Dのような物理エンジンを使えばいいので、何か自分で動かすならやわらかいものかな、でも布とかメタボールとかもう皆やってるしなーとあれこれ考えていたところ、ローテクなやわらかボールを思いついたので作ってみました(というか自分ローテクしか無理)。たぶん意外となかったタイプ。

ばね法則でボールをやわらかく反射させつつ、ボールと壁、またはボール同士の距離によって見た目を変形させてます。ここまで単純化すると2点以上に同時に接触した場合に対処できないので、どうなるか心配だったんですが、ぎりぎり許容範囲? ボールの数が多いとさすがにエラーが目立つ感じです。

2009年6月4日

格ゲーコマンド入力判定


対戦格闘ゲームの必殺技コマンド入力の実験をしてみました。カーソルキーまたはテンキーでレバー、スペースキー・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日

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

はてなブックマーク
wonderfl