カメラ移動をばねっぽくしてみた
みんなでつくるダンジョンでは、キャラクターを画面中央に表示するようにカメラ座標を決定しています。
今まではキャラクターの位置を以下のように決定していましたが、キャラクターのうごきががくがくするとカメラまでがくがくと動くようになり、画面酔いをしやすくなりそう~という懸念がありました。
camera.x = character.x + (character.width / 2) - (screenWidth / 2); camera.y = character.y + (character.height / 2) - (screenHeight / 2);
そこで、カメラとキャラクターをばねでつないで描画する仕組みに変更してみました。キャラクターが移動するとばねが引っ張られるのでカメラがゆるやかに遅れて動きます。
カメラの重さを, カメラの加速度を, ばね定数, ばねの伸び とすると力のつり合い式を みたいにかけるので、カメラの加速度は で計算できます。 カメラの速度 、カメラの速度 のときばねの伸び なので、積分定数 となります(あっているかな...)。
(フレーム間隔を一定とする) はいずれも定数なので と置けば と書けます。( はばね定数と質量で決定される定数)
カメラ位置を, キャラクタ位置を とすれば なので、最終的には
となります。(y方向も同様に、 とします。)
の値を適当に(1以下に)設定すれば、カメラの動き具合を調整することができます。計算した速度は1フレームあたりのカメラ座標の移動量とみなせるので、1フレームごとに速度を計算してカメラ位置に足していきます。
(y方向も同様に、 とします。)
上記のようにカメラを動かすと以下のようなかんじになります。
カメラを追尾したい対象とばねで繋ぐ実装にしておくと、たとえばばねを他のキャラクターに繋ぎ変えれば、特に何も考えなくてもスムーズに繋ぎ変えた先のキャラクターを見るように移動するのでよいなあという感じです。視点移動とかもらくらくにできそう。
ではでは~。