Tutorial:Callback Functions (简体中文)

LÖVE的 回调 函数通过 love.run 调用,可执行一系列不同任务,全部都为可选项。不过据经验谈,一个完成度高的游戏很可能会用到几乎全部功能,因此了解它们会是个明智选择。

对于程序新手或术语盲而言,回调(callback)在某种意思上就是个往回工作的函数。类似 love.graphics.draw 或 math.floor 这种常规函数,在你调用它时,LÖVE 或 Lua 则做些工作。换句话说,回调函数也就是写一段代码然后LÖVE 调用数次。这使得代码易于被组织优化。例如,love.load 函数仅会在游戏初次启动时被调用一次 (早于其他回调),因此游戏内容加载及其他准备工作的代码很适合放在这里。

love.load

function love.load()
   image = love.graphics.newImage("cake.jpg")
   local f = love.graphics.newFont(12)
   love.graphics.setFont(f)
   love.graphics.setColor(0,0,0,255)
   love.graphics.setBackgroundColor(255,255,255)
end

此函数仅会在游戏开始时被调用一次,这里也常用于进行资源加载、变量初始化及特定设置。所有这些操作都可以在别处完成,而在此进行则意味着只需做一次,大大节省了系统开销。

love.update

function love.update(dt)
   if love.keyboard.isDown("up") then
      num = num + 100 * dt -- this would increment num by 100 per second
   end
end

此函数被连续调用,可能是大部分数学运算完成的场所。 'dt' 代表 "delta time" ,是自函数上一次被调用的时间到当前时间所经过的秒数(通常等于类似0.025714这样的小值).

love.draw

function love.draw()
   love.graphics.draw(image, imgx, imgy)
   love.graphics.print("Click and drag the cake around or use the arrow keys", 10, 10)
end

love.draw 完成所有绘图操作(还不够简单直白吗),在此函数体外调用任何 love.graphics.draw 操作都将不会生效。此函数也是连续调用的,所以请留神,假如你在函数末尾更改字体/颜色/模式等等内容,它将会对函数开始处的内容产生影响。例如:

function love.load()
   love.graphics.setColor(0,0,0)
end
 
function love.draw()
   love.graphics.print("This text is not black because of the line below", 100, 100)
   love.graphics.setColor(255,0,0)
   love.graphics.print("This text is red", 100, 200)
end

love.mousepressed

Available since LÖVE 0.10.0
This variant is not supported in earlier versions.
function love.mousepressed(x, y, button, istouch)
   if button == 1 then
      imgx = x -- move image to where mouse clicked
      imgy = y
   end
end

此函数在鼠标按键被点击时调用,接受被点击的按键和点击发生时的位置坐标作为参数。按键可以是任意 constants。此函数与 love.mousereleased 相性极佳。

love.mousereleased

Available since LÖVE 0.10.0
This variant is not supported in earlier versions.
function love.mousereleased(x, y, button, istouch)
   if button == 1 then
      fireSlingshot(x,y) -- this totally awesome custom function is defined elsewhere
   end
end

此函数在鼠标按键释放时被调用,接受被释放的按键和释放发生时的位置坐标作为参数。可以与 love.mousepressed 连用,也可单独使用,没有特定要求。


love.keypressed

function love.keypressed(key, unicode)
   if key == 'b' then
      text = "The B key was pressed."
   elseif key == 'a' then
      a_down = true
   end
end

此函数在键盘按键被按下时调用,接受被按下的按键作为参数,按键可以是任意 constants 键值。此函数与 love.keyreleased 相性极佳。

love.keyreleased

function love.keyreleased(key, unicode)
   if key == 'b' then
      text = "The B key was released."
   elseif key == 'a' then
      a_down = false
   end
end

此函数在键盘按键被释放时调用,接受被释放的按键作为参数。可以与 love.keypressed 连用,也可单独使用,没有特定要求。

love.focus

function love.focus(f)
  if not f then
    print("LOST FOCUS")
  else
    print("GAINED FOCUS")
  end
end

此函数在 LÖVE 窗口聚焦和失焦时被调用。举例而言,假如用户在游戏中离开游戏窗口去点击浏览器窗口,游戏程序将会识别这个行为,并自动暂停游戏进程。

function love.focus(f) gameIsPaused = not f end
 
function love.update(dt)
	if gameIsPaused then return end
 
	-- The rest of your love.update code goes here
end

love.quit

function love.quit()
  print("Thanks for playing! Come back soon!")
end

此函数在用户点击窗口关闭按钮(通常是个 X)时被调用。例如当用户想要结束游戏时,他们会点击关闭按钮,接着在关闭前,游戏状态得以保存。

以上就是回调函数及其基本用法。



其他语言