레이블이 Level Director인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Level Director인 게시물을 표시합니다. 모든 게시물 표시

2015년 11월 6일 금요일

corona sdk 에서 level director 이용 level간 전환과 object class

corona sdk 에서 level director 이용 level간 전환하기


corona sdk에서 story board가 api가 생겨서 변환이 쉽게 되지만 LD에서는 storyboard api 사용 없이도 쉽게 변환 할 수 있습니다.

LD site 예제에서 찾아보았습니다.
V2Demo 예제에서 사용법을 찾아볼 수 있습니다.


function loadScene()
 if (scene > 0) then
  myLevel:removeLevel()
  clickText:removeEventListener("tap",loadScene)
  Runtime:removeEventListener("enterFrame",move)
  Runtime:removeEventListener("touch", drag )
  
  if (toggle) then
   toggle:removeSelf()
   toggle = nil
  end
 end
 
 scene = scene + 1
 
 if (scene > 4) then
  scene = 1
 end
 
 myLevel = LD:loadLevel ('Scene' .. scene)

 --print ('layers ' .. #myLevel.layers)
 clickText = myLevel:getLayerObject("Text","click").view
 clickText:addEventListener( "tap", loadScene )
 initScene()
end

loadScene()

레벨을 로딩할때 LD:loadLevel() 함수를 사용하고 제거시 myLevel:removeLevel() 함수를 사용하면 됩니다.

지난번 animation 작업하던곳에 새로운 level을 만들어서 object가 5번 생성되면 다음 level로 전환되는 예제를 만들어 보도록 하겠습니다.

level01은 기존 그대로 사용하고 level02는 level01을 그대로 복사합니다.

level02



그후에 bird를 삭제하고 y만 남겨두고 위치를 변경합니다.
그리고 itemGet이라는 level을 새로 만듭니다. 복사를 안하고 만들면 asset이 하나도 생기지 않습니다.
level01->level02->itemGet 순으로 level이 변경되도록 제작하겠습니다.

아래는 소스입니다.


physics = require ("physics")
physics.start()

local LD = require("lib.LD_LoaderG2") -- G2 is for Corona Graphic2.0, remove for Graphics1.0
local myLevel ={}

local yobj
local bird

local tPrevious = system.getTimer()
local deltaSum = 0
local level = 0
local count = 0
local tm
local initScene = nil

-------------------------------------------------
--function to position new ball and update scores
-------------------------------------------------
function spawnObject()

 local objProps = 
 {
  name  = "bird_dy", 
  x  = math.random(20,300),
  y  = 0,
  xScale  =  1,
  yScale  =  1,
  assetName = "bird_png_1",
 }
 
 -- set the graphics 
 local bird_d = myLevel:createObject("New Layer", objProps).view
 
 bird_d:setSequence("Sequence0")
 bird_d:play()

 transition.moveTo( bird_d, { x=yobj.x, y=yobj.y, time=8000 } )

end

-------------------------------------
function update(event)
-------------------------------------
 if( level == 1 ) then
  local tDelta = event.time - tPrevious
  tPrevious = event.time
  deltaSum = deltaSum + tDelta;
  
  if (deltaSum > 5000 ) then
   deltaSum = 0
   count = count + 1
   if (count > 5 ) then
    initScene()
    count = 0
    print("initscene",level)
   else
    spawnObject()
   end
  end
 elseif( level == 2 ) then
  local tDelta = event.time - tPrevious
  tPrevious = event.time
  deltaSum = deltaSum + tDelta;
  
  if (deltaSum > 5000 ) then
   deltaSum = 0
   count = count + 1
   if (count > 5 ) then
    level = 10000
    initScene()
    count = 0
    print("initscene",level)
   else
    spawnObject()
   end
  end
 end
end

-- poop collision handler
function onGlobalCollision( event )
 if( level == 1 ) then
  if event.phase == "began" then
   local obj1 = event.object1; 
   local obj2 = event.object2; 
   print (obj1.name)
   print (obj2.name)
   if ( obj1.name == "bird_dy" and obj2.name == "y" ) or 
   ( obj1.name == "y" and obj2.name == "bird_dy" )  then
    if( obj1.name == "y" ) then 
     myLevel:removeLayerObject("New Layer", obj2.name)
     obj2 = nil
    else 
     myLevel:removeLayerObject("New Layer", obj1.name)
     obj1 = nil
    end
   end
  end
 end
end

function initScene(event)
 print("initscene")
 if ( level~=0 ) then
  print("remove")
  myLevel:removeLevel()
  myLevel = nil
 end
 if( level < 10000 ) then
  level = level+1
  myLevel=LD:loadLevel("level0"..level)
 else
  if ( level == 10000 ) then
   myLevel=LD:loadLevel("itemGet")
  end
 end
 print("level",level)

 if ( level == 1 ) then
  bird = myLevel:getLayerObject("New Layer","bird").view
  bird:setSequence("Sequence0")
  bird:play()
  yobj = myLevel:getLayerObject("New Layer","y").view
  yobj:setSequence("Sequence0")
  yobj:play()
 elseif ( level == 2 ) then
  yobj = myLevel:getLayerObject("New Layer","y").view
  yobj:setSequence("Sequence0")
  yobj:play()
 end
end

initScene()

-- add frame handler
Runtime:addEventListener( "enterFrame", update )
Runtime:addEventListener( "collision", onGlobalCollision )


이전 예제에서 잘못구현한 내용이 있는데 동적 object삭제시 아래와 같이 LD api를 이용하여 삭제 하여야 합니다.
myLevel:removeLayerObject("New Layer", obj2.name)
myLevel:removeLayerObject("New Layer", obj1.name)


최종 개선한 코드 입니다.
birdcount 부분을 추가하였습니다. 왜냐하면 이름이 같아버리면 충돌시 삭제할때 어려움이 있었습니다. 충돌시 myLevel:removeLayerObject("New Layer", obj2.name) 함수를 이용하여 object를 제거할때 이름이 같아버려서 오동작을 하는 경우가 있었습니다.
function spawnObject()
birdcount = birdcount + 1
local objProps =
{
name = "bird_dy "..birdcount,



physics = require ("physics")
physics.start()

local LD = require("lib.LD_LoaderG2") -- G2 is for Corona Graphic2.0, remove for Graphics1.0
local myLevel ={}

local yobj
local bird

local tPrevious = system.getTimer()
local deltaSum = 0
local level = 0
local count = 0
local tm
local initScene = nil
local birdcount = 0
-------------------------------------------------
--function to position new ball and update scores
-------------------------------------------------
function spawnObject()
 birdcount = birdcount + 1
 local objProps = 
 {
  name  = "bird_dy "..birdcount, 
  x  = math.random(20,300),
  y  = 0,
  xScale  =  1,
  yScale  =  1,
  assetName = "bird_png_1",
 }
 
 -- set the graphics 
 local bird_d = myLevel:createObject("New Layer", objProps).view
 
 bird_d:setSequence("Sequence0")
 bird_d:play()

 transition.moveTo( bird_d, { x=yobj.x, y=yobj.y, time=math.random(500,10000) } )

end

-------------------------------------
function update(event)
-------------------------------------
 if( level == 1 ) then
  local tDelta = event.time - tPrevious
  tPrevious = event.time
  deltaSum = deltaSum + tDelta;
  
  if (deltaSum > 1000 ) then
   deltaSum = 0
   count = count + 1
   if (count > 50 ) then
    initScene()
    count = 0
    print("initscene",level)
   else
    spawnObject()
   end
  end
 elseif( level == 2 ) then
  local tDelta = event.time - tPrevious
  tPrevious = event.time
  deltaSum = deltaSum + tDelta;
  
  if (deltaSum > 5000 ) then
   deltaSum = 0
   count = count + 1
   if (count > 5 ) then
    level = 10000
    initScene()
    count = 0
    print("initscene",level)
   else
    spawnObject()
   end
  end
 end
end

-- poop collision handler
function onGlobalCollision( event )

 if( level == 1 ) then
  if event.phase == "began" then
   local obj1 = event.object1; 
   local obj2 = event.object2; 

   local sp = string.find(obj1.name," ")
   local obj1_name
   if (sp == nil) then
    obj1_name = obj1.name
   else
    obj1_name = string.sub(obj1.name, 0,string.find(obj1.name," ")-1)
   end
   local sp = string.find(obj2.name," ")
   local obj2_name
   if (sp == nil) then
    obj2_name = obj2.name
   else
    obj2_name = string.sub(obj2.name, 0,string.find(obj2.name," ")-1)
   end
   print (obj1_name, obj1.name)
   print (obj2_name, obj2.name)
   
   if ( obj1_name == "bird_dy" and obj2_name == "y" ) or 
   ( obj1_name == "y" and obj2_name == "bird_dy" )  then
    if( obj1_name == "y" ) then 
     myLevel:removeLayerObject("New Layer", obj2.name)
     obj2 = nil
    else 
     myLevel:removeLayerObject("New Layer", obj1.name)
     obj1 = nil
    end
   end
  end
 end
end

function initScene(event)
 print("initscene")
 if ( level~=0 ) then
  print("remove")
  myLevel:removeLevel()
  myLevel = nil
 end
 if( level < 10000 ) then
  level = level+1
  myLevel=LD:loadLevel("level0"..level)
 else
  if ( level == 10000 ) then
   myLevel=LD:loadLevel("itemGet")
  end
 end
 print("level",level)

 if ( level == 1 ) then
  bird = myLevel:getLayerObject("New Layer","bird").view
  bird:setSequence("Sequence0")
  bird:play()
  yobj = myLevel:getLayerObject("New Layer","y").view
  yobj:setSequence("Sequence0")
  yobj:play()
 elseif ( level == 2 ) then
  yobj = myLevel:getLayerObject("New Layer","y").view
  yobj:setSequence("Sequence0")
  yobj:play()
 end
end

initScene()

-- add frame handler
Runtime:addEventListener( "enterFrame", update )
Runtime:addEventListener( "collision", onGlobalCollision )


충돌 처리가 상당히 복잡해 졌습니다.
그래서 Tool > Options > Project 항목에 Class Types을 이용합니다.

y,brid를 추가하고

object의 Object Class를 변경합니다.
y의 경우 꺼내 놓은 객체를 변경하도록 합니다.

충돌 검사 소스를 변경합니다.


physics = require ("physics")
physics.start()

local LD = require("lib.LD_LoaderG2") -- G2 is for Corona Graphic2.0, remove for Graphics1.0
local myLevel ={}

local yobj
local bird

local tPrevious = system.getTimer()
local deltaSum = 0
local level = 0
local count = 0
local tm
local initScene = nil
local birdcount = 0
-------------------------------------------------
--function to position new ball and update scores
-------------------------------------------------
function spawnObject()
 birdcount = birdcount + 1
 local objProps = 
 {
  name  = "bird_dy "..birdcount, 
  x  = math.random(20,300),
  y  = 0,
  xScale  =  1,
  yScale  =  1,
  assetName = "bird_png_1",
 }
 
 -- set the graphics 
 local bird_d = myLevel:createObject("New Layer", objProps).view
 
 bird_d:setSequence("Sequence0")
 bird_d:play()

 transition.moveTo( bird_d, { x=yobj.x, y=yobj.y, time=math.random(500,10000) } )

end

-------------------------------------
function update(event)
-------------------------------------
 if( level == 1 ) then
  local tDelta = event.time - tPrevious
  tPrevious = event.time
  deltaSum = deltaSum + tDelta;
  
  if (deltaSum > 1000 ) then
   deltaSum = 0
   count = count + 1
   if (count > 50 ) then
    initScene()
    count = 0
    print("initscene",level)
   else
    spawnObject()
   end
  end
 elseif( level == 2 ) then
  local tDelta = event.time - tPrevious
  tPrevious = event.time
  deltaSum = deltaSum + tDelta;
  
  if (deltaSum > 5000 ) then
   deltaSum = 0
   count = count + 1
   if (count > 5 ) then
    level = 10000
    initScene()
    count = 0
    print("initscene",level)
   else
    spawnObject()
   end
  end
 end
end

-- poop collision handler
function onGlobalCollision( event )

--[[
 if( level == 1 ) then
  if event.phase == "began" then
   local obj1 = event.object1; 
   local obj2 = event.object2; 

   local sp = string.find(obj1.name," ")
   local obj1_name
   if (sp == nil) then
    obj1_name = obj1.name
   else
    obj1_name = string.sub(obj1.name, 0,string.find(obj1.name," ")-1)
   end
   local sp = string.find(obj2.name," ")
   local obj2_name
   if (sp == nil) then
    obj2_name = obj2.name
   else
    obj2_name = string.sub(obj2.name, 0,string.find(obj2.name," ")-1)
   end
   print (obj1_name, obj1.name)
   print (obj2_name, obj2.name)
   
   if ( obj1_name == "bird_dy" and obj2_name == "y" ) or 
   ( obj1_name == "y" and obj2_name == "bird_dy" )  then
    if( obj1_name == "y" ) then 
     myLevel:removeLayerObject("New Layer", obj2.name)
     obj2 = nil
    else 
     myLevel:removeLayerObject("New Layer", obj1.name)
     obj1 = nil
    end
   end
  end
 end
]]
 if( level == 1 ) then
  if event.phase == "began" then
   local obj1 = event.object1; 
   local obj2 = event.object2;

   if ( obj1.class == "bird" and obj2.class == "y" ) or 
   ( obj1.class == "y" and obj2.class == "bird" )  then
    if( obj1.class == "y" ) then 
     myLevel:removeLayerObject("New Layer", obj2.name)
     obj2 = nil
    else 
     myLevel:removeLayerObject("New Layer", obj1.name)
     obj1 = nil
    end
   end
  end
 end

end

function initScene(event)
 print("initscene")
 if ( level~=0 ) then
  print("remove")
  myLevel:removeLevel()
  myLevel = nil
 end
 if( level < 10000 ) then
  level = level+1
  myLevel=LD:loadLevel("level0"..level)
 else
  if ( level == 10000 ) then
   myLevel=LD:loadLevel("itemGet")
  end
 end
 print("level",level)

 if ( level == 1 ) then
  bird = myLevel:getLayerObject("New Layer","bird").view
  bird:setSequence("Sequence0")
  bird:play()
  yobj = myLevel:getLayerObject("New Layer","y").view
  yobj:setSequence("Sequence0")
  yobj:play()
 elseif ( level == 2 ) then
  yobj = myLevel:getLayerObject("New Layer","y").view
  yobj:setSequence("Sequence0")
  yobj:play()
 end
end

initScene()

-- add frame handler
Runtime:addEventListener( "enterFrame", update )
Runtime:addEventListener( "collision", onGlobalCollision )


기타 참고 : http://www.retrofitproductions.com/level-director/utility-library/


2015년 10월 31일 토요일

corona sdk 에서 level director 이용 Animation 동적 생성 충돌


지난번에 작업하던것을 이어서, Animation 관련해서 궁금한 점들을 실험해보도록 하겠습니다.

Animation 동적 생성하기

앞의 예제에서는 asset 에서 canvas에 bird를 끌어다 놓았습니다.
게임을 만들다 보면 총알이라던가 적 캐릭터, 폭발 장면등의 경우 그때 그때마다 생성했다가 금방 사라져야 하는 경우 map editor의 고정 위치에 두고 작업을 할 수가 없습니다.
그래서 동적으로 생성해야 하는데요.

Level Director (이하:LD )에서 Assets에있는 object는 언어에서의 intance라고 이해하면 됩니다. 그걸 끌어다가 canvas에 올려놓으면 object가 되는거고요.

그럼 동적으로 만든다는 말은 assets상태로만 존재하는걸 runtime시 생성되게 하는겁니다.

그럼 일정 시간마다 생성되게 하려면 특정 이벤트에 등록해야 할 겁니다.
아래와 같이 할 수 있습니다.

-------------------------------------------------
--function to position new ball and update scores
-------------------------------------------------
local function spawnObject()

 local objProps = 
 {
  name  = "bird_dy", 
  x  = math.random(20,300),
  y  = 0,
  xScale  =  1,
  yScale  =  1,
  assetName = "bird_png_1",
 }
 
 -- set the graphics 
 local bird_d = myLevel:createObject("New Layer", objProps).view
 
 bird_d:setSequence("Sequence0")
 bird_d:play()

 transition.moveTo( bird_d, { x=200, y=200, time=8000 } )

end

-------------------------------------
local function update(event)
-------------------------------------
 local tDelta = event.time - tPrevious
 tPrevious = event.time
 deltaSum = deltaSum + tDelta;
 if (deltaSum > 5000 ) then
  deltaSum = 0
  spawnObject()
 end

end

-- add frame handler
Runtime:addEventListener( "enterFrame", update )


주기적으로 생성된 bird가 200,200으로 날아오는 모습을 볼 수 있습니다.
여기서 assetName은 LD에 있는 asset 이름을 적어주면 되고 name부분은 충돌시 사용하면 도움이 됩니다.





충돌 검사하기


corona sdk에서 충돌 방식 그대로 사용가능하고 canvas에 올려놓으면 올려놓는 object에 직접 속성을 수정하는것에 대해서만 동작을 합니다.

아래 전체 코드를 공개합니다.



physics = require ("physics")
physics.start()

local LD = require("lib.LD_LoaderG2") -- G2 is for Corona Graphic2.0, remove for Graphics1.0
local myLevel = {}
myLevel=LD:loadLevel("level01")  -- Level01 will be the name of your exported level file

local yobj = myLevel:getLayerObject("New Layer","y").view
local bird = myLevel:getLayerObject("New Layer","bird").view
local tPrevious = system.getTimer()
local deltaSum = 0

-------------------------------------------------
--function to position new ball and update scores
-------------------------------------------------
local function spawnObject()

 local objProps = 
 {
  name  = "bird_dy", 
  x  = math.random(20,300),
  y  = 0,
  xScale  =  1,
  yScale  =  1,
  assetName = "bird_png_1",
 }
 
 -- set the graphics 
 local bird_d = myLevel:createObject("New Layer", objProps).view
 
 bird_d:setSequence("Sequence0")
 bird_d:play()

 transition.moveTo( bird_d, { x=yobj.x, y=yobj.y, time=8000 } )

end

-------------------------------------
local function update(event)
-------------------------------------
 local tDelta = event.time - tPrevious
 tPrevious = event.time
 deltaSum = deltaSum + tDelta;
 if (deltaSum > 5000 ) then
  deltaSum = 0
  spawnObject()
 end

end

-- poop collision handler
local function onGlobalCollision( event )
  if event.phase == "began" then
    local obj1 = event.object1; 
    local obj2 = event.object2; 
 print (obj1.name)
 print (obj2.name)
 if ( obj1.name == "bird_dy" and obj2.name == "y" ) or 
    ( obj1.name == "y" and obj2.name == "bird_dy" )  then
    if( obj1.name == "y" ) then 
      display.remove(obj2)
   obj2 = nil
    else 
   display.remove(obj1)
   obj1 = nil
    end
 end
  end
end



bird:setSequence("Sequence0")
bird:play()


yobj:setSequence("Sequence0")
yobj:play()

-- add frame handler
Runtime:addEventListener( "enterFrame", update )
Runtime:addEventListener( "collision", onGlobalCollision )


위 소스에서 동적 object삭제시 아래와 같이 LD api를 이용하여 삭제 하여야 합니다.
display.remove(obj2)  -> myLevel:removeLayerObject("New Layer", obj2.name)
display.remove(obj1)  -> myLevel:removeLayerObject("New Layer", obj1.name)

y라는 이미지를 만들었습니다. 회전시 각기 다른 충돌 영역을 설정할 수 있는지 테스트 하기 위해서 만들었습니다.
결과는 canvas에 끌어다 놓는 시점의 asset의 초기값을 기반으로 우측 상단에 있는 layer에 표시되는 object의 속성값을 가지고 사용하게 됩니다. 또한 애니메이션시 각각의 frame에 있는 충돌정보를 이용하지 않고 끌어다 놓은 시점의 frame만의 충돌 정보를 이용하게 됩니다.


충돌 검사를 하려면 physics enable이 true가 되어야 하고 body type이 dynamic과 static이 되도록 해줍니다. 자세한 사항은 corona sdk 문서를 참고하면 됩니다.
body type이 static끼리는 충돌 검사가 되지 않습니다.
여기에서 y는 static으로 설정하였고 bird는 dynamic으로 설정하였습니다.
충돌시 dynamic이 튕겨나가지 않으려면 IsSensor 항목을 true로 설정해줍니다. 이것도 corona sdk에 있는 내용입니다.





우측 img_20 의 이름을 y로 변경해주고, y가 animation이 되게하려면 asset에서 y_png_1의 속성중에 animation정보를 변경해주도록 합니다.

그러면 회전 하는 y에 bird이 날아들면서 충돌된 bird는 사라지는 예제입니다.
아래는 실행 화면입니다.







2015년 10월 30일 금요일

corona sdk 에서 level director 이용 Animation 하기


Level Director가 생각보다 document가 상세하지 않습니다.
그래서 궁금한점들을 하나씩 시도하면서 문서를 만들어 보도록 하겠습니다.




애니메이션

애니메이션을 하기 위해서는 이미지를 그리거나 구해야 합니다. 일반적으로 연속된 애니메니션을 사용합니다. 여기에서는 제작사에서 제공되는 샘플에 있는 이미지를 이용하도록 하겠습니다.
설치하면 AssetTest 라는 폴더가 있는데 그곳안에 들어있는 이미지 입니다.
bird.png, dog_brown.png

일단 작업 폴더를 만들고 LD_TestAnimation 그 아래 images 폴더를 만들고 이미지를 복사해 둡니다.
lib 폴더도 LD_TestAnimation 아래에 복사합니다. (이곳에는 라이브러리 파일들이 있습니다)
상위에 config.lua 복사하고 main.lua는 나중에 만들도록 합니다.

정리하자면
LD_TestAnimation\images
LD_TestAnimation\lib
LD_TestAnimation\config.lua
LD_TestAnimation\main.lua (빈파일 만듭니다.)




이걸 툴에 넣을때는 assets 윈도우 아래에 있는 작은 화살표 버튼을 이용합니다. TexturePacker 툴이 없기 때문에 Add Asset(s) from Image를 사용합니다. bird.png를 선택하면 popup창이 뜹니다.


bird.png에 들어있는 이미지의 가로 크기와 세로크기를 입력합니다. 즉 애니메이션이 되는 이미지의 크기가 모두 같아야 한다는 의미입니다.
bird.png의 경우 160*200 이미지 이며, 5*5 이므로 160/5=32 200/5=40 즉 32*40 크기가 됩니다. 입력하고 나면 아래와 같이 됩니다.



파일 저장은 LD_TestAnimation\LD_Test.ldf 로 상위에 저장합니다.

bird_png1 번을 선택하고 오른쪽 아래 Properties (Animations)선택합니다.

그러면 다음과 같은 창이 뜨는데 아래와 같이 새로운 애니메이션 시퀀스를 추가합니다.


아래와 같이 값을 조정해서 sequence를 만듭니다.
여기에서 사용하는 인자중에 FrameCount, StartFrame, Time 3개의 값이 가장 중요합니다.


하나는 1000초, 하나는 500초 이면서 framecount와 startframe이 다른 두개의 시퀀스를 만들었습니다.


assets에 있는 bird_png1을 canvas에 끌어다 놓으면 됩니다. 끌어다 놓고서 이름을 bird로 변경하도록 합니다.
그리고 오른쪽 위에 level 명을 변경합니다. level이름에 따라서 파일명이 만들어지게 됩니다.
level을 선택하고 프로퍼티 창의 Name을 변경하면 됩니다.
여기에서는 level01로 변경하겠습니다.

지금까지 한것을 Export 하도록 하겠습니다.
Tools > Options에서 투토리얼 가이드대로 되어있는지 확인합니다.
Option의 Export 항목인데 여기에 From Template 의 경로를 설치한 Level Director\Templete 경로를 맞추어 주면 됩니다.

참고 http://www.retrofitproductions.com/level-director/quick-start-guide/


이제 거의 다되었습니다.
quick guide에 보면 Tips에 아래 내용이 나옵니다.
LevelDirectorSettings =
{
    imagesSubFolder = "images",
    levelsSubFolder = "levels",
}
config.lua를 열어봅니다.

경로가 이번예제에서는 images폴더에 이미지를 넣었기 때문에 아래와 같이 맞추고 level서브폴더를 따로 설정을 안했기 때문에 삭제합니다.
아래와 같습니다.
application =
{
content =
{
fps = 60,
width = 320,
height = 480,
scale = "letterbox"
},

LevelDirectorSettings =
{
imagesSubFolder = "images",
}
}

main.lua의 코드는 아래 documentation에서 가져오면 됩니다.
http://www.retrofitproductions.com/level-director/level-director-documentation/
Export 부분을 보면 되는데 아래와 같이 하면 에러납니다.
physics = require ("physics")
physics.start()
local LD = require("lib.LD_LoaderG2") -- G2 is for Corona Graphic2.0, remove for Graphics1.0
local myLevel = {}
myLevel:loadLevel("Level01")  -- Level01 will be the name of your exported level file
=> 수정
physics = require ("physics")
physics.start()
local LD = require("lib.LD_LoaderG2") -- G2 is for Corona Graphic2.0, remove for Graphics1.0
local myLevel = {}
myLevel=LD:loadLevel("level01")  -- Level01 will be the name of your exported level file
위와같이 하면 이미지는 나오나 아무런 동작도 하지 않습니다.

아래와 같이 하면 새의 애니메이션을 볼 수 있습니다.

physics = require ("physics")
physics.start()
local LD = require("lib.LD_LoaderG2") -- G2 is for Corona Graphic2.0, remove for Graphics1.0
local myLevel = {}
myLevel=LD:loadLevel("level01")  -- Level01 will be the name of your exported level file

local bird = myLevel:getLayerObject("New Layer","bird").view
bird:setSequence("Sequence0")
bird:play()

Corona SDK 애니메이션 관련한 내용은 아래 링크를 참고 바랍니다.

제작사에서 공개하는 유투브 동영상도 있습니다.
https://www.youtube.com/watch?v=OobWSx-0vS8&feature=youtu.be