Tutorial:Callback Functions (日本語)

LÖVEのコールバック関数は、love.runから様々なタスクを実行するために呼ばれる、オプショナルな関数です。しかし、フル機能のゲーム体験のために、おそらくほとんどすべてのコールバック関数を利用するので、それが何であるかを知っておくのが賢明でしょう。

プログラミング初心者や、コールバックをご存じない方の為に申し上げれば、コールバックは、ある意味で逆方向に動作する関数です。一般的な関数、たとえば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.loadは、ゲームが開始されたときに、一度だけ呼ばれます。通常はこの関数でリソースをロードしたり、変数を初期化したり、特定の設定を行います。これらの作業は他の場所に書いても同様に実行されますが、love.loadに書けば、その作業が一度だけ行われることを意味するので、多くのシステムリソースを節約することができます。

love.update

function love.update(dt)
   if love.keyboard.isDown("up") then
      num = num + 100 * dt -- 1秒あたり100ずつnumをインクリメントする
   end
end

love.updateは、ゲーム中ずっと呼び出されつづけます。ゲームのための計算のほとんどはこの関数で行われるでしょう。'dt'はデルタ・タイムの略で、love.updateが前回呼び出された時間からの経過秒数を表しています。(通常、デルタ・タイムは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などの描画を行う関数はすべてlove.drawの中から呼び出す必要があり、love.draw以外から呼び出しても何も描画されません。この関数もlove.updateと同様ゲーム中ずっと呼び出されつづけるので、関数の末尾でfont・color・modeなどを変更した場合、それは関数の先頭に影響を与えることに留意してください。次のコードはその一例です。

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

function love.mousepressed(x, y, button)
   if button == 'l' then
      imgx = x -- クリックされた位置にイメージを動かす
      imgy = y
   end
end

love.mousepressedはマウスボタンが押されたときに呼び出され、マウスカーソルの位置と押されたボタンが関数に受け渡されます。button変数の値はマウスボタン定数の中のいずれかです。This function goes very well along with love.mousereleased.

love.mousereleased

function love.mousereleased(x, y, button)
   if button == 'l' then
      fireSlingshot(x,y) -- this totally awesome custom function is defined elsewhere
   end
end

love.mousereleasedはマウスボタンが離されたときに呼び出され、マウスカーソルの位置と離されたボタンが関数に受け渡されます。You can have this function together with love.mousepressed or separate, they aren't connected in any way.


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

love.keypressedはキーボードのキーが押されたときに呼び出され、押されたキーが関数に受け渡されます。key変数の値はキー定数の中のいずれかです。This functions goes very well along with 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.keyreleasedはキーボードのキーが離されたときに呼び出され、離されたキーが関数に受け渡されます。You can have this function together with love.keypressed or separate, they aren't connected in any way.

love.focus

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

love.focusはLÖVEのウィンドウの外や中がクリックされて、フォーカスが移動したときに呼び出されます。例えば、ゲームをプレイ中にプレイヤーがインターネットブラウザーをクリックしたときにはこの関数が呼び出されるので、ゲームを自動的にポーズすることができます。

function love.focus(f) gameIsPaused = not f end

function love.update(dt)
    if gameIsPaused then return end
    -- 以下に自分で残りのコードを書く
end

love.quit

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

love.quitはウィンドウのクローズボタン(大抵×印が付いているボタン)がクリックされたときに呼び出されます。たとえば、プレイヤーがゲームをやめようとしてクローズボタンを押すと、ウィンドウが閉じる前にこの関数が呼び出されるので、ゲームの状態をセーブしておくことができます。

以上がコールバック関数とその基本的な使い方です。



Other languages