반응형
어제 했던 소스는 아래와 같습니다.
require ("physics")
function main()
setUpPhysics()
createBall()
end
function setUpPhysics()
physics.start()
physics.setGravity(0,0)
end
function createBall()
ball = display.newCircle( display.contentWidth / 2, display.contentHeight / 2, 10 )
physics.addBody(ball, "dynamic", {friction=0, bounce = 1, radius=ballRadius})
ball:setLinearVelocity(75, 150)
end
main()
정리하자면 공을 만들고 그 공에 physics 엔진을 적용하고 움직이는 것 까지 했습니다.
오늘은 벽을 만들어서 그 벽에 공이 튀게 만들겠습니다.
일단 함수 이름은 createWalls()로 하고 사각형으로 그려보겠습니다.
function createWalls()
local wallThickness = 10
-- Left wall
local wall = display.newRect( 0, 0, wallThickness, display.contentHeight )
-- Top wall
wall = display.newRect(0,0, display.contentWidth, wallThickness)
-- Right wall
wall = display.newRect(display.contentWidth - wallThickness, 0, wallThickness, display.contentHeight)
-- Bottom wall
wall = display.newRect(0, display.contentHeight - wallThickness, display.contentWidth, wallThickness)
end
벽 두께는 10픽셀로 합니다.
그리고 main()함수에서 이 createWall() 함수를 Call 하세요.
이제 사방에 벽이 생겼습니다.
실행하면 공이 벽을 지나쳐서 갑니다.
저 벽에 공이 튀게 만드려면 이 wall들에 addBody를 해 주면 됩니다.
지금까지의 소스는 아래와 같습니다.
require ("physics")
function main()
setUpPhysics()
createWalls()
createBall()
end
function setUpPhysics()
physics.start()
physics.setGravity(0,0)
end
function createBall()
ball = display.newCircle( display.contentWidth / 2, display.contentHeight / 2, 10 )
physics.addBody(ball, "dynamic", {friction=0, bounce = 1, radius=ballRadius})
ball:setLinearVelocity(75, 150)
end
function createWalls()
local wallThickness = 10
-- Left wall
local wall = display.newRect( 0, 0, wallThickness, display.contentHeight )
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Top wall
wall = display.newRect(0,0, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Right wall
wall = display.newRect(display.contentWidth - wallThickness, 0, wallThickness, display.contentHeight)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Bottom wall
wall = display.newRect(0, display.contentHeight - wallThickness, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
wall.type = "bottomWall"
end
main()
이제 실행하면 공이 계속 벽면에 튀게 됩니다.
여기서 유심히 볼 점은 벽면 모두 변수 이름이 wall입니다. 이 변수를 한번 만들어서 계속 재활용 한 겁니다.
그리고 맨 마지막에 bottom Wall을 만들었고 type을 bottomWall이라고 명명했습니다.
이는 다른 세 벽은 공이 맞고 튀기만 하면 되고 아래 벽엔 맞으면 다른 핸들링을 하기 위해서 이렇게 한 겁니다.
이 부분은 나중에 구현 해 보겠습니다.
이제 아래에 paddle을 한번 만들어 볼까요?
밑에 적당한 위치에 적당한 길이의 사각형을 만들겠습니다.
function createPaddle()
local paddleWidth = 100
local paddleHeight = 10
local paddle = display.newRect( display.contentWidth / 2 - paddleWidth / 2, display.contentHeight - 50, paddleWidth, paddleHeight )
end
보시는 대로 왼쪽 오른쪽 길이(Width)는 100픽셀이고 높이는 10픽셀인 사각형을 그리고 이것을 가운데에 위치시킵니다.
실행 시키면 아직까지 paddle에 physics를 적용하지 않았기 때문에 공은 그냥 통과합니다.
여기에 physics를 아래와 같이 적용하세요.
physics.addBody(paddle, "static", {friction=0, bounce=1})
이러면 공이 지나가다가 이 paddle에 맞으면 튀게 됩니다.
여기에 유저가 paddle을 움직일 수 있도록 하는 기능을 다뤄야 하는데요.
이 기능은 다음 강좌에서 하게 될 겁니다.
이번엔 벽돌들을 만들어 볼까요?
createBricks() 함수를 만드세요.
그리고 사각형을 만들께요. Width는 40 Height는 20으로 하겠습니다.
local brickWidth = 40
local brickHeight = 20
local brick = display.newRect( 50, 50, brickWidth, brickHeight )
brick:setFillColor(50, 250, 100, 255)
전체 소스는 아래와 같습니다.
require ("physics")
function main()
setUpPhysics()
createWalls()
createBall()
createPaddle()
createBricks()
end
function setUpPhysics()
physics.start()
physics.setGravity(0,0)
end
function createBall()
ball = display.newCircle( display.contentWidth / 2, display.contentHeight / 2, 10 )
physics.addBody(ball, "dynamic", {friction=0, bounce = 1, radius=ballRadius})
ball:setLinearVelocity(75, 150)
end
function createWalls()
local wallThickness = 10
-- Left wall
local wall = display.newRect( 0, 0, wallThickness, display.contentHeight )
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Top wall
wall = display.newRect(0,0, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Right wall
wall = display.newRect(display.contentWidth - wallThickness, 0, wallThickness, display.contentHeight)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Bottom wall
wall = display.newRect(0, display.contentHeight - wallThickness, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
wall.type = "bottomWall"
end
function createPaddle()
local paddleWidth = 100
local paddleHeight = 10
local paddle = display.newRect( display.contentWidth / 2 - paddleWidth / 2, display.contentHeight - 50, paddleWidth, paddleHeight )
physics.addBody(paddle, "static", {friction=0, bounce=1})
end
function createBricks()
local brickWidth = 40
local brickHeight = 20
local brick = display.newRect( 50, 50, brickWidth, brickHeight )
brick:setFillColor(50, 250, 100, 255)
end
main()
이제 벽돌이 하나 생겼습니다.
저 벽돌에 공이 맞았을 때 튀게하려면 지금까지 다른 객체에 했던 식으로 addBody를 하면 됩니다.
그런데 여기서 생각해야 할 점은 벽돌은 1개가 아니라 수십개가 만들어 져야 합니다.
저런식으로 하나하나 각각 위치와 색을 지정해서 벽돌을 만들어도 됩니다.
그런데 그러면 프로그램 답지가 않습니다.
for문을 사용해서 간단하게 벽돌들을 만들겠습니다.
저런 벽돌을 좌우로 6개씩 4줄 총 24개를 만드는 로직을 구현하겠습니다.
아까 벽돌의 두께와 높이는 40,20으로 정했구요.
numOfRows=4, numOfCols = 6 을 추가하겠습니다.
그리고 첫 시작점은 아래와 같이 잡습니다.
local topLeft = {x= display.contentWidth / 2 - (brickWidth * numOfCols ) / 2, y= 50}
이 벽돌은 처음 1줄 6개를 그리고 그 다음 줄 6개 그리는 식으로 4번 작업을 할 겁니다.
그 로직은 아래와 같습니다.
local row
local col
for row = 0, numOfRows - 1 do
for col = 0, numOfCols - 1 do
-- Create a brick
local brick = display.newRect( topLeft.x + (col * brickWidth), topLeft.y + (row * brickHeight), brickWidth, brickHeight )
brick:setFillColor(math.random(50, 255), math.random(50, 255), math.random(50, 255), 255)
end
end
벽돌색은 Random하게 지정했습니다.
여러분 취향대로 라인별로 색을 지정해도 되고 열 별로 지정해도 되고 마음대로 바꾸셔도 됩니다.
여기에 이 벽돌을 맞고도 공이 튀어나오게 하려면 각 벽돌에 addBody를 하면 됩니다.
그리고 type은 destructible로 명명합니다.
나중에 무딪히면 없애야 되거든요.
벽돌에 addBody를 한 오늘의 최종 소스코드는 아래와 같습니다.
require ("physics")
function main()
setUpPhysics()
createWalls()
createBall()
createPaddle()
createBricks()
end
function setUpPhysics()
physics.start()
physics.setGravity(0,0)
end
function createBall()
ball = display.newCircle( display.contentWidth / 2, display.contentHeight / 2, 10 )
physics.addBody(ball, "dynamic", {friction=0, bounce = 1, radius=ballRadius})
ball:setLinearVelocity(75, 150)
end
function createWalls()
local wallThickness = 10
-- Left wall
local wall = display.newRect( 0, 0, wallThickness, display.contentHeight )
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Top wall
wall = display.newRect(0,0, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Right wall
wall = display.newRect(display.contentWidth - wallThickness, 0, wallThickness, display.contentHeight)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Bottom wall
wall = display.newRect(0, display.contentHeight - wallThickness, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
wall.type = "bottomWall"
end
function createPaddle()
local paddleWidth = 100
local paddleHeight = 10
local paddle = display.newRect( display.contentWidth / 2 - paddleWidth / 2, display.contentHeight - 50, paddleWidth, paddleHeight )
physics.addBody(paddle, "static", {friction=0, bounce=1})
end
function createBricks()
local brickWidth = 40
local brickHeight = 20
local numOfRows = 4
local numOfCols = 6
local topLeft = {x= display.contentWidth / 2 - (brickWidth * numOfCols ) / 2, y= 50}
local row
local col
for row = 0, numOfRows - 1 do
for col = 0, numOfCols - 1 do
-- Create a brick
local brick = display.newRect( topLeft.x + (col * brickWidth), topLeft.y + (row * brickHeight), brickWidth, brickHeight )
brick:setFillColor(math.random(50, 255), math.random(50, 255), math.random(50, 255), 255)
brick.type = "destructible"
physics.addBody(brick, "static", {friction=0, bounce = 1})
end
end
end
main()
이제 공이 벽돌에 부딪히면 벽돌이 없어지고 아래 벽에 부딪히면 게임이 새로 시작하고 paddle을 유저가 좌우로 움직이도록 하는 작업이 남았습니다.
내일은 이 작업에 대해 알아보겠습니다.
require ("physics")
function main()
setUpPhysics()
createBall()
end
function setUpPhysics()
physics.start()
physics.setGravity(0,0)
end
function createBall()
ball = display.newCircle( display.contentWidth / 2, display.contentHeight / 2, 10 )
physics.addBody(ball, "dynamic", {friction=0, bounce = 1, radius=ballRadius})
ball:setLinearVelocity(75, 150)
end
main()
정리하자면 공을 만들고 그 공에 physics 엔진을 적용하고 움직이는 것 까지 했습니다.
오늘은 벽을 만들어서 그 벽에 공이 튀게 만들겠습니다.
일단 함수 이름은 createWalls()로 하고 사각형으로 그려보겠습니다.
function createWalls()
local wallThickness = 10
-- Left wall
local wall = display.newRect( 0, 0, wallThickness, display.contentHeight )
-- Top wall
wall = display.newRect(0,0, display.contentWidth, wallThickness)
-- Right wall
wall = display.newRect(display.contentWidth - wallThickness, 0, wallThickness, display.contentHeight)
-- Bottom wall
wall = display.newRect(0, display.contentHeight - wallThickness, display.contentWidth, wallThickness)
end
벽 두께는 10픽셀로 합니다.
그리고 main()함수에서 이 createWall() 함수를 Call 하세요.
이제 사방에 벽이 생겼습니다.
실행하면 공이 벽을 지나쳐서 갑니다.
저 벽에 공이 튀게 만드려면 이 wall들에 addBody를 해 주면 됩니다.
지금까지의 소스는 아래와 같습니다.
require ("physics")
function main()
setUpPhysics()
createWalls()
createBall()
end
function setUpPhysics()
physics.start()
physics.setGravity(0,0)
end
function createBall()
ball = display.newCircle( display.contentWidth / 2, display.contentHeight / 2, 10 )
physics.addBody(ball, "dynamic", {friction=0, bounce = 1, radius=ballRadius})
ball:setLinearVelocity(75, 150)
end
function createWalls()
local wallThickness = 10
-- Left wall
local wall = display.newRect( 0, 0, wallThickness, display.contentHeight )
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Top wall
wall = display.newRect(0,0, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Right wall
wall = display.newRect(display.contentWidth - wallThickness, 0, wallThickness, display.contentHeight)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Bottom wall
wall = display.newRect(0, display.contentHeight - wallThickness, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
wall.type = "bottomWall"
end
main()
이제 실행하면 공이 계속 벽면에 튀게 됩니다.
여기서 유심히 볼 점은 벽면 모두 변수 이름이 wall입니다. 이 변수를 한번 만들어서 계속 재활용 한 겁니다.
그리고 맨 마지막에 bottom Wall을 만들었고 type을 bottomWall이라고 명명했습니다.
이는 다른 세 벽은 공이 맞고 튀기만 하면 되고 아래 벽엔 맞으면 다른 핸들링을 하기 위해서 이렇게 한 겁니다.
이 부분은 나중에 구현 해 보겠습니다.
이제 아래에 paddle을 한번 만들어 볼까요?
밑에 적당한 위치에 적당한 길이의 사각형을 만들겠습니다.
function createPaddle()
local paddleWidth = 100
local paddleHeight = 10
local paddle = display.newRect( display.contentWidth / 2 - paddleWidth / 2, display.contentHeight - 50, paddleWidth, paddleHeight )
end
보시는 대로 왼쪽 오른쪽 길이(Width)는 100픽셀이고 높이는 10픽셀인 사각형을 그리고 이것을 가운데에 위치시킵니다.
실행 시키면 아직까지 paddle에 physics를 적용하지 않았기 때문에 공은 그냥 통과합니다.
여기에 physics를 아래와 같이 적용하세요.
physics.addBody(paddle, "static", {friction=0, bounce=1})
이러면 공이 지나가다가 이 paddle에 맞으면 튀게 됩니다.
여기에 유저가 paddle을 움직일 수 있도록 하는 기능을 다뤄야 하는데요.
이 기능은 다음 강좌에서 하게 될 겁니다.
이번엔 벽돌들을 만들어 볼까요?
createBricks() 함수를 만드세요.
그리고 사각형을 만들께요. Width는 40 Height는 20으로 하겠습니다.
local brickWidth = 40
local brickHeight = 20
local brick = display.newRect( 50, 50, brickWidth, brickHeight )
brick:setFillColor(50, 250, 100, 255)
전체 소스는 아래와 같습니다.
require ("physics")
function main()
setUpPhysics()
createWalls()
createBall()
createPaddle()
createBricks()
end
function setUpPhysics()
physics.start()
physics.setGravity(0,0)
end
function createBall()
ball = display.newCircle( display.contentWidth / 2, display.contentHeight / 2, 10 )
physics.addBody(ball, "dynamic", {friction=0, bounce = 1, radius=ballRadius})
ball:setLinearVelocity(75, 150)
end
function createWalls()
local wallThickness = 10
-- Left wall
local wall = display.newRect( 0, 0, wallThickness, display.contentHeight )
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Top wall
wall = display.newRect(0,0, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Right wall
wall = display.newRect(display.contentWidth - wallThickness, 0, wallThickness, display.contentHeight)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Bottom wall
wall = display.newRect(0, display.contentHeight - wallThickness, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
wall.type = "bottomWall"
end
function createPaddle()
local paddleWidth = 100
local paddleHeight = 10
local paddle = display.newRect( display.contentWidth / 2 - paddleWidth / 2, display.contentHeight - 50, paddleWidth, paddleHeight )
physics.addBody(paddle, "static", {friction=0, bounce=1})
end
function createBricks()
local brickWidth = 40
local brickHeight = 20
local brick = display.newRect( 50, 50, brickWidth, brickHeight )
brick:setFillColor(50, 250, 100, 255)
end
main()
이제 벽돌이 하나 생겼습니다.
저 벽돌에 공이 맞았을 때 튀게하려면 지금까지 다른 객체에 했던 식으로 addBody를 하면 됩니다.
그런데 여기서 생각해야 할 점은 벽돌은 1개가 아니라 수십개가 만들어 져야 합니다.
저런식으로 하나하나 각각 위치와 색을 지정해서 벽돌을 만들어도 됩니다.
그런데 그러면 프로그램 답지가 않습니다.
for문을 사용해서 간단하게 벽돌들을 만들겠습니다.
저런 벽돌을 좌우로 6개씩 4줄 총 24개를 만드는 로직을 구현하겠습니다.
아까 벽돌의 두께와 높이는 40,20으로 정했구요.
numOfRows=4, numOfCols = 6 을 추가하겠습니다.
그리고 첫 시작점은 아래와 같이 잡습니다.
local topLeft = {x= display.contentWidth / 2 - (brickWidth * numOfCols ) / 2, y= 50}
이 벽돌은 처음 1줄 6개를 그리고 그 다음 줄 6개 그리는 식으로 4번 작업을 할 겁니다.
그 로직은 아래와 같습니다.
local row
local col
for row = 0, numOfRows - 1 do
for col = 0, numOfCols - 1 do
-- Create a brick
local brick = display.newRect( topLeft.x + (col * brickWidth), topLeft.y + (row * brickHeight), brickWidth, brickHeight )
brick:setFillColor(math.random(50, 255), math.random(50, 255), math.random(50, 255), 255)
end
end
벽돌색은 Random하게 지정했습니다.
여러분 취향대로 라인별로 색을 지정해도 되고 열 별로 지정해도 되고 마음대로 바꾸셔도 됩니다.
여기에 이 벽돌을 맞고도 공이 튀어나오게 하려면 각 벽돌에 addBody를 하면 됩니다.
그리고 type은 destructible로 명명합니다.
나중에 무딪히면 없애야 되거든요.
벽돌에 addBody를 한 오늘의 최종 소스코드는 아래와 같습니다.
require ("physics")
function main()
setUpPhysics()
createWalls()
createBall()
createPaddle()
createBricks()
end
function setUpPhysics()
physics.start()
physics.setGravity(0,0)
end
function createBall()
ball = display.newCircle( display.contentWidth / 2, display.contentHeight / 2, 10 )
physics.addBody(ball, "dynamic", {friction=0, bounce = 1, radius=ballRadius})
ball:setLinearVelocity(75, 150)
end
function createWalls()
local wallThickness = 10
-- Left wall
local wall = display.newRect( 0, 0, wallThickness, display.contentHeight )
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Top wall
wall = display.newRect(0,0, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Right wall
wall = display.newRect(display.contentWidth - wallThickness, 0, wallThickness, display.contentHeight)
physics.addBody(wall, "static", {friction=0, bounce = 1})
-- Bottom wall
wall = display.newRect(0, display.contentHeight - wallThickness, display.contentWidth, wallThickness)
physics.addBody(wall, "static", {friction=0, bounce = 1})
wall.type = "bottomWall"
end
function createPaddle()
local paddleWidth = 100
local paddleHeight = 10
local paddle = display.newRect( display.contentWidth / 2 - paddleWidth / 2, display.contentHeight - 50, paddleWidth, paddleHeight )
physics.addBody(paddle, "static", {friction=0, bounce=1})
end
function createBricks()
local brickWidth = 40
local brickHeight = 20
local numOfRows = 4
local numOfCols = 6
local topLeft = {x= display.contentWidth / 2 - (brickWidth * numOfCols ) / 2, y= 50}
local row
local col
for row = 0, numOfRows - 1 do
for col = 0, numOfCols - 1 do
-- Create a brick
local brick = display.newRect( topLeft.x + (col * brickWidth), topLeft.y + (row * brickHeight), brickWidth, brickHeight )
brick:setFillColor(math.random(50, 255), math.random(50, 255), math.random(50, 255), 255)
brick.type = "destructible"
physics.addBody(brick, "static", {friction=0, bounce = 1})
end
end
end
main()
이제 공이 벽돌에 부딪히면 벽돌이 없어지고 아래 벽에 부딪히면 게임이 새로 시작하고 paddle을 유저가 좌우로 움직이도록 하는 작업이 남았습니다.
내일은 이 작업에 대해 알아보겠습니다.
반응형
'Corona SDK > 샘플 코드 분석' 카테고리의 다른 글
코로나로 뱀 기어디니는 효과 내기 (0) | 2012.02.28 |
---|---|
간단하게 눈발 흩날리는 느낌 주기 (2) | 2012.02.16 |
돈 넣고 돈 먹기(야바위) 모바일 게임 만들기 2 (11) | 2012.01.04 |
돈 넣고 돈 먹기(야바위) 모바일 게임 만들기 1 (2) | 2012.01.03 |
내가 그린 선으로 떨어지는 공 받아내기 (2) | 2011.12.31 |
Corona SDK 화면전환 API (Story Board) (4) | 2011.12.23 |
Level 별 Lock 기능 걸고 푸는 법 (0) | 2011.12.15 |
벽돌 깨기 게임 만들기 -3 (1) | 2011.12.01 |
벽돌 깨기 게임 만들기 -1 (3) | 2011.11.29 |
스티브 잡스 추모 앱 (0) | 2011.11.21 |