Difference between revisions of "love.run"

m (Returns: typo)
 
(20 intermediate revisions by 9 users not shown)
Line 1: Line 1:
 
The main function, containing the main loop. A sensible default is used when left out.
 
The main function, containing the main loop. A sensible default is used when left out.
 
== Function ==
 
== Function ==
 +
{{newin|[[11.0]]|110|type=variant}}
 +
=== Synopsis ===
 +
<source lang="lua">
 +
mainLoop = love.run ( )
 +
</source>
 +
=== Arguments ===
 +
None.
 +
=== Returns ===
 +
{{param|function|mainLoop|Function which handles one frame, including events and rendering, when called.}}
 +
 +
== Function ==
 +
{{oldin|[[11.0]]|110|type=variant}}
 
=== Synopsis ===
 
=== Synopsis ===
 
<source lang="lua">
 
<source lang="lua">
Line 10: Line 22:
 
Nothing.
 
Nothing.
 
== Examples ==
 
== Examples ==
=== The default function for 0.6.0, used if you don't supply your own. ===
+
=== The default function for [[11.0]], used if you don't supply your own. ===
 +
<source lang="lua">
 +
function love.run()
 +
if love.load then love.load(love.arg.parseGameArguments(arg), arg) end
 +
 
 +
-- We don't want the first frame's dt to include time taken by love.load.
 +
if love.timer then love.timer.step() end
 +
 
 +
local dt = 0
 +
 
 +
-- Main loop time.
 +
return function()
 +
-- Process events.
 +
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
 +
 
 +
-- Update dt, as we'll be passing it to update
 +
if love.timer then dt = love.timer.step() end
 +
 
 +
-- Call update and draw
 +
if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
 +
 
 +
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
 +
</source>
 +
 
 +
=== The default function for [[0.10.0]], [[0.10.1]], and [[0.10.2]], used if you don't supply your own. ===
 
<source lang="lua">
 
<source lang="lua">
 
function love.run()
 
function love.run()
+
 
if love.load then love.load() end
+
if love.math then
+
love.math.setRandomSeed(os.time())
-- Main loop.
+
end
 +
 
 +
if love.load then love.load(arg) end
 +
 
 +
-- We don't want the first frame's dt to include time taken by love.load.
 +
if love.timer then love.timer.step() end
 +
 
 +
local dt = 0
 +
 
 +
-- Main loop time.
 
while true do
 
while true do
 
love.timer.step()
 
if love.update then love.update(love.timer.getDelta()) end
 
love.graphics.clear()
 
if love.draw then love.draw() end
 
 
 
-- Process events.
 
-- Process events.
for e,a,b,c in love.event.poll() do
+
if love.event then
if e == 'q' then
+
love.event.pump()
if love.audio then
+
for name, a,b,c,d,e,f in love.event.poll() do
love.audio.stop()
+
if name == "quit" then
 +
if not love.quit or not love.quit() then
 +
return a
 +
end
 
end
 
end
return
+
love.handlers[name](a,b,c,d,e,f)
 
end
 
end
love.handlers[e](a,b,c)
 
 
end
 
end
love.timer.sleep(1)
+
 
+
-- Update dt, as we'll be passing it to update
love.graphics.present()
+
if love.timer then
+
love.timer.step()
 +
dt = love.timer.getDelta()
 +
end
 +
 
 +
-- Call update and draw
 +
if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
 +
 
 +
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
+
 
 
end
 
end
 
</source>
 
</source>
=== The default function for 0.6.1, used if you don't supply your own. ===
+
 
 +
=== The default function for [[0.9.0]], [[0.9.1]], and [[0.9.2]], used if you don't supply your own. ===
 
<source lang="lua">
 
<source lang="lua">
 
function love.run()
 
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
 
if love.load then love.load(arg) end
 +
 +
-- We don't want the first frame's dt to include time taken by love.load.
 +
if love.timer then love.timer.step() end
  
 
local dt = 0
 
local dt = 0
Line 52: Line 141:
 
-- Main loop time.
 
-- Main loop time.
 
while true do
 
while true do
 +
-- Process events.
 +
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
 +
 +
-- Update dt, as we'll be passing it to update
 
if love.timer then
 
if love.timer then
 
love.timer.step()
 
love.timer.step()
 
dt = love.timer.getDelta()
 
dt = love.timer.getDelta()
 
end
 
end
 +
 +
-- Call update and draw
 
if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
 
if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
if love.graphics then
+
 
 +
if love.window and love.graphics and love.window.isCreated() then
 
love.graphics.clear()
 
love.graphics.clear()
 +
love.graphics.origin()
 
if love.draw then love.draw() end
 
if love.draw then love.draw() end
 +
love.graphics.present()
 
end
 
end
  
 +
if love.timer then love.timer.sleep(0.001) end
 +
end
 +
 +
end
 +
</source>
 +
 +
=== The default function for [[0.8.0]], used if you don't supply your own. ===
 +
<source lang="lua">
 +
function love.run()
 +
 +
math.randomseed(os.time())
 +
math.random() math.random()
 +
 +
if love.load then love.load(arg) end
 +
 +
local dt = 0
 +
 +
-- Main loop time.
 +
while true do
 
-- Process events.
 
-- Process events.
 
if love.event then
 
if love.event then
for e,a,b,c in love.event.poll() do
+
love.event.pump()
if e == "q" then
+
for e,a,b,c,d in love.event.poll() do
if love.audio then
+
if e == "quit" then
love.audio.stop()
+
if not love.quit or not love.quit() then
 +
if love.audio then
 +
love.audio.stop()
 +
end
 +
return
 
end
 
end
return
 
 
end
 
end
love.handlers[e](a,b,c)
+
love.handlers[e](a,b,c,d)
 
end
 
end
 
end
 
end
  
if love.timer then love.timer.sleep(1) end
+
-- Update dt, as we'll be passing it to update
 +
if love.timer then
 +
love.timer.step()
 +
dt = love.timer.getDelta()
 +
end
 +
 
 +
-- Call update and draw
 +
if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
 +
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
 
if love.graphics then love.graphics.present() end
 
 
end
 
end
  
 
end
 
end
 
</source>
 
</source>
=== The default function for 0.7.0, used if you don't supply your own. ===
+
=== The default function for [[0.7.0]], [[0.7.1]] and [[0.7.2]], used if you don't supply your own. ===
 
<source lang="lua">
 
<source lang="lua">
 
function love.run()
 
function love.run()
Line 119: Line 264:
 
if love.timer then love.timer.sleep(1) end
 
if love.timer then love.timer.sleep(1) end
 
if love.graphics then love.graphics.present() end
 
if love.graphics then love.graphics.present() end
 
 
end
 
end
  
 
end
 
end
 
</source>
 
</source>
 +
 +
== Notes ==
 +
=== Why is there a delay? ===
 +
<source lang="lua">
 +
if love.timer then love.timer.sleep(0.001) end
 +
</source>
 +
 +
It does a few useful things:
 +
* Limits FPS to 1000 if vsync isn't enabled.
 +
* Massively reduces CPU usage in many situations (especially with vsync disabled.)
 +
* Gives control back to the OS for a bit.
 +
For more information see https://love2d.org/forums/viewtopic.php?f=4&t=76998.
 
== See Also ==
 
== See Also ==
 
* [[parent::love]]
 
* [[parent::love]]
 
[[Category:Callbacks]]
 
[[Category:Callbacks]]
 
{{#set:Description=The main function, containing the main loop. A sensible default is used when left out.}}
 
{{#set:Description=The main function, containing the main loop. A sensible default is used when left out.}}
 +
{{#set:Subcategory=General}}
 +
{{#set:Since=000}}
 
== Other Languages ==
 
== Other Languages ==
 
{{i18n|love.run}}
 
{{i18n|love.run}}

Latest revision as of 00:37, 24 March 2020

The main function, containing the main loop. A sensible default is used when left out.

Function

Available since LÖVE 11.0
This variant is not supported in earlier versions.

Synopsis

mainLoop = love.run ( )

Arguments

None.

Returns

function mainLoop
Function which handles one frame, including events and rendering, when called.

Function

Removed in LÖVE 11.0
This variant is not supported in that and later versions.

Synopsis

love.run( )

Arguments

None.

Returns

Nothing.

Examples

The default function for 11.0, used if you don't supply your own.

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

	-- We don't want the first frame's dt to include time taken by love.load.
	if love.timer then love.timer.step() end

	local dt = 0

	-- Main loop time.
	return function()
		-- Process events.
		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

		-- Update dt, as we'll be passing it to update
		if love.timer then dt = love.timer.step() end

		-- Call update and draw
		if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled

		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

The default function for 0.10.0, 0.10.1, and 0.10.2, used if you don't supply your own.

function love.run()

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

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

	-- We don't want the first frame's dt to include time taken by love.load.
	if love.timer then love.timer.step() end

	local dt = 0

	-- Main loop time.
	while true do
		-- Process events.
		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

		-- Update dt, as we'll be passing it to update
		if love.timer then
			love.timer.step()
			dt = love.timer.getDelta()
		end

		-- Call update and draw
		if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled

		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

The default function for 0.9.0, 0.9.1, and 0.9.2, used if you don't supply your own.

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

	-- We don't want the first frame's dt to include time taken by love.load.
	if love.timer then love.timer.step() end

	local dt = 0

	-- Main loop time.
	while true do
		-- Process events.
		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

		-- Update dt, as we'll be passing it to update
		if love.timer then
			love.timer.step()
			dt = love.timer.getDelta()
		end

		-- Call update and draw
		if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled

		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

The default function for 0.8.0, used if you don't supply your own.

function love.run()

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

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

	local dt = 0

	-- Main loop time.
	while true do
		-- Process events.
		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

		-- Update dt, as we'll be passing it to update
		if love.timer then
			love.timer.step()
			dt = love.timer.getDelta()
		end

		-- Call update and draw
		if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
		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

The default function for 0.7.0, 0.7.1 and 0.7.2, used if you don't supply your own.

function love.run()

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

	local dt = 0

	-- Main loop time.
	while true do
		if love.timer then
			love.timer.step()
			dt = love.timer.getDelta()
		end
		if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
		if love.graphics then
			love.graphics.clear()
			if love.draw then love.draw() end
		end

		-- Process events.
		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

Notes

Why is there a delay?

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

It does a few useful things:

  • Limits FPS to 1000 if vsync isn't enabled.
  • Massively reduces CPU usage in many situations (especially with vsync disabled.)
  • Gives control back to the OS for a bit.

For more information see https://love2d.org/forums/viewtopic.php?f=4&t=76998.

See Also


Other Languages