クリック処理の実装

クリックを検出する

Love2Dではマウスのクリックを検出する場合。love.mousepressedlove.mousereleasedを使用します。マウスが押されたときか離されたときかの違いがありますが、今回はマウスが押されたときのlove.mousepressedを使用します。

score = 0      -- クリックされた回数
scoreX = 0     -- スコアの表示X座標
scoreY = 20    -- スコアの表示Y座標
imgEgg = nil   -- 画像(タマゴ)
eggX = 0       -- タマゴの表示X座標
eggY = 0       -- タマゴの表示Y座標

-- (省略)

function love.mousepressed(x, y, button, istouch, presses)
  -- マウスのプライマリボタンのクリック以外の場合、クリックとしてカウントしない
  if button ~= 1 then
    return
  end

  score = score + 1
  updateScorePosition()
end

-- (省略)
クリックを検出する

実行して画面をクリックするとスコアが1ずつ増えていきます。これだけで最低限のクリッカーゲームの機能は実装されました。

クリッカーゲームのクリック対象範囲を考える

上記のサンプルコードでは画面全体をクリックの対象範囲としていますが、クリッカーゲームではクリック対象範囲が画面全体対象の画像の範囲の2パターンがあります。これはゲームの方向性によってどちらかにすべきか考える必要があります。

例えば、敵を倒すタイプのクリッカーゲームはクリックが敵への攻撃となるので対象の画像の範囲をクリック対象範囲とすることが多いです。一方、単純にとにかくクリック数だけを重視する場合は画面全体をクリック対象範囲とすることが多いです。

クリックの検出範囲を制限する

先ほどのサンプルコードを修正したクリック対象範囲を対象の画像の範囲に変更してみます。

-- (省略)

function love.mousepressed(x, y, button, istouch, presses)
    -- マウスのプライマリボタン(通常は左)のクリック以外の場合、クリックとしてカウントしない
    if button ~= 1 then
        return
    end

--    score = score + 1
--    updateScorePosition()

    if x >= eggX and x <= eggX + imgEgg:getWidth() and
       y >= eggY and y <= eggY + imgEgg:getHeight() then
        score = score + 1
        updateScorePosition()
   end
end

-- (省略)
クリックの検出範囲を制限する

マウスがクリックされた位置のX座標とY座標が画像の表示位置と表示位置+幅・高さの間にあるかを判定しています。

これで画像の範囲だけでしかクリック数がカウントされなくなりました。