2016년 2월 5일 금요일

make game as corona sdk (Fly a rocketman)(3)



이번에는 배경이 날라오는 것을 구현하도록 하겠습니다.

랜덤으로 무조건 물체가 날아 오는것은 재미가 없을겁니다.
그래서 몇개의 그룹을 만들고 점차 어려워 지게 할 예정인데요.
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}
},


아래는 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

실행화면 입니다.

물체와 부딧히면 아래와 같은 장면이 연출 됩니다.






댓글 없음:

댓글 쓰기