창작에 관련된 질문이나 간단한 팁, 예제를 올리는 곳
안녕하세요, 노루발입니다.
오늘로 그래픽 소코반을 끝내기로 했습니다.
아쉽지만 끝내야죠.
일단 걸음수와 이것저것을 뿌려주기로 합니다.
그런데 이미 화면이 꽉 차버려서 뿌려줄 공간이 없네요...
없으면 만들면 되지. 창을 늘립시다.
conf.lua를 수정.
function love.conf(t)
t.title = "Lua 소코반 EX!"
t.screen.width = 256
t.screen.height = 288
end
세로를 32 더 늘렸습니다.
그리고 한글을 출력하고 싶으면 한글 폰트가 있어야 합니다.
'은바탕' 폰트를 첨부해 두었습니다.
function love.load()
tile = love.graphics.newImage("nokoban.png")
-- 쿼드 만들기
tileq = {}
for a = 1, 6 do
tileq[a] = love.graphics.newQuad(32 * (a - 1), 0, 32, 32, 192, 32)
end
-- 폰트 불러오기
korfont = love.graphics.newFont("UnBatang.ttf", 15) -- 은바탕 폰트, 15 크기로 불러온다.
end
그리고 love.draw 콜백에서 그립니다.
function love.draw()
tempbuffer = 0
for a = 1, 8 do
for b = 1, 8 do
if (map[a][b] == 0) then
tempbuffer = 3
elseif (map[a][b] == 1) then
tempbuffer = 2
end
for c = 1, #box do
if (box[c]["x"] == b and box[c]["y"] == a) then
tempbuffer = 5
break
end
end
for c = 1, #goal do
if (goal[c]["x"] == b and goal[c]["y"] == a) then
if (tempbuffer == 5) then -- 상자와 목표 지점이 겹친다면
tempbuffer = 6
else
tempbuffer = 4
end
break
end
end
if (playerx == b and playery == a) then
tempbuffer = 1
end
-- 그린다
love.graphics.drawq(tile, tileq[tempbuffer], (b - 1) * 32, (a - 1) * 32)
end
end
-- 글씨를 쓴다.
love.graphics.setFont(korfont)
love.graphics.print("움직임: "..moves, 0, 255)
if (successed() == true) then
love.graphics.print("축하합니다.", 0, 270)
else
love.graphics.print("a: 왼쪽 s: 아래 d: 오른쪽 w: 위", 0, 270)
end
end
모든 상자가 목표 위에 올라간 상태라면 축하 메세지를 띄우고
아니라면 조작을 설명하는 메세지를 띄웁니다.
function love.keypressed(key)
if (successed() == false) then
if (key == "a") then
~~ 너무 길어서 이하 생략
모든 상자가 목표 위에 올라간 상태가 아닐 경우에만 조작의 처리를 실행합니다.
모든 상자가 목표 위에 올라가 있다면 조작의 처리가 실행되지 않습니다.
완성된 버젼의 전체 코드를 요약글로 올립니다.
conf.lua:
function love.conf(t)
t.title = "Lua 소코반 EX!"
t.screen.width = 256
t.screen.height = 288
end
main.lua:
-- 플레이어 위치를 저장하는 변수
-- 초기 시작지점은 5, 5로 설정.
playerx = 5
playery = 5
-- 박스의 위치를 저장하는 배열.
box = {}
-- 박스 목표 지점의 위치를 저장하는 배열.
goal = {}
-- 움직인 횟수 저장
moves = 0
-- 맵 데이터를 저장하는 8*8의 2차원 배열 Map 생성
map = {}
for a = 1, 8 do
map[a] = {}
for b = 1, 8 do
map[a][b] = 0
end
end
function makebox(x, y)
-- 새 박스를 만든다.
box[#box + 1] = {}
box[#box]["x"] = x
box[#box]["y"] = y
end
function makegoal(x, y)
-- 새 목표 지점을 만든다.
goal[#goal + 1] = {}
goal[#goal]["x"] = x
goal[#goal]["y"] = y
end
function successed()
-- 모든 박스가 목표 지점 위에 놓여 있는가?
for a = 1 , #goal do
if boxexist(goal[a]["x"], goal[a]["y"]) == 0 then
return false
end
end
return true
end
-- 맵 데이터 초기화
for a = 1, 8 do
for b = 1, 8 do
if (a == 1 or a == 8 or b == 1 or b == 8) then
map[a][b] = 1
end
end
end
makebox(4,3)
makebox(4,6)
makegoal(5, 3)
makegoal(5, 6)
function boxexist(x, y)
for a = 1, #box do
if (box[a]["x"] == x and box[a]["y"] == y) then
return a
end
end
return 0
end
function love.load()
tile = love.graphics.newImage("nokoban.png")
-- 쿼드 만들기
tileq = {}
for a = 1, 6 do
tileq[a] = love.graphics.newQuad(32 * (a - 1), 0, 32, 32, 192, 32)
end
-- 폰트 불러오기
korfont = love.graphics.newFont("UnBatang.ttf", 15)
end
function love.draw()
tempbuffer = 0
for a = 1, 8 do
for b = 1, 8 do
if (map[a][b] == 0) then
tempbuffer = 3
elseif (map[a][b] == 1) then
tempbuffer = 2
end
for c = 1, #box do
if (box[c]["x"] == b and box[c]["y"] == a) then
tempbuffer = 5
break
end
end
for c = 1, #goal do
if (goal[c]["x"] == b and goal[c]["y"] == a) then
if (tempbuffer == 5) then -- 상자와 목표 지점이 겹친다면
tempbuffer = 6
else
tempbuffer = 4
end
break
end
end
if (playerx == b and playery == a) then
tempbuffer = 1
end
-- 그린다
love.graphics.drawq(tile, tileq[tempbuffer], (b - 1) * 32, (a - 1) * 32)
end
end
-- 글씨를 쓴다.
love.graphics.setFont(korfont)
love.graphics.print("움직임: "..moves, 0, 255)
if (successed() == true) then
love.graphics.print("축하합니다.", 0, 270)
else
love.graphics.print("a: 왼쪽 s: 아래 d: 오른쪽 w: 위", 0, 270)
end
end
function love.keypressed(key)
if (successed() == false) then
if (key == "a") then
if (map[playery][playerx - 1] == 0) then
if (boxexist(playerx - 1, playery) ~= 0) then
if (boxexist(playerx - 2, playery) == 0) then
if map[playerx - 2][playery] == 0 then
box[boxexist(playerx - 1, playery)]["x"] = box[boxexist(playerx - 1, playery)]["x"] - 1
playerx = playerx - 1
moves = moves + 1
end
end
else
playerx = playerx - 1
moves = moves + 1
end
end
elseif (key == "s") then
if (map[playery + 1][playerx] == 0) then
if (boxexist(playerx, playery + 1) ~= 0) then
if (boxexist(playerx, playery + 2) == 0) then
if map[playerx][playery + 2] == 0 then
box[boxexist(playerx, playery + 1)]["y"] = box[boxexist(playerx, playery + 1)]["y"] + 1
playery = playery + 1
moves = moves + 1
end
end
else
playery = playery + 1
moves = moves + 1
end
end
elseif (key == "d") then
if (map[playery][playerx + 1] == 0) then
if (boxexist(playerx + 1, playery) ~= 0) then
if (boxexist(playerx + 2, playery) == 0) then
if map[playerx + 2][playery] == 0 then
box[boxexist(playerx + 1, playery)]["x"] = box[boxexist(playerx + 1, playery)]["x"] + 1
playerx = playerx + 1
moves = moves + 1
end
end
else
playerx = playerx + 1
moves = moves + 1
end
end
elseif (key == "w") then
if (map[playery - 1][playerx] == 0) then
if (boxexist(playerx, playery - 1) ~= 0) then
if (boxexist(playerx, playery - 2) == 0) then
if map[playerx][playery - 2] == 0 then
box[boxexist(playerx, playery - 1)]["y"] = box[boxexist(playerx, playery - 1)]["y"] - 1
playery = playery - 1
moves = moves + 1
end
end
else
playery = playery - 1
moves = moves + 1
end
end
end
end
end