이번에는 배경이 날라오는 것을 구현하도록 하겠습니다.
랜덤으로 무조건 물체가 날아 오는것은 재미가 없을겁니다.
그래서 몇개의 그룹을 만들고 점차 어려워 지게 할 예정인데요.
A 그룹 B 그룹 C 그룹 D 그룹이 있다면 처음에는 A-B-C 에서 결정이 되다가 시간이 지나면 B-C-D 그룹에서 결정이 되고 점차 어려워질 수 있도록 할예정인데 일단은 몇개의 그룹을 랜덤하게 설정하고 그룹이 끝나면 다음 그룹으로 넘어가도록 구현해볼 예정입니다.
이전과 다른 점은 triggerGroup.lua 라는것을 만들었습니다.. 이것은 일반 언어의 class와 비슷한 개념으로 이해하면 됩니다.
해당 모듈에서는 물체들의 움직을 만들어 냅니다.
기존 소스와 다른점은 모듈을 추가한 소스와
local trigger = require("triggerGroup")
trigger:init()
eventLoop 내에서 trigger:tick()함수를 호출하는 부분만 다릅니다.
local function eventLoop()
trigger:tick()
local vx, vy = player:getLinearVelocity()
if( vy < 100 )then
player:setLinearVelocity( vx, vy+7 )
end
end
아래는 main.lua의 전체 소스입니다.
display.setStatusBar( display.HiddenStatusBar ) CWidth = display.contentWidth -- Physics local physics = require ("physics") physics.start() --physics.setDrawMode("hybrid") physics.setGravity( 0, 0 ) local trigger = require("triggerGroup") trigger:init() local player_outline = graphics.newOutline( 2, "my.png" ) local player = display.newImage("my.png") player.x = 40 player.y = 150 physics.addBody(player,"dynamic",{ outline=player_outline,density=10 }) player.isFixedRotation = true function flyUp(event) if event.phase == "began" then player:applyForce(0, -1500, player.x, player.y) end end Runtime:addEventListener("touch", flyUp) local function eventLoop() trigger:tick() local vx, vy = player:getLinearVelocity() if( vy < 100 )then player:setLinearVelocity( vx, vy+7 ) end end Runtime:addEventListener( "enterFrame", eventLoop )
eventLoop가 일정 프레임으로 진입하게되면 아래 tick시점에 이벤트가 일어납니다.
-- group 1
{
-- tick, y, type
{30,100,0},
{30,200,0},
{30,300,0}
},
-- group 2
{
-- tick, y, type
{30,100,0},
{30,200,0},
{30,300,0}
},
{
-- tick, y, type
{30,100,0},
{30,200,0},
{30,300,0}
},
-- group 2
{
-- tick, y, type
{30,100,0},
{30,200,0},
{30,300,0}
},
아래는 triggerGroup.lua 입니다.
local M = {} local random = math.random function M:init() print("init") math.randomseed( os.time() ) self.cwidth = display.contentWidth self.frameTick = 0 self.data = { -- group 1 { -- tick, y, type {30,100,0}, {30,200,0}, {30,300,0} }, -- group 2 { -- tick, y, type {30,100,0}, {30,200,0}, {30,300,0} }, } self.currentGroupNum = nil self.currentPC = nil self.nextEventTick = 0 end function M:changeGroup() self.currentGroupNum = random(1,#self.data) print("group selected:",self.currentGroupNum) self.currentPC = 1; -- get tick self.nextEventTick = self.data[self.currentGroupNum][self.currentPC][1] end function M:loadNextInfo() self.frameTick = 0 self.currentPC = self.currentPC + 1 if( self.currentPC > #self.data[self.currentGroupNum] ) then -- all group end self:changeGroup() else self.nextEventTick = self.data[self.currentGroupNum][self.currentPC][1] end end function M:runEvent() local y = self.data[self.currentGroupNum][self.currentPC][2] local gtype = self.data[self.currentGroupNum][self.currentPC][3] if( gtype == 0 ) then local object = display.newRect( self.cwidth + self.cwidth/2 , y, 40, 80 ) physics.addBody(object,"dynamic",{ density=1 }) object:setLinearVelocity(-300,0) end end function M:tick() self.frameTick = self.frameTick + 1 if( self.currentGroupNum == nil ) then -- need to change group self:changeGroup() end if( self.frameTick > self.nextEventTick ) then self:runEvent() self:loadNextInfo() end end return M
댓글 없음:
댓글 쓰기