週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

以前のエントリの 続きです。

フレームレートが変動してもプログラムの速度が変わらないように見せるには どうすればよいんでしょう。 たとえば画面更新のたびに弾丸を一定の距離だけ動かすとすると、 フレームレートが変動すると弾丸の速さが変化して見えてしまいます。 これを防ぐには、直前の更新から経過した時間を考慮して、 弾丸の移動距離を変えればよさそうです。

以前のプログラムはこんな感じでした。

update :: Game.Environment -> Game.Object -> Game.Object
update env b@Bullet{coord=oldc,velocity=oldv} = b{coord=oldc+oldv}
coordがBulletの位置、velocityが速度です。更新するたびに位置を速度分動かします。

これを次のように変えます。

update :: Game.Environment -> Game.Object -> DTime -> Game.Object
update env b@Bullet{coord=oldc,velocity=oldv} dt = b{coord=oldc+oldv*dt}
経過時間dtを与えて、移動量を速度と経過時間の積にします。

重力加速度がある場合には、さらにちゃんと書きます。式は省略。

ところで、私はプレーヤー機体の操作をいつも次のように書きます。

update :: Game.Environment -> Game.Object -> Game.Object
update env me@MyShip{coord=oldc,velicity=oldv} = me{coord=newc,velocity=newv}
    where
    accel = (入力された方向に比例する量を加速度とする)
    newv = oldv * 0.1 + accel -- 0.1とかは適当 0<x<1なる値
    newc = oldc+newv
入力方向×速さ = 速度 とせず、入力方向は加速度にして、慣性をつけます。 入力=速度 にすると操作感がかくかくして変な気分なのです。

上の自機操作コードを経過時間を考慮するように変更すると酷いことになります。 解くべき方程式が

dv/dt = a - f v.
こんな感じになっているので、解いて次のようになります。
v(t+dt) = a/f + e-f dt(v(t) - a/f).
位置の変化量を求めるには、さらにvを積分します。 いずれも解析的に解けるのが不幸中の幸いです。

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/30-c1f097f4
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。