Difference between revisions of "love.run (日本語)"

m (Translation updated.)
m (ディレイ(遅延時間挿入処理)を使用する理由は?)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
メインループを構成するメイン関数です。省略時は該当するデフォルト関数を使用します。
+
メインループを構成するメイン関数です。省略時は該当するデフォルト関数を使います。
  
 
通常は定義不要です。定義時は <code>love.run</code> を自作関数でオーバーライドしてください。
 
通常は定義不要です。定義時は <code>love.run</code> を自作関数でオーバーライドしてください。
Line 26: Line 26:
 
ありません。
 
ありません。
 
== 用例 ==
 
== 用例 ==
=== 省略時に使う [[11.0 (日本語)|11.0]] 用のデフォルト関数です。 ===
+
=== デフォルト関数 ([[11.0 (日本語)|11.0]]) ===
 
<source lang="lua">
 
<source lang="lua">
 
function love.run()
 
function love.run()
 
if love.load then love.load(love.arg.parseGameArguments(arg), arg) end
 
if love.load then love.load(love.arg.parseGameArguments(arg), arg) end
  
-- 最初のフレームの dt において love.load により取得された時間は算入しません。
+
-- 最初のフレームの dt には love.load で取得した時間は算入しません。
 
if love.timer then love.timer.step() end
 
if love.timer then love.timer.step() end
  
Line 71: Line 71:
 
</source>
 
</source>
  
===  省略時に使う [[0.10.0 (日本語)|0.10.0]], [[0.10.1 (日本語)|0.10.1]], および [[0.10.2 (日本語)|0.10.2]] 用のデフォルト関数です。 ===
+
===  デフォルト関数 ([[0.10.0 (日本語)|0.10.0]], [[0.10.1 (日本語)|0.10.1]], および [[0.10.2 (日本語)|0.10.2]]) ===
 
<source lang="lua">
 
<source lang="lua">
 
function love.run()
 
function love.run()
Line 81: Line 81:
 
if love.load then love.load(arg) end
 
if love.load then love.load(arg) end
  
-- 最初のフレームの dt において love.load により取得された時間は算入しません。
+
-- 最初のフレームの dt には love.load で取得した時間は算入しません。
 
if love.timer then love.timer.step() end
 
if love.timer then love.timer.step() end
  
Line 108: Line 108:
  
 
-- love.update を呼び出して描画します。
 
-- love.update を呼び出して描画します。
if love.update then love.update(dt) end -- 0 を渡された場合は love.timer は無効になります。
+
if love.update then love.update(dt) end -- 0 が渡されると love.timer は無効になります。
  
 
if love.graphics and love.graphics.isActive() then
 
if love.graphics and love.graphics.isActive() then
Line 123: Line 123:
 
</source>
 
</source>
  
=== 未指定時に使用される [[0.9.0 (日本語)|0.9.0]], [[0.9.1 (日本語)|0.9.1]], および [[0.9.2 (日本語)|0.9.2]] 用のデフォルト関数です。 ===
+
=== デフォルト関数 ([[0.9.0 (日本語)|0.9.0]], [[0.9.1 (日本語)|0.9.1]], および [[0.9.2 (日本語)|0.9.2]]) ===
 
<source lang="lua">
 
<source lang="lua">
 
function love.run()
 
function love.run()
Line 138: Line 138:
 
if love.load then love.load(arg) end
 
if love.load then love.load(arg) end
  
-- 最初のフレームの dt love.load により取得された時間は算入しません。
+
-- 最初のフレームの dt には love.load で取得した時間は算入しません。
 
if love.timer then love.timer.step() end
 
if love.timer then love.timer.step() end
  
Line 169: Line 169:
  
 
-- love.update を呼び出して描画します。
 
-- love.update を呼び出して描画します。
if love.update then love.update(dt) end -- 0 を渡された場合は love.timer は無効になります。
+
if love.update then love.update(dt) end -- 0 が渡されると love.timer は無効になります。
  
 
if love.window and love.graphics and love.window.isCreated() then
 
if love.window and love.graphics and love.window.isCreated() then
Line 184: Line 184:
 
</source>
 
</source>
  
=== 未指定時に使用される [[0.8.0 (日本語)|0.8.0]] 用のデフォルト関数です。===
+
=== デフォルト関数 ([[0.8.0 (日本語)|0.8.0]]) ===
 
<source lang="lua">
 
<source lang="lua">
 
function love.run()
 
function love.run()
Line 220: Line 220:
  
 
-- love.update を呼び出して描画します。
 
-- love.update を呼び出して描画します。
if love.update then love.update(dt) end -- 0 を渡された場合は love.timer は無効になります。
+
if love.update then love.update(dt) end -- 0 が渡されると love.timer は無効になります。
 
if love.graphics then
 
if love.graphics then
 
love.graphics.clear()
 
love.graphics.clear()
Line 233: Line 233:
 
</source>
 
</source>
  
=== 未指定時に使用される [[0.7.0 (日本語)|0.7.0]], [[0.7.1 (日本語)|0.7.1]] および [[0.7.2 (日本語)|0.7.2]] の標準関数です。===
+
=== デフォルト関数 ([[0.7.0 (日本語)|0.7.0]], [[0.7.1 (日本語)|0.7.1]] および [[0.7.2 (日本語)|0.7.2]]) ===
 
<source lang="lua">
 
<source lang="lua">
 
function love.run()
 
function love.run()
Line 247: Line 247:
 
dt = love.timer.getDelta()
 
dt = love.timer.getDelta()
 
end
 
end
if love.update then love.update(dt) end -- 0 を渡された場合は love.timer は無効になります。
+
if love.update then love.update(dt) end -- 0 が渡されると love.timer は無効になります。
 
if love.graphics then
 
if love.graphics then
 
love.graphics.clear()
 
love.graphics.clear()
Line 281: Line 281:
 
</source>
 
</source>
  
少し便利だからです:
+
これは特定の場面で重宝することがあります。
 +
 
 
* 垂直同期が使用不可能の場合は FPS を 1000 に制限します。
 
* 垂直同期が使用不可能の場合は FPS を 1000 に制限します。
* ほとんど場合に CPU の処理使用率を大幅に削減します (垂直同期の使用ができない場合は特に効果的です)。
+
* ほとんどの状況下で CPU の使用率を大幅に削減します (垂直同期が使えないときに効果絶大)。
 
* しばらくの間、オペレーティングシステムへ制御を返します。
 
* しばらくの間、オペレーティングシステムへ制御を返します。
 
詳細情報は [https://love2d.org/forums/viewtopic.php?f=4&t=76998 delay in love.run() - LÖVE]を参照してください。
 
詳細情報は [https://love2d.org/forums/viewtopic.php?f=4&t=76998 delay in love.run() - LÖVE]を参照してください。

Latest revision as of 12:18, 22 June 2023

メインループを構成するメイン関数です。省略時は該当するデフォルト関数を使います。

通常は定義不要です。定義時は love.run を自作関数でオーバーライドしてください。

関数

LÖVE 11.0 から使用可能
この異形は以前のバージョンでは非対応です。

概要

mainLoop = love.run ( )

引数

なし。

返値

function mainLoop

呼び出し時、イベントとレンダリングから構成される単フレームの処理関数。

関数

LÖVE 11.0 から廃止
この異形は以降のバージョンでは非対応です。

概要

love.run( )

引数

なし。

返値

ありません。

用例

デフォルト関数 (11.0)

function love.run()
	if love.load then love.load(love.arg.parseGameArguments(arg), arg) end

	-- 最初のフレームの dt には love.load で取得した時間は算入しません。
	if love.timer then love.timer.step() end

	local dt = 0

	-- この区間はメインループです。
	return function()
		-- イベント処理。
		if love.event then
			love.event.pump()
			for name, a,b,c,d,e,f in love.event.poll() do
				if name == "quit" then
					if not love.quit or not love.quit() then
						return a or 0
					end
				end
				love.handlers[name](a,b,c,d,e,f)
			end
		end

		-- love.update へ渡すために、 dt (デルタタイム) を更新します。
		if love.timer then dt = love.timer.step() end

		-- love.update と love.draw を呼び出します。
		if love.update then love.update(dt) end -- love.timer が無効ならば 0 を渡します。

		if love.graphics and love.graphics.isActive() then
			love.graphics.origin()
			love.graphics.clear(love.graphics.getBackgroundColor())

			if love.draw then love.draw() end

			love.graphics.present()
		end

		if love.timer then love.timer.sleep(0.001) end
	end
end

デフォルト関数 (0.10.0, 0.10.1, および 0.10.2)

function love.run()

	if love.math then
		love.math.setRandomSeed(os.time())
	end

	if love.load then love.load(arg) end

	-- 最初のフレームの dt には love.load で取得した時間は算入しません。
	if love.timer then love.timer.step() end

	local dt = 0

	-- この区間はメインループです。
	while true do
		-- イベント処理。
		if love.event then
			love.event.pump()
			for name, a,b,c,d,e,f in love.event.poll() do
				if name == "quit" then
					if not love.quit or not love.quit() then
						return a
					end
				end
				love.handlers[name](a,b,c,d,e,f)
			end
		end

		-- love.update へ渡すために、 dt (デルタタイム) を更新します。
		if love.timer then
			love.timer.step()
			dt = love.timer.getDelta()
		end

		-- love.update を呼び出して描画します。
		if love.update then love.update(dt) end -- 0 が渡されると love.timer は無効になります。

		if love.graphics and love.graphics.isActive() then
			love.graphics.clear(love.graphics.getBackgroundColor())
			love.graphics.origin()
			if love.draw then love.draw() end
			love.graphics.present()
		end

		if love.timer then love.timer.sleep(0.001) end
	end

end

デフォルト関数 (0.9.0, 0.9.1, および 0.9.2)

function love.run()

	if love.math then
		love.math.setRandomSeed(os.time())
		for i=1,3 do love.math.random() end
	end

	if love.event then
		love.event.pump()
	end

	if love.load then love.load(arg) end

	-- 最初のフレームの dt には love.load で取得した時間は算入しません。
	if love.timer then love.timer.step() end

	local dt = 0

	-- この区間はメインループです。
	while true do
		-- イベント処理。
		if love.event then
			love.event.pump()
			for e,a,b,c,d in love.event.poll() do
				if e == "quit" then
					if not love.quit or not love.quit() then
						if love.audio then
							love.audio.stop()
						end
						return
					end
				end
				love.handlers[e](a,b,c,d)
			end
		end

		-- love.update へ渡すために、 dt (デルタタイム) を更新します。

		if love.timer then
			love.timer.step()
			dt = love.timer.getDelta()
		end

		-- love.update を呼び出して描画します。
		if love.update then love.update(dt) end -- 0 が渡されると love.timer は無効になります。

		if love.window and love.graphics and love.window.isCreated() then
			love.graphics.clear()
			love.graphics.origin()
			if love.draw then love.draw() end
			love.graphics.present()
		end

		if love.timer then love.timer.sleep(0.001) end
	end

end

デフォルト関数 (0.8.0)

function love.run()

	math.randomseed(os.time())
	math.random() math.random()

	if love.load then love.load(arg) end

	local dt = 0

	-- この区間はメインループです。
	while true do
		-- イベント処理。
		if love.event then
			love.event.pump()
			for e,a,b,c,d in love.event.poll() do
				if e == "quit" then
					if not love.quit or not love.quit() then
						if love.audio then
							love.audio.stop()
						end
						return
					end
				end
				love.handlers[e](a,b,c,d)
			end
		end

		-- love.update へ渡すために、 dt (デルタタイム) を更新します。
		if love.timer then
			love.timer.step()
			dt = love.timer.getDelta()
		end

		-- love.update を呼び出して描画します。
		if love.update then love.update(dt) end -- 0 が渡されると love.timer は無効になります。
		if love.graphics then
			love.graphics.clear()
			if love.draw then love.draw() end
		end

		if love.timer then love.timer.sleep(0.001) end
		if love.graphics then love.graphics.present() end
	end

end

デフォルト関数 (0.7.0, 0.7.1 および 0.7.2)

function love.run()

	if love.load then love.load(arg) end

	local dt = 0

	-- この区間はメインループです。
	while true do
		if love.timer then
			love.timer.step()
			dt = love.timer.getDelta()
		end
		if love.update then love.update(dt) end -- 0 が渡されると love.timer は無効になります。
		if love.graphics then
			love.graphics.clear()
			if love.draw then love.draw() end
		end

		-- イベント処理。
		if love.event then
			for e,a,b,c in love.event.poll() do
				if e == "q" then
					if not love.quit or not love.quit() then
						if love.audio then
							love.audio.stop()
						end
						return
					end
				end
				love.handlers[e](a,b,c)
			end
		end

		if love.timer then love.timer.sleep(1) end
		if love.graphics then love.graphics.present() end
	end

end

注釈

ディレイ(遅延時間挿入処理)を使用する理由は?

if love.timer then love.timer.sleep(0.001) end

これは特定の場面で重宝することがあります。

  • 垂直同期が使用不可能の場合は FPS を 1000 に制限します。
  • ほとんどの状況下で CPU の使用率を大幅に削減します (垂直同期が使えないときに効果絶大)。
  • しばらくの間、オペレーティングシステムへ制御を返します。

詳細情報は delay in love.run() - LÖVEを参照してください。

関連


そのほかの言語