iDev/Corona SDK

Corona SDK로 간단한 게임 만들기 Bouncing Ball

KraZYeom 2013. 10. 26. 05:32
반응형

회사 커피숍 스마트 테이블에 있던 게임을 얼핏 보고 생각이 들었던건 "와 게임 만들기 쉽겠다." Corona를 한번 접하고 부터는 간단한 게임은 대충 머릿속에 그려졌다. 물론 난 게임 개발자가 아니여서 3D 게임 같은거나 복잡한 것에 대한 개발은 전혀~ 생각이 떠오르질 않는다.


일단 많은 사람들에게 "만들기가 이렇게 쉬워요!" 라고 말해주고 싶다.  


기본 적인 게임 로직은 아주 간단하다. 노란 공이 통통 튀고 구멍난 곳을 피해서 빨간공을 먹으면 된다. 


코드도 나름 간단하다. 공과 벽을 만들고 물리성질을 부여한다. 그리고 전체 화면의 왼쪽이냐 오른쪽이냐에 따라서 공의 x축 왼쪽방향 또는 오른쪽으로 힘을 약간 준다. 


여기서 삽질한 것이 Object:applyForce()그냥 힘을 주면 되는데, transition.to() 함수로 힘에 따라서 위치값을 주고 떨어지는거 계산을 수시간 했다. transition.to()로 강제로 이동시키면 충돌과 같은 물리현상을 무시해 버린다. 벽을 뚫고 공이 지나간다던지... 


암튼 코드는 엄청 간단하다. 


Score 부분은 튕기면 1씩 증가하게 그냥 샘플로 만들었다. 


레벨 개념, 블럭의 성질을 고무, 나무, 유리(깨지는 것) 등등으로 나누고 로직화 하면 진정한 게임이라고 할 수도 있을 것이다. 



display.setStatusBar(display.HiddenStatusBar)

local physics = require("physics")
physics.start()
physics.setGravity(0, 9.8)
physics.setDrawMode("hybrid") 

local ball = display.newCircle(100, 100, 20)
ball:setFillColor(255, 255, 0)
physics.addBody(ball, "dynamic", {density=1.0, friction=0.3, bounce=1.0, radius = 20})
ball.myName = "ball"

local target = display.newCircle(860, 330, 20)
target:setFillColor(255, 0, 0)
physics.addBody(target, "static", {radius = 20})
target.myName = "target"

local blockMaterial = {density=1.0, friction=0.3, bounce=0.0}

local wall = display.newRect(-90, 240, 200, 20)
physics.addBody(wall, "static", crateMaterial)
wall.rotation = 90
wall.myName = "wall"

local block = display.newRect(0, 350, 200, 20)
physics.addBody(block, "static", crateMaterial)
block.myName = "block"

local block2 = display.newRect(350, 450, 200, 20)
physics.addBody(block2, "static", crateMaterial)
block2.myName = "block"

local block3 = display.newRect(700, 350, 200, 20)
physics.addBody(block3,  "static", crateMaterial)
block2.myName = "block"

local wall2 = display.newRect(790, 240, 200, 20)
physics.addBody(wall2, "static", crateMaterial)
wall2.rotation = 90
wall2.myName = "wall"

local score = 0
local scoreLabel = display.newText("Score : " .. score, 10, 10, display.contentWidth, display.contentHeight * 0.5, native.systemFont, 32)

local function updateScore()
    scoreLabel.text = ("Score : " .. score)
end

local function onCollision( event )
    if ( event.phase == "began" ) then
        score = score + 1
        updateScore()
        if event.object2.myName == "target" then
            print("success!!!")
        end
    elseif ( event.phase == "ended" ) then
    end
end

local function moveBallLeftRightTouch( event )
    if event.phase == "began" then
        if event.x < 430 then
            ballx =  -50
        elseif event.x > 430 then
            ballx =  50
        end
        ball:applyForce( ballx, 0, ball.x, ball.y )
        -- transition.to(ball, {time = 1000, x = ballx, onStart=isTest, onComplete=listener1 })
    end
end

Runtime:addEventListener( "collision", onCollision )
Runtime:addEventListener("touch", moveBallLeftRightTouch )


반응형