메뉴 건너뛰기

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

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

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

아쉽지만 끝내야죠.


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

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

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


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


조회 수 :
913
등록일 :
2013.09.18
08:05:48 (*.209.135.92)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=study&document_srl=703968
List of Articles
번호 제목 글쓴이 조회 수 추천 수 날짜 최근 수정일sort
145 질문 있습니다.. C언어 인거 같은데 [7] 포오ㅏ로 1957   2005-02-24 2008-04-20 17:16
x=0x2F;for(;x>>--x<=x;x--)x<<1; 에서 x=? 이거 답좀.. * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:20)  
144 밑에 포와로님의 질문 답 [4] 대슬 1900   2005-02-24 2008-03-17 04:37
제가 단 맨 처음 댓글, 그리고 흑곰님이 말씀하신 값이 맞습니다. (-2) x = -2 일 때 x>>--x의 값이 x보다 커지면서 for문을 빠져나갑니다. 그리고 for문 다음에 있는 x<<1은 아무 효과도 못 냅니다. 그냥 폼. (효과를 내려고 했으면 x = x<<1처럼 했어야) 그...  
143 흑곰님 질문 [2] 라컨 2015   2005-08-22 2008-03-17 04:37
Dim 출현, 맞춤, 틀림 Private Sub 네모_Click() 맞춤 = 맞춤 + 1 점수 = 점수 + 5 Label2.Caption = "맞춤:" + Str(맞춤) Print Val(맞춤) * Val(점수) End Sub Private Sub Form_Click() 틀림 = 틀림 + 1 Label3.Caption = "틀림:" + Str(틀림) End Sub Priv...  
142 비베 질문 [2] 재피디 1888   2005-09-10 2008-03-17 04:37
그 처음에 그냥 창 뜨지않고 모니터 오른쪽 하단에 시계나오는칸에 뜨게 하는법좀. * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:24)  
141 액션알피지 원거리 무기 질문 [8] 아리포 1741   2006-01-18 2008-03-17 04:37
원거리 무기를 가까이에서쏘면 연속으로 발사됩니다 계속 ;; 아주빠르게 이거 어떻게 고침 * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:24)  
140 여러분 질문있어요. 성심성의껏좀 알려주세요 흑흑 [6] 케르메스 2022   2006-02-11 2008-03-17 04:37
sw = 0; for (j=2; j<WWT; j++) { if ((WWT%j) == 0) { sw = 1; } } if(sw ==1) { cout << "WWT는 정수입니다" } if(sw ==0) { cout << "WWT는 정수가 아닙니다" } -------------------------------------------------------------- 이건 변수인 WWT가 정수인...  
139 [질문]알만툴 게임 [1] 허클베리핀 1974   2006-12-28 2008-03-17 04:37
처음 키면 ascll 로고뜨고 eb!회사 로고뜨는 나오는거 그림 어케바꾸나욤?? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:24)  
138 스크립트 질문좀 하겠습니다....이벤트에 대한것!! [2] 여유 1859   2007-04-23 2008-03-17 04:37
Class Quick_status < Game_Player 아니면 Class Quick_status < Game_Event 어떤걸로 하는것이 옳은 선택일까요 그리고 이벤트의 X,Y좌표 이벤트의 Screen_x,y좌표(화면 XY좌표) 이벤트의 ID 이벤트의 이름 이것들을 나타낼 수 있는 방법을 알려주세요 예) a...  
137 혼돈형한테 질문 (페인트샾 관련) [2] file 장펭돌 939   2007-11-19 2008-03-17 04:37
 
136 혼돈형에게 질문! [3] 장펭돌 1851   2007-11-28 2008-03-17 04:37
만화를 그릴때, 우선 손으로 그리지 않습니까 그럼 그린뒤에 스캔해서 컴퓨터로 옮긴뒤에 펜으로 그려진 선을 잘 보정해 줘야 채색이 가능할텐데, 어떻게 선을 다시 컴퓨터로 그려주나여 그냥, 노가다로 마우스로 원래 펜으로 그린 선을 따라서 그려주는 겅미?...  
135 질문 2가지+1 [2] file Wonder 1964   2007-11-30 2008-03-17 04:37
 
134 홍크립트에 질문이 있어서 왔스므니다. [3] X-tra 1699   2007-12-07 2008-03-17 04:37
제가 홍크립트로 와이드 화면의 게임이 만들고 싶어 질문하러 왔습니다. 메모장으로 해결이 가능 하면 좋겠으나 아마도 무리 겠죠 ㅡ.ㅡ;; 소스를 건드려야 하면 어디를 건드려야 하는지 알려 주셨으면 합니다. 직접 건드리고 싶어서도 문제가 발생하면 많은 ...  
133 [re] 혼돈님께 질문 혼돈 2048   2007-12-25 2008-03-17 04:37
옛날에 뼈대를 그려놓고 일단 게임을 만들자는 주의였는데 나중에 완성하고 나면 고치기도 귀찮고, 그 그래픽에 맞춰 만든 거라서 그냥 그대로 쓰게 되는 경우가 많았음. 그래서 그 다음부터는 처음부터 그래픽 소스를 제대로 준비한 뒤 시작하는 식으로 했습...  
132 혼돈님께 질문 흑곰 1596   2007-12-25 2008-03-17 04:37
혼돈님의 경우에는 게임 그래픽을 언제, 어떻게 준비하나요? 음... 그러니까 대충 뼈대 그래픽을 그려놓고 게임을 완성한 후 그래픽을 고친다 라던가, 그래픽을 전부 작성해두고 게임을 완성한다, 혹은 그래픽을 만들어가며 게임을 제작한다 등등... 다년간의 ...  
131 {질문}그림에대한 질문일세. [5] 슈퍼타이 1703   2008-01-30 2008-03-17 04:37
뭐 만화에서보면 눈이 빛나거나 빠르게 달리는것처럼 효과주고 점프할때 바닥에 ^^ 이런식으로 효과 주는거나 빙글빙글돌때는 주변에 원같은거 그려주고 그런걸 뭐라고 하죠? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:26)  
130 마우스 포인터 바꾸기가 안되네요... +질문2 장펭돌 1748   2008-02-04 2008-03-17 04:37
어떻게 해도 자꾸 마우스 모양이 안보이길래... 아예 mlc 파일을 DATA폴더 밖으로 꺼내고... System.txt와 같이 둔 상태로 그림 파일명이 "마우스" 이므로.. {#커서} "마우스" 이렇게 해봤는데도 안되네요... 으음,, 어떻게 해야하는겁니까... ㅇ 질문 2 "DIVX...  
129 마우서 포인트 바꾸기 질문 다시 ㄱ- [2] 장펭돌 1807   2008-02-05 2008-03-17 04:37
똥똥배님이 알려주신대로, DATA 폴더내에 mlc 파일을 하나 생성하고, 커서에 "파일명" 이렇게 재대로 했는데.. 안됩니다. 똥똥배님은, Global.mlc 를 이용할수 있지만, 저는 Global.mlc 내에 그림파일을 추가시킬수가 없어서 안되는거 아닙니까? * 똥똥배님에 ...  
128 [re] 갑자기 급질문.. [1] 똥똥배 1548   2008-02-08 2008-03-17 04:37
>별 특별한건 아니구요 >변수 강좌 보니까 ? 가 사용되더라구요? >?는 무슨 의미인가요? > >[분기] ([레벨]==16)?91:[분기] >[분기] ([레벨]==15)?92:[분기] >[분기] ([레벨]==14)?93:[분기] >[분기] ([레벨]<=13)?94:[분기] >@이동 [분기] > >여기서 보면 >[...  
127 갑자기 급질문.. 궤레브 1737   2008-02-08 2008-03-17 04:37
별 특별한건 아니구요 변수 강좌 보니까 ? 가 사용되더라구요? ?는 무슨 의미인가요? [분기] ([레벨]==16)?91:[분기] [분기] ([레벨]==15)?92:[분기] [분기] ([레벨]==14)?93:[분기] [분기] ([레벨]<=13)?94:[분기] @이동 [분기] 여기서 보면 [레벨]==16 이런...  
126 질문 하나더. [3] 흑곰 1715   2008-02-13 2008-03-17 04:37
1 아무 것도 없이 빈 줄 혹은 주석이 속도에 영향을 미치는지. @이동 등에서 영향을 미칠 것으로 추측됨. 2 @이동 -1 을 하면 무시되어 다음 줄을 읽게 되나요? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:26)