山水堂
A006.キー入力の基本、その2
さて、その1で、それなりの動作になりましたが、もう少し工夫してみましょう。
キーの押しっぱなしをすっきりさせること
FPSに依存しない動作を実現すること
と、格好良く言ってみましたが、上記の件を満たすようにもうちょっとソースを変更することにします!
-- main.lua local player_x, player_y local player_graph -- キー状態を保持 local keystate = {} function love.load() -- ■初期読み込み! -- グラフィックのロード player_graph = love.graphics.newImage("Player.bmp") -- キャラクターの初期位置をセット player_x = 0 player_y = 0 end function love.keypressed(key, isrepeat) -- ■キーが押された! -- 押しっぱなしの情報を保持する keystate[key] = true -- エスケープボタンが押されたら終了イベントを起こす if key == "escape" then love.event.quit() end end function love.keyreleased(key) -- ■キーが離された! -- 押しっぱなしの状態から解除する keystate[key] = false end function love.update(dt) -- ■更新処理! local move = dt * 300 -- 押しっぱなしならプレイヤーの位置を動かす! -- ウィンドウの左上が(0,0) if keystate.up then player_y = player_y - move end if keystate.down then player_y = player_y + move end if keystate.right then player_x = player_x + move end if keystate.left then player_x = player_x - move end end function love.draw() -- ■描画処理! love.graphics.draw(player_graph, player_x, player_y) end
どうですか、変わりましたよね!
まあ、間違え探しみたいなものですが、多少すっきりしたと思います。
まず、keystateの個所では、全てのキーの押しっぱなしを把握するようにしました。
「テーブルを用意した場合は、全てのキーの値はnilで埋まっている」「nilとfalseは、双方とも偽となる」というのを利用しています。
なので、わざわざ初期化するのをやめて、すっきりとさせました。
もう一つの変更は、love.updateの個所です。
引数のdtを利用しているのが判ると思います。
このdtというのは何かというと、デルタタイムです!
Unityなんかでもよくあるやつですね、Unityを知らないのなら忘れてください!
これを利用するのとしないのでは何が違うのか。
とても古いパソコンによっては、FPSを60保てないものがあるかもしれません。
FPSが思いっきり落ちた時に、プレイヤーの動きが思いっきり遅くなる……何となく嫌ですね!
そういった際に、このデルタタイムを考慮して作っておくのがベターです。
love.updateは一秒間に何十回と動くと言うのを前に記述したと思います。
デルタタイムは、ひとつ前のlove.updateから、今回のlove.updateに来た時の時間の差だと考えてください。
いつも、一定でlove.updateが来ているのなら、同じような値のdtが来ます。
あまりに負荷がかかった場合は、いつもよりも多めの値のdtが来ます。
デルタタイムの値が多い=処理落ちしたときには、多めに動かす=動きが一定に見えるというわけです。
一見、ちょっと不思議な気がしますね!
でも、こうやっておくと、どの環境でも対応出来るので、意識しておきましょう!