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が来ます。

デルタタイムの値が多い=処理落ちしたときには、多めに動かす=動きが一定に見えるというわけです。

 

一見、ちょっと不思議な気がしますね!

でも、こうやっておくと、どの環境でも対応出来るので、意識しておきましょう!