LÖVEのいろは

ゲームの仕組み

ゲームを作るにあたり、ゲームが動く仕組みを大まかに把握しておくとスムーズに開発できると思います。本ページでは、ゲームが始まってから終わるまでの一連の流れ(ライフサイクル)を大まかに説明します。[*1]

今回は、前のページ「ゲームの作り方」で扱ったサンプルを使用します。こちらからダウンロードしてみましょう。

[*1]:本ページは内容が少し難しいかもしれません。 さっと目を通してみて、少しLÖVEやLua言語に慣れてから改めて見てみることをおすすめします。

ゲームの一生

ゲームの"はじまり"から"おわり"までは、4種類の重要なブロックで構成されています。 "load(準備)", "update(更新)", "draw(描画)", "event handle(イベント対応)"です。 それぞれのブロックで何を行っているかは後ほど紹介します。

内容はさておき、4種類のブロックが実行される順序を覚えておきましょう。 まず、ゲームが始まったらload(準備)が1回だけ実行されます。 次にupdate(更新)が実行されます。 さらに、draw(描画)が実行されます。 最後に、event handle(イベントの確認)が実行されされます。event handle(イベントの確認)まで完了したら、update(更新)から再度実行します。 ゲーム中はupdate->draw->event handle->update...と繰り返します。

LÖVEでは、これらの4種類のブロックの内容をあなた自身が決めることで、あなただけのゲームが出来あがります。

準備(load)

準備(load)は、ゲームが始まってから一番最初に1回だけ実行されるゲームの準備処理です。 例えば、必要なリソース(画像・音楽ファイル)などの読み込み、データのロード、データの初期化(HPを100にしておく、主人の位置を決める etc...)などです。

LÖVEでは、ゲームの準備処理をlove.load()関数内に記入します。 love.load()関数の内容は、main.luaファイルのfunction love.load()からendの間に記入します。

function love.load()
  --ここに準備する内容を書く
end
ゲームの作り方で扱ったサンプルを例に、中身を見てみましょう。
--準備するブロックはじめ
function love.load()
   --寝ているLOVE子の画像を読み込んでloveko_oyasumiという名前の変数(値の入れ物)に入れる
    loveko_oyasumi = love.graphics.newImage("/imgs/loveko_sleep_x4.png")
   --起きているLOVE子の画像を読み込んでloveko_ohayoという名前の変数(値の入れ物)に入れる
    loveko_ohayo = love.graphics.newImage("/imgs/loveko_wakeup_x4.png")
   --おやすみの画像をprint_imgという名前の変数に入れる。
   print_img = loveko_oyasumi  
   --loveko_yという名前の変数(値の入れ物)に100を入れる。
   loveko_y = 100
   --loveko_speekという名前の変数(値の入れ物)にZzz...という文字列を入れる。
   loveko_speek = "Zzz..."
end
--準備するブロックおわり

色々書いていますが、上記の例では画像を読み込んだり、位置を設定しておいたり、表示する文字を設定しておいたりなどしています。最初はは読めなくても当然ですので、今は無理に読もうとせず、"なんだか準備しているんだな"、くらいに留めておきましょう。

更新(update)

更新(update)は、ゲーム内の計算を行ったり、データの読み書きを行うブロックです。 例えば、キャラクターの位置の移動、当たり判定、HPやMPなどの増減、ファイル(テキスト、画像、音楽)の読み込み、ファイルへの書き出しなどです。 プレイヤーに表示しない処理はほとんどすべてここで実行します。

LÖVEでは、ゲームの更新処理をlove.update(dt)関数内に記入します。[*2] love.update(dt)関数の内容は、main.loveファイルのfunction love.update(dt)からendの間に記入します。

[*2]:dtには前回のupdateから経過した時間が渡されますが、ここでは使いません。

function love.update(dt)
  --ここに更新する内容を書く
end
ゲームの作り方で扱ったサンプルを例に、中身を見てみましょう。
--更新するブロックはじめ
function love.update(dt)
   --LOVE子の位置が80の時、then~endまでの処理を行う。
   if loveko_y == 80 then
       --おはようの画像をprint_imgという名前の変数に入れる。                                                
      print_img = loveko_ohayo
      --表示する内容をohayoに変更する。                                                                     
      loveko_speek = "ohayo"
   end
end
--更新するブロックおわり

上記の例では、LOVE子の位置が上から80pxにいるときに表示する文字と、表示する画像を設定しています。(設定のみで、表示の命令はdraw内で行います。)

描画(draw)

描画(draw)は、プレイヤーへの表示系の処理を行うブロックです。 例えば、図形の描画、画像の描画、音の出力、などです。図形の色や線の太さもここで設定します。 プレイヤーに表示する処理はほとんどすべてここで実行します。

LÖVEでは、ゲームの描画処理をlove.draw()関数内に記入します。 love.draw()関数の内容は、main.loveファイルのfunction love.draw()からendの間に記入します。

function love.draw()
  --ここに描画する内容を書く
end
ゲームの作り方で扱ったサンプルを例に、中身を見てみましょう。
--描画するブロックはじめ
function love.draw()
    --一旦キャンバスををクリア
    love.graphics.clear()
    --次の色を白に設定(赤が255,青が255,緑が255の色 (255がMAX))

    love.graphics.setColor(255,255,255)
    --画像を表示(print_imgの中の画像、xが100、yがloveko_yの位置)
    love.graphics.draw(print_img,100,loveko_y)

    --次の色をグレーに設定(赤が255,青が0,緑が0の色 (255がMAX))
    love.graphics.setColor(255,0,0)
    --文字を表示(textの中のという文字列,xが50,yが10の位置)
    love.graphics.print(loveko_speek,50,10)
end
--描画するブロックおわり

上記の例では、キャンバスに実際に文字や画像を描画する命令を書いています。また、画像を描画する際の色も設定しています。

イベントの対応(event handle)

イベント(event)とは、ゲームが常に監視している入力情報を指します。 例えばプレイヤーの操作(マウスやキーボード、コントローラ、タッチパネル)が発生した、という情報のことです。[*3] 監視対象に何らかのイベント(≒ユーザの操作)が発生した時、イベントに対応した処理を行う[*4]ことができます。 例えば、マウスでクリックが発生したらキャラクターをジャンプさせる、キーボードの"A"が押されたらキャラクターを右に移動させる、などです。

[*3]:イベントの中には「PCのメモリが少ないよ!」など、プレイヤーが発していない情報もあります。

[*4]:イベントのハンドリングと言います。

LÖVEでは、イベントの対応を行う際、イベントごとに異なる内容を記載します。必要なものを都度main.loveファイルに追記しましょう。 全量は公式Wikiのコールバックという欄に記載しています。マウスやキーボードなど、監視したいイベントに応じて、サンプルを確認してみてくださいね。 (load,drawとupdate以外のコールバックが、イベントの対応用の関数です。) 本ページでは、マウスが押されたたときの記載内容の例です。mousepressed(x,y,button,istouch)関数を使用します。

function love.mousepressed(x,y,button,istouch)
  --ここにマウスが押されたときの内容を書く
end
ゲームの作り方で扱ったサンプルを例に、中身を見てみましょう。
--マウスが押されたときの内容を書くブロックはじめ
function love.mousepressed(x,y,button,istouch)
   --LOVE子の上からの位置を80にする。
   loveko_y = 80
end
--マウスが押されたときの内容を書くブロックおわり

上記の例では、マウスが押された時のLOVE子の位置を80に変更しています。

まとめ

LÖVEでゲームを作る際、上記で紹介した4種類のブロックの役割と順番を覚えていくことは極めて重要と言えます。 どんなに大きいゲームを作る際にも、これらの4つのブロックで役割を分けることにという思想に変わりはないからです。

function love.load()
  --ここに準備する内容を書く
end

function love.update(dt)
  --ここに更新する内容を書く
end

function love.draw()
  --ここに描画する内容を書く
end

function love.mousepressed(x,y,button,istouch)
  --ここにマウスが押されたときの内容を書く
end

おまけ*上級者の方

あなたがもし手練れのプログラミングの経験者で、LÖVEというフレームワークが内部的にどのような処理を行っているかを正確に知りたい場合、 bitbucketにてLÖVE公式のソースを読むことができます。(コールバック関数の呼び出しはlove/src/scripts/boot.luaで実装しています。)

top

このウェブページはLÖVE公式ではありません。hakolife.net[hako 生活]