イージングの実装

近年作ったプログラムパーツの中で、タイマーほど役に立ったものはないだろう。
まあ、大抵の人は、作っているんだけど…(苦笑

簡単にいうと、

Timer mTimer = new Timer(2.0);

と作成しておき、

float r = mTimer.getRate();

とすると、生成から2秒間で、0.0 ~ 1.0 まで自動的に変化する値が取得できるというもの。
(機種・環境によっては、自分で経過時間:elapsedTimeを加算することが必要)

少しつけ加えて、

Point pos = mTimer.getRate(startPos, endPos);

とすると、カーソルが開始座標から、目標座標まで動くようにできる。
この辺り、昔はラインアルゴリズムというのを使っていた。
ラインアルゴリズムの考案者(?)は、著書で、シューティングの敵弾の軌道にも使えると言っていが、実際には使えない。

もともとラインアルゴリズムは、
「開始座標から終了座標まで、一ドット幅のラインを隙間を空けずに描く」
というのが主旨で、その過程は考慮していないのだ。

で、タイマーは、どう考慮するのか、というと、経過時間による戻り値が、0.0~1.0である、というところに、イージングを設定できるのが素晴らしい。

イージングを使うと、移動にかかる時間は同じ2秒だが、最初ゆっくりで、後半速くなる、などの加速が使えるようになる。

b0163324_939992.png


イージングについては、いくつかの解説、および、ソースコードを載せているサイトがあるが、
大抵が、上記のようになっている。

:最初速くて、後半ゆっくり(OUT)
:最初ゆっくりで、後半速い(IN)
:最初と最後がゆっくり、中間が速い(IN-OUT)
()内は名称

ちなみに図にはないが、加速のない一定速度は(LINEAR)。

かける時間を、D
開始から現在の経過時間をTとすると、

LINEARは簡単で、
return T/D;

INは、
T /= D;
return T*T*T;


OUTは、
T /= D;
T = T-1;
return (T*T*T +1);

IN-OUTは、
T /= D/2;
if ( T<1 )
return 1.0f/2.0f *T*T*T;
T = T-2;
reurn 1.0f/2.0f *(T*T*T +2);


と書ける。
これは、解説サイトにあったソースコードを簡略化して使っているものだが、
イージングの強度の好みは、個人それぞれ違うと思う。

ただ、なぜかどの解説サイトも、これだけしか解説していないんだよな。
ゲームには、もう1種類必要なのだ。

b0163324_9512250.png

:最初と最後が速く、中間がゆっくり(OUT-IN)

これのコードがないので、作ってみた。

T /= d/2;
T = T -1;
return 1.0f/2.0f *(T*T*T+1);


ちなみに、実際のタイマーでは、これ以外にも、
三角関数の波形や、1.0~0.0になる逆数、連携用に常時0のまま or 1のままなんてのも実装している。
[PR]
by miries | 2015-01-20 09:56 | Android


<< Javaとフォント SurfaceViewの重ね順 >>