print( '=== love test === : '.._VERSION )
require 'class'
require 'LoveUtil'
require 'EnglishData' -- 問題文データ
--[[
# 概要
瞬間英作文ゲーム。
# ゴール
- 繰り返しやりたくなるようにすること
- まんべんなく出題されること
# 機能
- スコア
- スコア保存機能
- ミス回数集計機能
- 出題グループ選択機能
]]
function strip( str )
local beginIndex = 1
local endIndex = 1
for i=1, #str do
if str:sub(i,i) ~= ' ' and
str:sub(i,i) ~= '\t' then
beginIndex = i
break
end
end
for i=#str, 0, -1 do
if str:sub(i,i) ~= ' ' and
str:sub(i,i) ~= '\t' then
endIndex = i
break
end
end
return str:sub( beginIndex, endIndex )
end
----------------------------------------------------------------------
-- Game
----------------------------------------------------------------------
Game = Class()
Game.State = { GameReady=1, ItemEnter=2, ItemInput=3, ItemLeave=4 }
function Game:init()
self.State = Game.State.GameReady
self.StateBeginTime = love.timer.getTime()
self.ThisFrameInputString = ''
self.CurrentItemIndex = 0
self.CurrentItemIndexRaw = 0
self.CurrentGroupIndex = 1
self.Ready_CursorPos = 1
self.Ready_IsShuffle = false
self.ItemOrder = {}
-- self.Font
-- self.EnglishDataLst
end
function Game:SetFirstItem( is_shuffle )
self:GenerateItemOrder( is_shuffle )
self.CurrentItemIndex = 1
self.CurrentItemIndexRaw = self.ItemOrder[self.CurrentItemIndex]
self.CurrentCollectCount = 0
self.CollectString = self:GetCurrentEnglishData():GetItemTextEnglish( self.CurrentItemIndexRaw )
end
function Game:ChangeNextItem()
if self.CurrentItemIndex >= self:GetCurrentEnglishData():GetItemCount() then
return false
end
self.CurrentItemIndex = self.CurrentItemIndex + 1
self.CurrentItemIndexRaw = self.ItemOrder[self.CurrentItemIndex]
self.CurrentCollectCount = 0
self.CollectString = self:GetCurrentEnglishData():GetItemTextEnglish( self.CurrentItemIndexRaw )
return true
end
function Game:GenerateItemOrder( is_shuffle )
self.ItemOrder = {}
for i=1, self:GetCurrentEnglishData():GetItemCount() do
self.ItemOrder[i] = i
end
if is_shuffle then
for i=1, 40 do
local a = math.random( 10 )
local b = math.random( 10 )
-- print( 'a:'..a..' b:'..b )
self.ItemOrder[a], self.ItemOrder[b] = self.ItemOrder[b], self.ItemOrder[a]
end
end
end
function Game:ChangeState( state )
assert( state == Game.State.GameReady or
state == Game.State.ItemEnter or
state == Game.State.ItemInput or
state == Game.State.ItemLeave )
assert( self.State ~= state )
if state == Game.State.ItemEnter and self.State == Game.State.GameReady then
self:SetFirstItem( self.Ready_IsShuffle )
end
self.State = state
self.StateBeginTime = love.timer.getTime()
end
function Game:GetStateTime()
return love.timer.getTime() - self.StateBeginTime
end
function Game:load()
self.Font = love.graphics.newFont( 'RictyDiscord-Regular.ttf', 20 )
love.graphics.setFont( self.Font )
self.EnglishDataLst = {}
for i=1, #EnglishData_SyunkanEisakubun do
self.EnglishDataLst[i] = EnglishData.new( EnglishData_SyunkanEisakubun[i] )
end
assert( Game.ChangeNextItem )
self:ChangeNextItem()
end
function Game:keypressed( key, unicode )
if self.State == Game.State.GameReady then
if key == 'up' then
self.Ready_CursorPos = self.Ready_CursorPos - 1
if self.Ready_CursorPos < 1 then self.Ready_CursorPos = 1 end
end
if key == 'down' then
self.Ready_CursorPos = self.Ready_CursorPos + 1
if self.Ready_CursorPos > self:GetEnglishDataCount() then self.Ready_CursorPos = self:GetEnglishDataCount() end
end
if key == 'return' then
self.CurrentGroupIndex = self.Ready_CursorPos
self:ChangeState( Game.State.ItemEnter )
end
if key == 's' then
self.Ready_IsShuffle = not self.Ready_IsShuffle
end
elseif self.State == Game.State.ItemEnter then
elseif self.State == Game.State.ItemInput then
if unicode > 31 and unicode < 127 then
self.ThisFrameInputString = self.ThisFrameInputString .. string.char(unicode)
end
if key == 'escape' then
self:ChangeState( Game.State.GameReady )
end
elseif self.State == Game.State.ItemLeave then
end
end
function Game:update( dt )
if self.State == Game.State.GameReady then
elseif self.State == Game.State.ItemEnter then
if self:GetStateTime() > 0.0 then
self:ChangeState( Game.State.ItemInput )
end
elseif self.State == Game.State.ItemInput then
if self.CollectString:lower():find( self.ThisFrameInputString:lower(), self.CurrentCollectCount + 1, true ) == self.CurrentCollectCount + 1 then
self.CurrentCollectCount = self.CurrentCollectCount + #self.ThisFrameInputString
-- 文章が完成したら、次の問題へ
if self.CurrentCollectCount == #self.CollectString then
-- self:ChangeNextItem()
self:ChangeState( Game.State.ItemLeave )
end
end
self.ThisFrameInputString = ''
elseif self.State == Game.State.ItemLeave then
if self:GetStateTime() > 0.5 then
if self:ChangeNextItem() then
self:ChangeState( Game.State.ItemEnter )
else
self:ChangeState( Game.State.GameReady )
end
end
end
end
function Game:draw()
if self.State == Game.State.GameReady then
-- for i=1, self:GetCurrentEnglishData():GetItemGroupCount() do
-- love.graphics.print( i..' : "'..self:GetCurrentEnglishData():GetTitle()..'"', love.graphics.getWidth() / 2, i * 20 )
-- end
LoveUtil.DrawTextCenter( '問題選択', 0, 20 )
LoveUtil.DrawTextCenter( 'シャッフル(sキーで切り替え)', 0, love.graphics.getHeight() - 40 )
if self.Ready_IsShuffle then
LoveUtil.DrawTextCenter( 'ON', 0, love.graphics.getHeight() - 20 )
else
LoveUtil.DrawTextCenter( 'OFF', 0, love.graphics.getHeight() - 20 )
end
for i=1, self:GetEnglishDataCount() do
-- love.graphics.print( i..' : "'..self:GetEnglishData( i ):GetTitle()..'"', love.graphics.getWidth() / 2 - 60, i * 20 )
local posY = i * 20 + 40
local posX, width = LoveUtil.DrawTextCenter( self:GetEnglishData( i ):GetTitle(), 0, posY )
if i == self.Ready_CursorPos then
local r, g, b, a = love.graphics.getColor()
love.graphics.setColor( 128, 128, 255, 96 )
love.graphics.rectangle( 'fill', posX, posY, width, 20 )
love.graphics.setColor( r, g, b, a )
end
end
elseif self.State == Game.State.ItemEnter then
self:DrawJapanese()
self:DrawInputString( false, false )
elseif self.State == Game.State.ItemInput then
self:DrawJapanese()
self:DrawInputString( true, true )
elseif self.State == Game.State.ItemLeave then
self:DrawJapanese()
self:DrawInputString( true, false )
end
end
function Game:GetEnglishDataCount()
return #self.EnglishDataLst
end
function Game:GetEnglishData( index )
return self.EnglishDataLst[index]
end
function Game:GetCurrentEnglishData()
return self.EnglishDataLst[self.CurrentGroupIndex]
end
function Game:DrawJapanese()
local i = self.CurrentItemIndexRaw
LoveUtil.DrawTextCenter( self:GetCurrentEnglishData():GetItemTextJapanese(i),0, love.graphics.getHeight() / 2 - 40 )
end
function Game:DrawInputString( pronpt, cursor )
local posY = love.graphics.getHeight() / 2
local inputStr = ''
if self.CurrentCollectCount > 0 then
inputStr = inputStr .. self.CollectString:sub( 1, self.CurrentCollectCount )
end
inputStrPosX, inputStrWidth = LoveUtil.DrawTextCenter( inputStr, 0, posY )
if pronpt then
-- inputStr = inputStr .. '> '
love.graphics.print( '>', inputStrPosX - 13, posY )
end
if cursor and ( self:GetStateTime() % 2 ) < 1.0 then
love.graphics.print( '|', inputStrPosX + inputStrWidth, posY )
end
end
----------------------------------------------------------------------
-- Love Callback
----------------------------------------------------------------------
function love.load()
GameIns = Game.new()
GameIns:load()
end
function love.keypressed(key, unicode)
-- ignore non-printable characters (see http://w...content-available-to-author-only...e.com/)
-- if unicode > 31 and unicode < 127 then
-- text = text .. string.char(unicode)
-- end
GameIns:keypressed(key, unicode)
end
function love.update(dt)
GameIns:update(dt)
end
function love.draw()
GameIns:draw()
end