메뉴 건너뛰기

창작에 관련된 질문이나 간단한 팁, 예제를 올리는 곳

안녕하세요, 노루발입니다.

오늘로 그래픽 소코반을 끝내기로 했습니다.

아쉽지만 끝내야죠.


일단 걸음수와 이것저것을 뿌려주기로 합니다.

그런데 이미 화면이 꽉 차버려서 뿌려줄 공간이 없네요...

없으면 만들면 되지. 창을 늘립시다.


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


조회 수 :
921
등록일 :
2013.09.18
08:05:48 (*.209.135.92)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=study&document_srl=703968
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
125 Lua 소코반 EX: 그래픽 준비 노루발 2013-09-18 1091
124 RPG Maker MV 로컬라이징 방법 file 똥똥배 2015-10-27 1242
123 중력 처리할때 캐릭터가 낍니다. [2] ㅁㄴㅇㄹ 2012-02-12 1403
122 [Lua] 테이블 노루발 2013-09-17 1431
121 [re] 갑자기 급질문.. [1] 똥똥배 2008-02-08 1555
120 흥크립트 개선점 흑곰 2008-02-08 1584
119 혼돈님께 질문 흑곰 2007-12-25 1600
118 Love2d 여러 플랫폼으로 빌드 자동화 노루발 2014-11-12 1640
117 질문! [4] file DOH 2008-02-14 1641
116 흥크립트, 이건 답변 안해주신듯... [1] 장펭돌 2008-02-02 1676
115 [re] 똥똥배님께 질문 [1] 똥똥배 2008-01-09 1689
114 흥크립트 반전 버그 원인발견, 그리고 그 후폭풍 [4] 똥똥배 2008-01-15 1695
113 흥크립트 질문! [2] 네모상자 2008-01-28 1695
112 흥크립트로 만들 때 알아둘 기본 사항 [6] 대슬 2007-12-01 1697
111 홍크립트에 질문이 있어서 왔스므니다. [3] X-tra 2007-12-07 1705
110 흥크립트 win모드와 전체화면의 속도 차이 있나요? [4] 흑곰 2008-02-13 1707
109 그러고보니, 흥크립트에서.. [1] 장펭돌 2008-03-10 1707
108 {질문}그림에대한 질문일세. [5] 슈퍼타이 2008-01-30 1707
107 흥크립트 궁금한점. [5] 장펭돌 2008-01-31 1713
106 아아, 그렇다면... 흥크립트에서 [1] 장펭돌 2008-02-02 1714