메뉴 건너뛰기

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

-- 플레이어 위치를 저장하는 변수
-- 초기 시작지점은 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
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
end



코드를 펼쳐 보시면 아시겠지만, 바뀐 부분은 얼마 없습니다.

이미 Lua 소코반 글에서 이것저것 해 봤으니 바뀐 부분만 간략히 설명하겠습니다.


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
end

love 게임 엔진을 로드하면서 이미지를 불러오고 쿼드를 만듭니다.

이미지는 전의 글을 참고해 주세요.

쿼드는 for 문을 돌려서 만드는데, 가로 방향으로 32씩 쪼개서 만듭니다.

쿼드 테이블은 1씩 시작하고요.

tileq[1]은 플레이어 캐릭터, tileq[2]는 벽, tileq[3]는 뚫린 공간.. 이런 식으로 나눠집니다.


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
end

메인 루프의 역할을 계속 실행되는 콜백이 담당하게 되었습니다.

tempbuffer를 사용해 이전에는 "#", " ", "@" 등의 문자를 뿌려줬다면

이번에는 몇 번 쿼드를 뿌릴지를 담아뒀다가 뿌리게 됩니다.

-- 그린다 부분은, 현재 좌표 * 타일의 크기를 한 위치에 그리게 됩니다.

마이너스 1을 해 주는 이유는 테이블 인덱스가 1부터 시작하니, 그대로 하면 32,32부터 그려

위와 옆쪽에 각각 한 칸 씩 공백이 생기기 때문입니다.


이것으로 보여주는 부분은 어렵지 않게 완료했습니다만, asdw를 눌러도 전혀 움직이지 않습니다.

움직이는 부분은 하나도 구현하지 않았으니까요.

다음부터는 문자를 입력하고 엔터를 눌러 움직이는 방법에서 탈피하여 키보드를 누르는 즉시 움직이게 해 보겠습니다. 역시 Love2D의 콜백을 이용해서요.


다음에 봅시다.


+

그래픽 이식이 어려워 보이지만 엄청 편하네요.
이전 코드를 복사 붙여넣기 하고 조금만 다듬으면 되니까.

사람들은 겉에 보이는 것을 보고 프로그램을 판단하는 경향이 있는 듯. 아직 완성하지 못한 프로그램이던 게임이던 쓸데없는 기대를 받는 것이 싫다면 팀 내에서 가장 그림 못 그리는 사람이 그린 그래픽을 쓰세요. 그래픽은 나중에 완성되었을 때 정식으로 바꾸면 됩니다. 그럼 사실 아무것도 하지 않았는데도 갑자기 프로젝트가 급 진전 된 것으로 모두에게 생각되고.. 크흠흠.


참고로 포팅은 이식을 뜻함. 예를 들어 원래 PC용으로 만들어진 게임을 스마트폰용으로 이식하는 것을 '게임을 포팅한다' 라고 하기도 합니다. 이 글에서는 텍스트로 만들어진 게임을 그래픽으로 이식했기 때문에 포팅이라고 하였습니다.

조회 수 :
856
등록일 :
2013.09.18
08:03:26 (*.209.135.92)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=study&document_srl=703962
List of Articles
번호 제목 글쓴이 조회 수 추천 수 날짜 최근 수정일sort
165 클릭 문제.... ㄱ- [1] 장펭돌 1801   2008-01-31 2008-03-17 04:37
~클릭 100, 123, 0, 276, 186 @계속 ^100 이벤트 발생! 그림판에서 좌표수를 확인하고나서 123,0 부터 276,186의 위치를 위 처럼 정한뒤 흥크립트 실행후 아무리 클릭해봐도 안되네요... 또하나 궁금증은 창모드가 아닌 전체화 모드에선 마우스가 안나오는데.....  
164 [re] 흥크립트 질문 똥똥배 1782   2008-02-01 2008-03-17 04:37
조금 복잡하지만 이렇습니다... ====================================== [분기] ([레벨]==16)?91:[분기] [분기] ([레벨]==15)?92:[분기] [분기] ([레벨]==14)?93:[분기] [분기] ([레벨]<=13)?94:[분기] @이동 [분기] ^91 당신의 랭크 : S @이동 95 ^92 당신의...  
163 흥크립트 질문 [1] 장펭돌 1733   2008-02-01 2008-03-17 04:37
흥크립트에서 if처럼 변수1이 1이면 어떻게되고 변수1이 2면 어떻게되고 이렇게 어떻게하나요? 역전심판에서 1+1 답 얘기할때, 정답을 말하느냐 오답을 말하느냐에 따라서 달라지는것 처럼 말이죠... 봐도 잘 모르겠네요... * 똥똥배님에 의해서 게시물 이동되...  
162 흥크립트, 이건 답변 안해주신듯... [1] 장펭돌 1669   2008-02-02 2008-03-17 04:37
마우스를 지원하게 하고싶은곳과 지원 안하게 하고싶은곳... 이 두곳을 어떻게 구분하죠? 저같은경우엔 특별한 경우를 제외하곤 마우스가 안나오게 할껀데... 어떻게 해야... 하는지 자세히 설명좀 부탁... ㅈㅅ.. * 똥똥배님에 의해서 게시물 이동되었습니다 ...  
161 아아, 그렇다면... 흥크립트에서 [1] 장펭돌 1712   2008-02-02 2008-03-17 04:37
제가 타이틀을 만들고 나서 @마우스지원 해놓고 나니까 선택지에서 키보드로 선택할수 있는 커서가 사라지더라구요? 이건 원래 그런건지... 키보드로 선택해도 되긴 되는데 커서가 없어서 지금 뭘 고르고 있는건지 알수가 없는데.. 원래 이런건가요? 으음, 그...  
160 흥크립트 AVI 지원에서... [2] file 장펭돌 1823   2008-02-02 2008-03-17 04:37
 
159 흥크립트 기본 바꾸기. [3] 장펭돌 1855   2008-02-03 2008-03-17 04:37
흥크립트 마우스 포인터를 바꾸려는데, system 의 "커서"를 바꾸면 된다구 하셨짢습니까? 그럼, "DATA\XXX.mlc" 이렇게 해야 되는겁니까, 그리구, 기본 커서 크기좀 알려줏메. ps. 또 문제가 생김... 왠일인지 동영상이 그냥 곰플레이어로 재생하면 멀쩡한데, ...  
158 흥크립트에대해. [16] 궤레브 1711   2008-02-06 2008-03-17 04:37
음.. 그냥 몇가지 간단한 질문인데요 그림과 그림이 맞닿앗을때 라는 액션을 만들수 있나요? 만약 그림과 그림이 맞닿앗을때 액션이 없으면 턴알피지밖에 불가능할거같은데 마우스로 눌러서 공격하는 버츄얼캅같은 게임이 아니고선.. 이건 제가 직접 실험해볼...  
157 [re] 흥크립트 질문.. [2] 똥똥배 1797   2008-02-07 2008-03-17 04:37
>흔히 알만툴에서 쓰이는 >조건분기를 어떻게 쓰나요? 펭돌님 말로는 if문이 있다던데.. >그리고.. >흥크립트 테스트인가? 슬라임같이 생긴 사람이 >돌아다니면서 사람들 만나면 대화 나오게 만드신게 있더군요? >거기서처럼 그냥 아무 추가 이벤트가 없어도 ...  
156 흥크립트 질문.. [3] 궤레브 1747   2008-02-07 2008-03-17 04:37
흔히 알만툴에서 쓰이는 조건분기를 어떻게 쓰나요? 펭돌님 말로는 if문이 있다던데.. 그리고.. 흥크립트 테스트인가? 슬라임같이 생긴 사람이 돌아다니면서 사람들 만나면 대화 나오게 만드신게 있더군요? 거기서처럼 그냥 아무 추가 이벤트가 없어도 꺼지지 ...  
155 [re] 흥크립트 개선점 [3] 똥똥배 1928   2008-02-09 2008-03-17 04:37
1. 글자변수 외에 숫자변수도 화면에 표시할 수 있으면 좋겠음 이건 내부적인 문제이기도 한데, 화면에 표시할 때는 위치정보, 색 등 엄청난 데이터가 필요합니다. 글자는 길이가 있고 하니 어차피 덩치가 커서 상관없다고 생각했지만, 숫자변수는 4바이트면 ...  
154 흥크립트 개선점 흑곰 1578   2008-02-08 2008-03-17 04:37
글자변수 외에 숫자변수도 화면에 표시할 수 있으면 좋겠음 글자입력시 아무 것도 안썼으면 다시 입력받을 수 있도록 하면 좋겠음 글자변수도 조건문을 할 수 있으면 좋겠음 if문이 있으면 좋겠음 아이콘 변경이 되었으면 좋겠음(실은 이건 컴파일 문제이지만)...  
153 Divx6를 받아서 인코딩을 하려는데... 에러뜸... [3] 장펭돌 2154   2008-02-09 2008-03-17 04:37
Divx 공식 홈페이지를 가보니, 6가 있길래 받아서 동영상파일 (AVI)를 열면 이렇게 에러가 뜨는군여... ----------------------------------------------------------------- Invalid VIdeo Stream DivX Converter cannot encode the in put file: C:\Document...  
152 조건분기할 때 [5] 흑곰 1745   2008-02-12 2008-03-17 04:37
&& and || or == 같다 != 같지 않다 원래 vc++ 에서 쓰는 것인데 흥크립트에도 쓰여요. (마지막 것은 확인 못해봤음) 흥크립트도 조건문을 활용하면 if문이 가능합니다. if문을 여러개 구현하다보면 그렇게 빠르진 않은 것 같습니다만 * 똥똥배님에 의해서 게...  
151 흥크립트 if-else 문 흉내내기 [4] 똥똥배 1933   2008-02-12 2008-03-17 04:37
이곳 저곳으로 이동다니면 나중에 스크립트를 읽을 때 이해하기 어려우므로 일직선으로 가는 흐름이 이해하기 쉽습니다. 그래서 C에서는 goto는 금기하고 if-else, while등을 씁니다. 뭐, 서론은 이 정도로 하고 흥크립트에서 if-else 문을 흉내내려면 //첫 번...  
150 흥크립트 win모드와 전체화면의 속도 차이 있나요? [4] 흑곰 1698   2008-02-13 2008-03-17 04:37
추억의 냉무 * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:06)  
149 질문! [4] file DOH 1616   2008-02-14 2008-03-17 04:37
 
148 흥크립트 AVI 재생.. [2] 장펭돌 1851   2008-02-14 2008-03-17 04:37
흥크립트 AVI 재생시에 가끔 전체화면으로 게임을 할때, 재생하는부분에서 갑자기 창모드 화면 크기로 영상이 나온 다음 전체화면인 게임은 아래로 최소화 되어 있을때가 가끔있는데요... (이것도 어떨때는 그러고 또 어떤때는 안그럼) 이거 뭐 대체 왜이러는...  
147 흥크립트 원인불명 버그... [3] file 네모상자 738   2008-02-16 2008-03-17 04:37
 
146 그러고보니, 흥크립트에서.. [1] 장펭돌 1693   2008-03-10 2008-03-17 04:37
왠지는 모르겠으나, 저희집 컴퓨터에서는 효과음은 들리지만, 배경음악이 안들렸었습니다.. (엉? 왠지 예전에도 말한적 있는것 같기두 하고...) 아무튼, 어째서 그런겁니까...? 사실 그래서 공룡돌의 추리쩡 배경음악.. 저는 들을수가 없어서 다른분들한테 들...