TOPハル研ブログプログラムで表現するゲームの気持ちよさ

ハル研ブログ

仕事内容プログラムで表現するゲームの気持ちよさ

2013年03月13日:住友

こんにちは。ゲームプログラマーの住友です。

私たちゲームプログラマーが普段どのように考えてゲームプログラムを作っているのか。一般的なゲームを例にして、ちょっと紹介したいと思います。

まずは方向キー2回入力。ダッシュなどをするときに、よく使いますよね。

この2回入力判定、何も考えずにプログラムしてしまうと、なかなかダッシュができない、といった症状に悩まされることになります。
判定がすごくシビアになってしまうんです。

プログラムが行う入力チェックは厳密です。一方でユーザーが行う入力はとてもファジー。2回入力したという意思はあるのだけれど、実際には2回キチンと入力できていないことが多いのです。

このままではとてもストレスがたまるゲームになってしまいます。
ではどうすればいいかというと、プログラムの判定側もファジーにすればいいのです。

たとえばこんなかんじ。

★ 同じ方向を2連続で押されたか、ではなく方向キーが「離されてから」同じ方向キーが一定時間内に押されたかどうかを見る。(1度目の押されるタイミングは見ない)

★ 2回方向キーが押された時、2度目に押されたのが左右キーだった場合、状況によっては1度目の方向キーが上下キーであっても、誤入力かもしれないと判断して、2回同じ方向キーが押されたとみなす。

ユーザーが「実際にどういう入力をしたか」ではなく、ユーザーが「実際にどういう入力をしたかったか」を推測して、ちょっとしたミスがあっても気づかせないぐらいの工夫をします。

遊び手の立場に立って、その気持ちを反映させるのはゲームプログラムにとって、とても大事なことですよね。

つぎに「ジャンプ」について。
キャラクターがジャンプすると、放物線の軌道を描いて、ある陸地からある陸地へと移動します。このプログラムを普通に書くと、初速を与え、Y軸方向に重力加速するような式になると思います。
これを実際にやってみると、予想に反して、非常にもっさりとした動きに見えます。(ほんとは合ってるのに!)

頭にある落下挙動のイメージと物理法則が合致していないのです。もっとゆっくりな部分はゆっくりと加速していくところはぐぃーんと加速していく感じがほしいのです。気持ちのいいイメージというのは、現実世界の動きをもっと誇張した感じなのです。

たとえばこんな式が考えられます(あくまで一例)

float t; //経過時間 ( 0.0 -> 1.0 )
Vec3 nextPos; //次に設定される座標
Vec3 firstPos; //動作開始した座標
Vec3 targetPos; //目標位置
float height; // ジャンプの高さ
float distortion; // 曲線のゆがみ

nextPos = firstPos + ( targetPos - firstPos ) * t;
nextPos.y += ( 1.0f - ( ( 1.0f - sin( PI * t ) ) ^ distortion ) ) * height;

所要フレーム数と到達する高さの調整を容易にしつつ、ジャンプの軌道を誇張するような動きをする計算式です。高さの変化をsinカーブの組み合わせの計算に任せてしまうものです。
ユーザーからの操作の介入がない、敵キャラクターなどの動きではこのようなカーブの計算式で十分だったりします。

キャラクターを動かすプログラムでは、ときに自然法則を無視して気持ちよさを追求する、ということをよく行います。一番大事なのは、どのような動きがほしいかという最終目的の具体的なイメージを頭の中に作り出すこと。物理法則がそのイメージに合わないのであれば、その法則を捻じ曲げます。ゲームプログラマーは、ゲームの中でそのシチュエーションでしか通用しない「オレ物理」を日夜研究しています。

ユーザーの操作の意図が汲み取れていなかったり、イメージと違っていて「なんかこの動き、気持ち悪いなぁ」と思わせたりすると、肝心の、ゲームの中核となる要素を楽しんでもらうことが難しくなってしまいます。

プレイしてもらうからには、余計な部分に気を取られずに楽しんでもらいたいもの。ユーザーの気持ちを思い浮かべながらちょっとした工夫を積み重ね、どんどん良くなっていくのを感じられる、自分でも遊んでみたくなるゲームに仕上がっていく。これがゲームプログラム制作の醍醐味です。

触り心地、気持ちよさの追求に終わりはありません。今後もコツコツ突き進んでいきたいと思います。

タグ:
プログラマー