메뉴 건너뛰기

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

-- 플레이어 위치를 저장하는 변수
-- 초기 시작지점은 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 추천 수 날짜 최근 수정일
65 여러분 질문있어요. 성심성의껏좀 알려주세요 흑흑 [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가 정수인...  
64 [re] 혼돈님께 질문 혼돈 2048   2007-12-25 2008-03-17 04:37
옛날에 뼈대를 그려놓고 일단 게임을 만들자는 주의였는데 나중에 완성하고 나면 고치기도 귀찮고, 그 그래픽에 맞춰 만든 거라서 그냥 그대로 쓰게 되는 경우가 많았음. 그래서 그 다음부터는 처음부터 그래픽 소스를 제대로 준비한 뒤 시작하는 식으로 했습...  
63 흥크립트로 만든 예제 [1] file 대슬 2051   2007-12-01 2008-03-17 04:37
 
62 게임 만들때는 게임 기획을 해야 합니다. [7] 똥똥배 2107   2008-02-12 2008-03-17 04:37
당연한 소리지만 간혹 이것을 잘못하는 사람도 있고 저 역시 이런 실수를 많이 저질렀습니다. 마왕이 용사를 무찌르는 게임을 만들자. 이건 게임 기획이 아닙니다. 시나리오 기획입니다. 이 결과 게임이 어떻게 만들어지는지 봅시다. 일단 마왕이 용사를 무찌...  
61 흥크립트로 만든 예제 2 [2] file 대슬 2118   2007-12-01 2008-03-17 04:37
 
60 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...  
59 웹 프로그래밍을 배우려고 합니다. [2] Kadalin 2171   2008-03-22 2008-03-22 23:37
사용하는 형식에 따라 꽤 분야가 많은 것으로 알고 있습니다. 각각의 특징을 설명해 주세요.  
58 조금씩 게임 소스가 완성 되어 가는데요. [2] 짜스터 2188   2010-11-16 2010-11-16 09:10
기획하고 연출 에서 직접 표현할려고 하는데 전투 시스템을 혹시 알만툴 XP 스크립트를 제작해주시는거는 안되시나요? 연출쪽까지 맡으셔서 하시면 무척 힘들어질듯 하는데, 구디스 씨라고 외국에서 만든 SRPG 스크립을 구하기는 해봤지만 창세기전 처럼 케릭...  
57 흥크립트 Ver0.9 변수 안의 변수 기능 [2] 혼돈 2208   2007-10-16 2008-03-17 04:37
상당히 고급기능이라 꼭 알 필요는 없지만, 잘 활용하면 배열이나 구조체 비슷하게 활용 가능합니다. 참고로 []를 쓰는 숫자변수와 {}를 쓰는 문자변수는 서로 다른 테이블을 쓰므로 이름이 겹쳐도 상관없습니다. [변수X] 1 [변수[변수X]] 10 {변수} "변수" {...  
56 '@클릭'이거 어떻게 사용하는거죠? [4] 네모상자 2244   2008-01-26 2008-03-17 04:37
'@영역선택'사용법은 역전심판 뜯어봐서 알 수 있겠는데, 이건 던전 앤 러버를 뜯을 수도 없고 해서 잘 모르겠네요. * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 17:11)  
55 명령문 질문드립니다. [1] X-tra 2244   2008-03-26 2008-03-27 00:40
변해서 게시판 찾기 어려울것 같았는데 이상하게 한번에 찾아 버렸네요. 연구소라고 적혀 있어서요... 이번건 질문이라고 하기에는 좀 애매합니다. 예전에 흥크립트의 모든 명령어가 적혀 있던 파일을 본 기억이 납니다. 하지만 아무리 찾아도 없더군요. 블로...  
54 저는 사실 이걸 잘 못해요. [3] 앟랄 2282   2008-03-26 2008-04-18 07:45
알만툴 액알. 원리가 도저히 이해가 안 갑니다. 그림넣어서 설명해주세요. 그 뭐시기 그냥 근접공격만 일단. 나중가서 원거리를 합시다.  
53 흥크립트 0.9 새 기능 소개 [3] file 혼돈 2290   2007-10-15 2008-03-17 04:37
 
52 흥크립트 키입력 질문 [1] A.미스릴 2363   2008-03-15 2008-03-17 04:37
키 클릭을 누르고 누른상태로 있는것도 인식할 수 있나영? 어떻게 하나요 ㅡ,.ㅡ  
51 흥크립트 기초 질문. [2] 장펭돌 2430   2007-12-03 2008-03-17 04:37
지금 슬슬 설명서를 읽어나가는중... 기본 원리에서 다른건 대충 전부다 이해가 가지만, 몇가지 이해가 안가는 것이 있어서 질문 합니다. 우선 그림파일은 mlc로, 텍스트 파일은 dlg로 바꾸는것이 맞지요? 그렇다면, '게임 전체적으로 쓸 그림이라면 DATA폴더...  
50 데이터 축소에 대하여 [2] 짜스터 2430   2010-10-13 2013-11-23 04:38
환상수호전 : 티어크라이스 라는 닌텐도 게임을 알게 됬는데 컴퓨터 확장자 nds로 용량이 240메가 정도 밖에 안되는데 영상이나 성우 음성이 거의 풀로 유지되더군요. 데이터 품질을 최하로 해서 어느정도 볼만한 그래픽만 유지해서 용량을 최대한 축소시킨것 ...  
49 그림 출력의 순서를 알고 싶습니다. [3] X-tra 2466   2008-03-12 2008-03-17 04:37
제 글이 연구소로 가서 이번에는 신경써서 제목을 적었습니다 ㅡ.ㅡb 채색을 제외하면 전투도 70%정도 완성되었는데 자잘한 버그가 발생해서요. 제 스스로 알아 내려 했지만 확실하게 하기 위해서 물어 봅니다. 정확히 어떤 그림이 앞에 출력이 되고 어떤 그...  
48 이상하군요. [2] 대슬 2490   2008-05-16 2009-01-07 22:05
MIDI 음악을 메인 루프 앞에서 재생시킨 후 다른 음악을 재생시키려고 했더니 그 다음부턴 음악이 정지만 하고 재생이 되지를 않네요. 예전에 배고파요 만들었을 때는 비슷하게 해도 별 문제가 없었던 것 같은데, 왜 이러는지 잘 모르겠습니다. void bgm(int ...  
47 2중 for문을 돌릴 때 [3] 똥똥배 2539   2011-04-06 2011-04-07 17:08
제 경우, 원래는 이렇게 해야 정석인 코드를 for(int j = 0; j < y_size; ++j) { for(int i = 0; i < x_size; ++i) { //내용 } } 보기가 싫다는 이유로 for(int j = 0; j < y_size; ++j) for(int i = 0; i < x_size; ++i) { //내용 } 이런 식으로 적곤 ...  
46 퀴즈소스입니다 허클베리핀님 라컨 2546   2005-08-23 2008-03-17 04:37
Private Sub Form_Click() If 시작 <= 1 Then MsgBox ("이제 왔군 학생") MsgBox ("이번이 시험인건 알고 있겠지?") MsgBox ("문제를 낼테니 잘 풀어라") 문제 = InputBox("흑곰의 이전 닉네임은 무엇이였나?") If 문제 = "답" Then MsgBox ("맞았군") Cls Pri...