2015년 4월 20일 월요일

[코로나SDK] 클래스 구현의 간단한 예제

내친김에 간단한 예제를 하나 만들어 보았습니다.


이 동영상 보시면 화면 위에서 운석이 생성되면 인스턴스가 하나 증가(table.insert 사용)하고 아래로 사라지면 인스턴스가 하나 감소(table.remove 사용) 하는 방식으로 동작합니다. 운석을 생성/갱신/소멸시키는 루틴은 외부모듈고 작성하고 main.lua에서는 이것을 단순히 호출하여 실행합니다. 이런 식으로 작성하면 게임 (다른 장르일 수도 있구요) 의 예를 들어서 몬스터들, 총알들, 정보표시객체들 등등으로 구분해서 각각을 별개의 모듈로 관리하여 훨씬 효율적으로 전체를 짜맞출 수 있습니다. 제가 개인적으로 사용하는 방법이라 물론 정답이 아닐 수도 있습니다. 각자만의 방법을 찾아보는 것도 재미있을 것 같습니다.

  main.lua와 ast.lua화일은 아래와 같고 소스는 첨부로 붙였습니다. ast.lua화일은 제 이전 포스트를 이해하셨다면 읽어 내려가는데 큰 무리는 없을 겁니다.

"main.lua"
┌─────────────────────────────
local CAst = require "ast"
local Rand = math.random
CAst.LoadImage() -- 이미지 로드
local function Update()
if Rand(0,10)==1 then -- 임의로 운석 생성
CAst.New()
end
CAst.Update() -- 운석의 위치를 업데이트 하는 함수 호출
CAst.ShowInfo() -- 콘솔창에 정보를 표시하는 함수
end
Runtime:addEventListener("enterFrame", Update)
└─────────────────────────────

"ast.lua"
┌─────────────────────────────
local Rand = math.random
local tIns = table.insert
local tRmv = table.remove

-- 멤버 함수로 붙일 메타테이블 : __index 구현
local mtIndex = {}
function mtIndex:Update()
    self.img.x = self.img.x + self.nSpdX
    self.img.y = self.img.y + self.nSpdY
    if self.img.y > 550 then
        self.bHaveToDispose = true
    end
end

-- 외부에서는 접근하지 못하는 지역변수들
local tInstances = {} -- 인스턴스를 저장할 테이블
local sht — 이미지를 저장할 변수

-- 외부에서 접근할 수 있는 클래스 구현부
local M={}
function M.LoadImage() -- 정적함수 : 이미지를 메모리로 로드
    sht = graphics.newImageSheet("ast.png",
        {frames = {
            {x=0, y=0, width=125, height=125}, -- frame 1
        }
    })
end

function M.DisposeImage() -- 정적함수 : 이미지를 메모리에서 제거
    sht = nil
 end

function M.ShowInfo() -- 정적함수 : 정보 표시
    print("number of instances: "..#tInstances)
end

function M.Update() -- 정적함수 : 전체 인스턴스들 갱신
    for id=#tInstances,1,-1 do -- 전체 인스턴스들을 *역순*으로 검색한다.
        local ast = tInstances[id]
        ast:Update()
        if ast.bHaveToDispose then
            ast.img:removeSelf() -- 이미지를 지우고
            tRmv(tInstances, id) -- 테이블에서 인스턴스를 제거
        end
    end
end

function M.New() -- 정적함수 : 인스턴스 하나를 생성
    local img = display.newImage(sht, 1)
    img.x, img.y = Rand(0,320), -70
    -- 멤버변수 : 이미지, x축속도, y축속도, 부울변수
    local ast = {
        img = img,
        nSpdX = Rand(-2,2),
        nSpdY = Rand(5,10),
        bHaveToDispose = false,
    }

    -- 멤버 함수를 메타테이블로 붙인 후 반환
    setmetatable(ast, {__index = mtIndex})
    table.insert(tInstances, ast)

    return ast
end

return M
└─────────────────────────────

댓글 없음:

댓글 쓰기