関数で数値を動かす

多忙で大分長く空きました。すみません。

ゲーム製作において、数値というものは欠かせない。キャラクターの位置、吹っ飛びパワー、ダメージの計算、経験値テーブル。それらは何千個もの配列を使えば一切の数学的要素を排除したまま構築できるが、流石にそんなことをしていては埒が明かないので幾つかの数式を使って賢い数値の設定を行うと良いかもしれない。
本記事ではそのサンプルを幾つか載せる。

等速増加

y = n * x;

基本。いわゆる等速直線運動。物体を一定のスピードで移動したかったり、Levelに比例して攻撃力を上昇させたかったりする場合に使用する。dx(d=delta)を用いて計算することもある。

y += dy; // 一フレームごとにyをdy分プラス

加速増加

y += dy;
dy += 1;
// 或いは
y = x^n;

段々と加速していく。前者はいわゆる等加速度直線運動。ジャンプ時の軌道など。dyの値を一定に制限することで、落下速度制限を作ることが出来る。余談だが、落下速度制限が緩かったり存在しないアクションゲームは比較的操作性が悪くなる。
後者の関数はnの値次第でかなり勢いよく数値が伸びていく。

指数関数的増加

y = n^x;

加速増加の二番目と似ているが数値の変化曲線が微妙に違う。この関数を使うと、「xが10→20でyが10倍、xが20→30でyが更に十倍」という式を作ることが出来る。x^nと違って繊細な増加が出来るため、経験値テーブルの作成などに適している。
ちなみにIncubatorの得点計算にはこれを利用しているため、少女やワルプルギスのレベルが上がるとスコアが恐ろしい増加を見せる。

減速増加

y += (n - y)/10.0;  // (1)
y = sqrt(x);        // (2)
y = log(x);         // (3)
y = 10-10/x;        // (4)

特定の地点でぴたりと止まらせたり、xがある一定まで増加すると後はyを緩やかに増加させたりしたい時に用いる。(1)はnの値でぴたりと止まる。(2)はかなり急なカーブを描くが、sqrt(平方根)は重いのであまり使わない。(3)は緩やかな曲線を描く。(4)はxが10を越えると反転するため、xの範囲に気をつける必要がある。(x=1の時、y=0)

跳ねる

y = abs(n*sin(x/k));

跳ねる。sinカーブは上行ったり下行ったりと忙しいグラフだが、マイナスが丸ごとプラスに反転するため、跳ねるような軌道のグラフが出来上がる。弾道や雑魚敵の挙動に。
単調増加による制御と違い、高さや速度を設定することが容易。

特殊減速減少

y = 1.0 / 2.0^(x/100);

とあるプログラムで使用した計算式。xが100の時にyは丁度1/2になる。また、0の時に1となる。キモはxがどれだけ大きくなっても、yが0にならないということである。幅広いxでyを絞りたい時に。ちなみに拙プログラムではx=関税として輸入量を策定する計算式として使っている。

揺れ

x -= ShakeX;
y -= ShakeY;
ShakeX *= -0.8;
ShakeY *= -0.8;
x += ShakeX;
y += ShakeY;

ShakeX, ShakeYに適当な値を入れるとブルブルと震えてくれる。揺れは段々収まり、やがて0になる。画面全体の位置にx,yをかませると、ゲーム内の衝撃で画面を揺らすことが簡単に出来る。

シャープな変化

value = input01 / input02;
value = pow(input01,3.0) / pow(input02,3.0);

オマケ。input01とinput02の差によって何らかの効果を生ませたい時(ダメージ計算式などに使う)、それぞれの値を累乗することによって変化をよりシャープにすることが出来る。累乗を用いる場合、二つの値が同じなら結果が1になることを維持できるため、制御が容易い。また、いずれかのinputはそのまま使ったりするとより面白い変化を見込むことができる。