레이블이 Corona SDK인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Corona SDK인 게시물을 표시합니다. 모든 게시물 표시

2018년 3월 20일 화요일

CoronaSDK 시작하기



2014. 1. 20. 1:03


시작하기

다음의 시작하기 방법은 최소의 코드로 실행을 하는것의 예이다.
  1. http://www.coronalabs.com/ 사이트에서 CoronaSDK를 다운 받는다.
  2. Corona Simulator를 띄운다.
  3. 원하는 Folder를 만들고 , 파일명을 main.lua 라고 만든다.
  4. 파일안에 code print(“Hello”) 라고 입력하고 , main.lua 파일을 drag해서 Corona Simulator에 떨어 뜨린다.
  • 실행은 되지만 폰 에뮬레이터 화면상에 글자가 출력되는 것이 아니고 Debug Console 창에 Hello 출력된다. ( print 명령어는 debug 창에 문자열을 표시하는 함수 )
  1. File -> Bulid 에서 빌드를 하면 android  apk 파일이 생성된다.
    단 이때 JDK가 깔려 있어야 하고 , 없으면 다운 받는 페이지로 이동해서 설치하면 된다.
  2. apk는 android 장비로 복사해서 실행하면 된다. ( 복사하는 방법은 여러가지가 있으니 각자 알아서 ^^ )

  • config.lua
  • Build.settings
  • 빌드 프로세스에 관련된 파일
  • orientation 항목에 portrait, portraitUpsideDown, landscapeLeft, landscapeRight 등을 셋팅해서 화면의 출력 방향을 설정 할 수 있다.


CoronaSDK에서 Image출력

2014. 1. 20. 1:00



이미지 출력

  1. 단순한 방법으로 화면에 이미지출력
    local bg1 = display.newImage("images/bg.png")
    bg1.x = 0
    bg1.y = 0
    이미지 출력의 기준 위치가 , 로드한 이미지의 중앙으로 되어 있기 때문에 이렇게 하면 아래처럼 화면이 왼쪽과 위로 치우치게 된다.
     이미지 출력이 왼쪽과 위쪽이 잘려있다.

    때문에 아래처럼 코드를 바꿔줘야 한다.
    bg1.x = bg1.width/2
    bg1.y = bg1.height/2 
  2. 하지만 시작 위치 조정 필요성
    Config.lua에서 width = 720,  height = 1280, scale = "letterbox" 으로 했기 때문에 위의 조정만으로 이미지는 0,0 위치에서 출력이 된다.
    하지만 View->View AS->iPad Retina로 바꿔보면
    아래처럼 이미지가 출력 위치가 변하는 것을 볼 수 있다.
     왼쪽에서 오른쪽이 많이 공간이 떠 있다.
    이렇게 되는 이유는 iPad Retina의 화면 크기보다 셋팅한 720X1280이 작기 때문에 Corona에서 center 배치를 하면서 시작위치를 조정했기 때문이다.

    이 조정된 수치를 구하려면 아래 함수를 호출한다.
    local __OX = display.screenOriginX;
    local __OY = display.screenOriginY;

    그래서 아래처럼 값을 가감해 주면 된다.
    bg1.x = bg1.width/2 + __OX
    bg1.y = bg1.height/2 + __OY

    또는
    아래처럼 config.lua를 조정해 자동으로 위치조정하지 않고 무조건 왼쪽,위로 시작점을 조정하는 방법도 있다.
    xAlign = "left",               -- 기본은 center
    yAlign = "top",              -- 기본은 center


  • 여기서 display.screenOriginX 에 대해서 심화 학습
    Config.lua 에서 아래와 같이 설정했다고 하자.
    width = 320,
    height = 480,
    그리고 View As -> iPhone ( iPhone 3 )를 선택하면
    iPhone 3의 해상도가 320, 480 이기 때문에
    screenOriginX = 0 , screenOriginY = 0 이 나온다.

    • 기기별 해상도에 대한 정보는 아래 참고

      값을 아래와 같이 조정해 보자
      width = 340,
      height = 480,

      View As -> iPhone ( iPhone 3 )를 선택하면
      screenOriginX = 0 , screenOriginY = -15 이 나온다.

      340의 해상도에 맞춰서 화면 출력 영역이 자동 조정되고(이미지 확대) , Height 510으로 조정되며(포토샵등의 툴에서 이미지를 320,480으로 만들어서 X 340으로 조정하면 Y 510으로 늘어남을 확인 가능 또는320:480=340:x 로 값을 구할것) 480의 초과값인 30이 상하로 나누어져서 -15로 표시되는 것이다.

      View As -> iPhone 4 를 선택하면 iPhone 4 의 경우 640, 960  iPhone 3의 딱 2배 크기를 가지기에 동일하게 screenOriginY = -15 값이 나온다.

      View As -> iPhone 5를 선택하면 iPhone 5의 해상도는 640,1136 이기에
      640 : 1136 = 340 : x 로 계산하면 x는 603.5가 나온다.
      이때 width 640이기에 2배수가 되고 y 2배수하면 1206이 되고 , 1136 해상도에 부족분은 130이며 이 값을2로 나누면 -61.5 가 된다.
      screenOriginY 를 출력해 보면 -61.5를 확인 할 수 있다.


  • 이때 화면 출력 영역의 실제 크기를 얻으려면 display.actualContentWidth , display.actualContentHeight 값을 가져오면 된다.

    위의 마지막 경우에서 actualContentHeight 를 출력해 보면 603이라고 출력됨을 확인 가능하다.

coronasdk에서 sprite 출력

2014.1.29 0:54

첨부된 study2.zip을 다운 받아 내용을 같이 보기 바람.

  

Sprite 출력

Sprite를 만들어서 Animation 시키는 방법들에 대한 예제는 아래에서 볼 수 있다.

아래의 예제는 위에 있는 여러가지 방법 중에 연속된 스프라이트를 플레이 시키는 내용이다.

Sprite를 사용하려면 아래의 순서를 따른다.
  • 이미지 파일 정보 선언
  • 이미지 파일 로딩
  • Animation Sequence Data 선언
  • Sprite 개체 생성 및 속성 설정
  • Play

    각각의 소스는 아래와 같다.

  • 이미지 파일 정보 선언
    local sprImgData = {
    width=150,        -- 한 개의 Sprite width
    height=150,
    numFrames=8,    -- 이미지 속에 들어있는 스프라이트 개수 , 150X150이 몇 개인지
    sheetContentWidth=1200,           -- 150인 것이 8개이면 1200
    sheetContentHeight=150
    }

  • 이미지 파일 로딩
    local sprSheet = graphics.newImageSheet( "images/parrot.png", sprImgData )
    위에 선언한 것을 기준으로 파일을 읽는다.

  • Animation Sequence Data 선언
    sequenceData =
    {
        {
               name = "spr1", -- Animation Sequence의 이름
               start=1,                      -- 몇번째에서 시작인가 , 처음이 1부터 시작
               count=4,          -- 이미지 몇장을 animation 할지
               time=2000 ,       -- animation 시작부터 끝까지 걸리는 시간은
               loopCount = 1   -- 몇번 반복할 것인가 ?
               },
        {
               name = "spr2",
               start=5,
               count=4,
               time=1000 ,
               loopCount = 0},  -- loopCount값의 default 0 (무한히 반복)
    }

  • Sprite 개체 생성 및 속성 설정
    local Spr1 = display.newSprite( sprSheet, sequenceData )   -- sprite object 생성
    Spr1:setSequence( "spr1")  -- animation sequence 이름 지정
    Spr1.x = 200      -- 출력 좌표
    Spr1.y = 200

  • Play
    Spr1:play()         -- 애니메이션 시작

  • Animation 출력되고 다른 Animation으로 전환 시키기
    function SpriteListener(event)
        if event.phase == "ended" then          -- 
               event.target:setSequence( "spr2")
            event.target:play()
        end
    end

    Spr1:addEventListener( "sprite", SpriteListener )

    위 소스에서 Spr1:setSequence( "spr1") 을 통해서 첫번째 애니메이션이 시작되고
    addEventListener()를 통해서 Animation 진행상태에 따라 SpriteListener() 함수를 호출 하게 된다.

    ⓐ 를 보면 ,
    첫번째 “spr1” Animation Sequence가 끝나면 두번째 “spr2”로 지정하는 것을 알 수 있으면 이것의 무한 루프로Animation 이 되기 때문에 계속 해서 loop를 도는 것을 알 수 있다.

    SpriteListener() 함수에 아래와 같은 내용을 통해 디버그 창으로 진행 상황을 표시할 수 있다.
    print( "Sprite event: " .. event.phase )

    • Event의 상태 변화는
      무한 play 일 경우
      begin -> next … next -> loop -> next … next -> loop : next animation cut 수에 따른다.
      1회 지정 play일 경우
      begin -> next … next -> ended

효과 ( dodge, screen 등등 )

Corona에서는 기본적으로 blendMode 라는 속성을 통해서  add(dodge) , multiply, screen 등의 effect를 제공하고 있다.

dodge는 화염 효과등에(노란색/붉은색) 많이 사용되고 , multiply는 그림자, screen은 빛(흰색)나는 효과를 줄 때 많이 사용한다.

아래 소스는 이러한 효과를 체험 할 수 있게 한다.
local StarSpr = display.newImage( "images/star1.png" )
StarSpr.x = math.random(__OX, __W+__W/2)
StarSpr.y = math.random(__OY - 50 , __H/2 )
StarSpr.blendMode = "add"         -- dodge
local nScale = math.random(1,5)
StarSpr.xScale = nScale               -- 스프라이트 확대/축소
StarSpr.yScale = nScale

local OldTime = system.getTimer()
-- main process
function GameProgress()
    if (system.getTimer() - OldTime > 2000) then
        OldTime = system.getTimer()
       
        StarSpr.x = math.random(__OX, __W)
        StarSpr.y = math.random(__OY, __H )
        nScale = math.random(1,5)
        StarSpr.xScale = nScale
        StarSpr.yScale = nScale
    else
        StarSpr.rotation = StarSpr.rotation + 10      -- 이미지/스프라이트 회전
        nScale = nScale + 0.3
        StarSpr.xScale = nScale
        StarSpr.yScale = nScale
    end
end

timer.performWithDelay(10, GameProgress ,0)  -- 계속 호출 하려면 마지막에 0 


performWithDelay()는 지정한 함수를(GameProgress) 호출한 뒤에 , 지정 시간 뒤(100) 다시 그 함수를(GameProgress) 호출 할 때 사용한다.

CoronaSDK에서 TexturePacker로 생성한 imagesheet 사용하기

2014. 1. 20. 0:38
프로젝트 다운로드

TexturePacker Sprite 이미지를 packing하는 툴이다 

이 툴은 각각의 Sprite 이미지를 뭉쳐서 하나의 파일을 만들어 주는 기능과 생성된 Sprite들의 좌표를 따서 Mobile 개발에 많이 사용하는 Cocos2d-x , Unity, CoronaSDK등의 툴에서 사용할 수 있게 image sheet를 생성해 주는 기능을 가지고 있다.

아래 URL에서는 각각 툴에서 사용하는 방법들에 대한 설명을 하고 있다.


아래는 Corona Image Sheet에 맞춰 정보 파일을 만드는 방법을 설명하고 있다.


간략하게 TexturePacker를 사용하는 방법을 알아보자.


1. 원하는 이미지들을 Drag & Drop으로 TexturePacker에 떨어뜨린다. 
 

탐색기에서 이미지를 툴의 A부분 Sprites 박스에 떨어뜨린다 
    • 미리 준비한 이미지의 파일번호가 동일해야 그 순서에 맞춰 image sheet sprite 정보가 올바르게 저장된다.
    • 폴더 별로 이미지를 구분해서 저장해야 위와 같이 구분된 sprite 가 만들어 지며 Sprite sheet도 구분해서 만들어 진다. ( 아래에 image sheet 부분 참고 )
    • 위의 A에 있는 이미지는 첨부된 study.zip을 받아서 'data' 폴더를 보면 들어 있는 내용이다.

2. B Data Format Corona SDK 로 선택하고 , C Publish를 클릭하면 다음과 같이 image sheet가 만들어 진다. ( sprite_set.lua 라고 파일명 지정 , study.zip 내용 참고 ) 
  
내부에 sheet의 정보와(이미지의 좌표등등기본적으로 getSheet() , getFrameIndex() 함수가 자동으로 생성됨을 알 수 있다 

3. Image Sheet 파일 불러오기  

local sprSheetInfo = require("sprite_set")
local sprImageSheet = graphics.newImageSheet( "images/sprite_set.png", sprSheetInfo:getSheet() )


  • Require : 외부 파일을 불러 들이는 명령어
  • sprSheetInfo는 라이브러리 패키지가 되고 거기 있는 getSheet() 함수를 호출할 때는 sprSheetInfo:getSheet() 이러한 방법을 이용한다. 

4. Sprite 출력
  1. local GirlSpr = display.newSprite ( sprImageSheet, {frames={sprSheetInfo:getFrameIndex("girl1")}} )

  2. 이렇게 하면 한장의 이미지를 출력할 수 있다.  
    하지만 이 방법으로 연속된 Sprite 이미지 출력에는 불편함이 있다.
    다음의 코드를 추가하자.



5. Sequence Data 추가 ( sprite_set.lua에 수동으로 추가 )
  1. Sprite_set.lua의 마지막 return SheetInfo 위에 아래 코드를 추가 한다.
  2. TexturePacker에서는 아래코드를 자동으로 생성해 주지 않기 때문에 이것은 수동으로 추가해야 한다.   

    SheetInfo.sequenceData = {
        {
        name = "girl",
        start = 1,                -- girl sprite의 시작 위치
        count = 7,               -- 개수
        time = 2200,            -- animation 표시 시간
        loopCount = 0,         -- 반복 횟수 ( 0은 무한 )
        loopDirection = "forward"      -- sprite animation 진행 방향
        },
       
        {
        name = "magic",
        start = 8,                -- magic sprite의 시작 위치
        count = 5,
        time = 2200,
        loopCount = 0,
        loopDirection = "forward"
        }
       
    }

    function SheetInfo:getSequenceData ()
        return self.sequenceData;
    end 
6. Animation Play
  1. 아래의 코드를 보자.
    local GirlSpr2 = display.newSprite( sprImageSheet , sprSheetInfo:getSequenceData() )
    -- Sequence Data를 이용해서 Animation Sprite를 불러 오고 
  2. GirlSpr2:setSequence("girl")
    -- 두개의 animation 중에 ‘girl’을 적용 시킨뒤
  3. GirlSpr2:play()
    -- animation  Play 시킨다.

첨부된 소스 코드를 보면 이해가 쉽게 될것 이다.