[lua]
--! \file
--! \brief タッチ割れる
require("strict")
require("input")
math.randomseed(os.time())
local Screen_width = MOAIEnvironment.horizontalResolution or 640
local Screen_height = MOAIEnvironment.verticalResolution or 480
MOAISim.openWindow("touch wareru", Screen_width, Screen_height)
local layer = MOAILayer2D.new()
MOAISim.pushRenderPass(layer)
local viewport = MOAIViewport.new()
viewport:setSize(Screen_width, Screen_height)
viewport:setScale(Screen_width, Screen_height)
layer:setViewport(viewport)
local crack_deck = MOAIGfxQuad2D.new()
crack_deck:setTexture("glass.png")
crack_deck:setRect(-64, -64, 64, 64)
local Max_props = 100
local props = {}
local props_size = 0
local function remove_front_prop(props)
layer:removeProp(props[1])
table.remove(props, 1)
props_size = props_size - 1
end
local function push_back_prop(props, prop)
layer:insertProp(prop)
table.insert(props, prop)
props_size = props_size + 1
end
local function new_prop(x, y, degree)
local prop = MOAIProp2D.new()
prop:setDeck(crack_deck)
prop:setLoc(layer:wndToWorld(x, y))
prop:setRot(degree, 0)
return prop
end
local function update()
while true do
-- タップ位置を取得する
local is_clicked, x, y = clicked_input()
if is_clicked then
if props_size >= Max_props then
-- 最も古い画像を削除して、メモリ使用量が増え続けないようにする
remove_front_prop(props)
end
-- タップされた位置に、画像を表示する
local degree = math.random(0, 360)
push_back_prop(props, new_prop(x, y, degree))
end
coroutine.yield()
end
end
local thread = MOAIThread.new()
thread:run(update)
[/lua]
とりあえず、タッチした場所に割れたようなガラスの画像が表示されます。
さて、次は Google Play への登録です。
Google Play の開発者になるには 2,500 円ほど要求されます。 支払ってしまえば問題なしです。
で、Google Play Developer Console の Web ページにログインして、うきうきしながら touch_wareru.apk をアップロードしようとすると signed パッケージにしろっていうエラーが出ましたが、下記サイトを参考になんとかしました。
このような状態と遷移を実現するにあたり、Lua で State_machine クラスと state モジュールを作成します。State_machine クラスと state モジュール、状態の一つである first_menu_state.lua を順に示します。
state_machine.lua
-- 状態遷移の処理
_G.State_machine = {}
function State_machine:new ()
?? local members = {
????? states_ = {},
????? current_state_ = nil,
?? }
?? State_machine.__index = State_machine
?? setmetatable(members, State_machine)
?? return members
end
function State_machine:set_state (state)
?? self.current_state_ = nil
?? self:change_state(state)
end
function State_machine:change_state (state)
?? if self.current_state_ ~= nil then
????? self.current_state_["Exit"]()
?? end
?? self.current_state_ = state
?? self.current_state_["Enter"]()
end
function State_machine:execute ()
?? if self.current_state_ ~= nil then
????? self.current_state_["Execute"]()
?? end
end
state.lua
-- 状態遷移の初期化
module("state", package.seeall)
require("state_machine")
require("first_menu_state")
require("stage_select_state")
require("stage_play_state")
require("option_state")
require("credit_state")
local state_machine_ = nil
function initialize ()
?? state_machine_ = State_machine.new()
end
function set_state (state)
?? state_machine_:set_state(state)
end
function start ()
?? local thread = MOAIThread.new()
?? local function update_function ()
????? while true do
???????? state_machine_:execute()
???????? coroutine.yield()
????? end
?? end
?? thread:run(update_function)
end
function change_state (state)
?? state_machine_:change_state(state)
end
first_menu_state.lua
-- 最初のメニュー
_G.First_menu_state = {}
First_menu_state["Enter"] =
?? function ()
-- 画面の作成などのセットアップの処理
-- ...
?? end
First_menu_state["Execute"] =
?? function ()
????? -- !!! ボタンが押された時の処理とか
?? end
First_menu_state["Exit"] =
?? function ()
-- システムのクリーンアップの処理
-- ...
?? end
このような仕組みについては O’Reilly から出版されている「ゲーム開発者の AI 入門」や「ゲーム AI プログラミング」に詳しく説明してあります。お勧めです。
「Developing Mobile Games with Moai SDK」という書籍(Amazon で買えます)を読み終えたので、次は github にある moai-dev のサンプルやクラス API のドキュメントを読もうと思う。まずは moai-dev/samples 以下にあるサンプルから。