-- 読み込み
function love.load ()
sceneManager = SceneManager.new()
sceneManager:init()
end
-- 更新
function love.update (dt)
sceneManager:update(dt)
end
-- 描画
function love.draw ()
sceneManager:draw()
end
-- マウス入力受付
function love.mousereleased ( x, y, buttonNum, istouch )
sceneManager:mousereleased ( x, y, buttonNum )
end
--=========================================================-- マウス入力受付--=========================================================
this.mousereleased = function ( self, x, y, buttonNum )
if ( self.sceneList[self.currentScene].mousereleased ) then
self.sceneList[self.currentScene]:mousereleased ( x, y, buttonNum )
end
end
--=========================================================-- 更新--=========================================================
this.update = function(self, dt)
self.imageFramcount = self.imageFramcount + 1
if ( self.imageFramcount > 4 ) then
self.imageFramcount = 0
self.imageIndex = self.imageIndex + 1
if ( self.imageIndex > #self.images ) then
self.imageIndex = 1
end
end
end
--=========================================================-- 描画--=========================================================
this.draw = function(self)
love.graphics.draw ( self.backGround, 80, 60 )
love.graphics.draw (
self.images[self.imageIndex], 400, 300, 0, 1, 1,
self.images[self.imageIndex]:getWidth()/2,
self.images[self.imageIndex]:getHeight()/2
)
end
--=========================================================-- マウスボタン受付--=========================================================
this.mousereleased = function ( self, x, y, buttonNum )
if ( buttonNum == 1 ) then
sceneManager:changeScene("scene2")
end
end
--=========================================================-- シーン開始--=========================================================
this.enter = function(self)
print("開始:"..self.id)
end
--=========================================================-- シーン終了--=========================================================
this.leave = function(self)
print("終了:"..self.id)
end
Fade_grids = {}
Fade_grids.new = function ()
local this = {}
-- フェードの進行度(0.0:フェードなし 1.0:画面真っ暗)
this.fadeRate = 0.0
-- 処理フェイズ:フェード「in」か「out」か。
this.phase = ""
-- ウィンドウのサイズを確認して、
local windowWidth, windowHeight = love.window.getMode()
-- 特定のサイズのグリッドで画面を敷き詰めていく
this.gridSize = 25
this.grids = {}
-- 画面全体を敷き詰めるようにグリッドを作成
for y = 0, windowHeight, this.gridSize do
for x = 0, windowWidth, this.gridSize do
-- グリッドの実体は「座標」
this.grids [ #this.grids + 1 ] = {
x = x, y = y
}
end
end
--=========================================================-- 開始--=========================================================
this.start = function(self)
-- 乱数初期化
math.randomseed(os.time())
self.fadeRate = 0.0
self.phase = "out"
-- グリッドをシャッフル:ランダムに埋まっていく感じになる。
for i = #self.grids, 1, -1 do
local j = math.random(1,i)
local temp = self.grids[i]
self.grids[i] = self.grids[j]
self.grids[j] = temp
end
end
--=========================================================-- 更新--=========================================================
this.update = function(self)
local pace = 0.03
-- フェードアウト
if ( self.phase == "out" ) then
-- フェードの度合いを「進める」
self.fadeRate = self.fadeRate + pace
-- フェードアウト終了判定
if ( self.fadeRate >= 1.0 ) then
-- ハミ出しを一応抑えて
self.fadeRate = 1.0
-- 処理フェイズを「イン」に移行
self.phase = "in"
-- シーン遷移を実行-- 中味はシーンマネージャーから事前に受け取る
self:changeScene()
end
-- フェードイン
elseif ( self.phase == "in" ) then
-- フェードの度合いを「戻す」
self.fadeRate = self.fadeRate - pace
-- フェードイン終了判定
if ( self.fadeRate <= 0.0 ) then
self.fadeRate = 0.0
self.phase = ""
end
end
end
--=========================================================-- 描画--=========================================================
this.draw = function(self)
-- 現時点の描画色を保持しておく(後で戻す)
local r,g,b,a = love.graphics.getColor()
-- 描画色を「黒塗り」にする
love.graphics.setColor(0,0,0,1)
-- フェード進行度合い(全グリッド中、いくつまで黒塗りにするか?)
local progress = #self.grids * self.fadeRate
-- 全グリッドでループして、
for i = 1, #self.grids, 1 do
-- 現在のフェード進行度に応じた個数まで、黒塗りする
if ( i <= progress ) then
local x = self.grids[i].x
local y = self.grids[i].y
love.graphics.rectangle ( "fill", x, y, self.gridSize, self.gridSize )
end
end
-- 描画色を戻しておく
love.graphics.setColor(r,g,b,a)
end
end
--=========================================================-- 更新--=========================================================
this.update = function(self, dt)
if ( self.nextScene == "" ) then -- フェードアウト中は更新停止とする
self.sceneList [ self.currentScene ] : update(dt)
end
-- フェードがセットされていればフェード処理を更新
if ( self.fadeObj ) then
self.fadeObj:update()
-- フェード処理の終了判定
if ( self.fadeObj.phase == "" ) then
self.fadeObj = nil
end
end
-- フェードがセットされていればフェードを描画
if ( self.fadeObj ) then
self.fadeObj:draw()
end
end
--=========================================================-- マウス入力受付--=========================================================
this.mousereleased = function ( self, x, y, button )
if ( self.sceneList[self.currentScene].mousereleased ) then
self.sceneList[self.currentScene]:mousereleased ( x, y, button )
end
end
--=========================================================-- 次のシーンへ遷移--=========================================================
this.changeScene = function ( self, nextSceneName )
Lua自体には Java や C++ のような「クラスッッ!!」というそのものスバリの機能はなく、
「テーブル」という配列と連想配列のオイシイところを合わせた感じの機能を利用して同等の機能をゴリゴリと実現します。
サンプルソース
ClassSample = {}
ClassSample.new = function ()
local this = {}
this.property1 = 0
this.property2 = 0
this.property3 = 0
this.method1 = function ( self )
self.property1 = 10
end
this.method2 = function ( self, value )
self.property2 = value
end
this.method3 = function ( self, value1, value2 )
self.property3 = value1 + value2
end
return this
end
テーブルには関数を代入することも可能です。
new というコンストラクタっぽい名前で関数を代入というか定義し、
「ひとそろいのプロパティとメソッド」を持ったテーブルを戻り値として返却しています。
これで「インスタンス生成」のようなことを実現しています。