메뉴 건너뛰기

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

(역시 이미지가 중요한 글인데 이미지가 모두 잘렸습니다. 문화재 손실에 슬픔을 표합니다.)


Quad에 대해 알아본댔습니다.

쿼드? 쿼드가 뭐지? 생소한 개념인데?


하나의 큰 그림을 로드해서 쪼개서 쓰는 겁니다. 타일 깔듯이요.

우리가 포켓몬스터 같은 걸 하면, 맵 하나를 커다란 그림 파일로 그려놓은 게 아니라

풀숲 하나 32*32로 그리고(정확한 치수는 아니고 그냥 예임)

물 하나 32*32로 그리고

땅 하나 32*32로 그려가지고

짜맞춰서 하나의 맵을 만드는 겁니다.

그럼 뭐가 좋냐면, 일단 맵을 수정하기 쉽고, 저 3개 가지고 몇십개의 맵을 만들 수 있으니까 리소스가 엄청 절약되는 것입니다.

뭐.. 아무튼 직접 짜보시면 소중함을 경험하게 되실 겁니다.


쿼드도 바로 쓸 수는 없고, 먼저 만들어줘야 한다.

love.graphics.newQuad를 사용한다.

[쿼드이름] = love.graphics.newQuad( x, y, width, height, sw, sh )

뭔 소린고 하니, 하나씩 풀어봅시다.

[쿼드이름]은 쿼드를 식별할 수 있는 적절한 이름을 지어주시면 되겠습니다.

x랑 y는 큰 이미지에서 떼어낼 쿼드가 어디서부터 시작하는지.

width랑 height는 쿼드의 크기 되겠습니다.

sw랑 sh는 전체 이미지의 크기입니다.


참고로, 쿼드는 바로 파일을 불러오는 것이 아니라, 먼저 불러온 이미지를 쪼개서 쓰게 된다.

이미지를 불러오는 방법은 1편을 참조하자.

그래서 newQuad에 파일 경로가 없는 것이다. 일단 어떻게 쪼갤지만 정의해놓는 것이다.

마치 틀 처럼 말이다.


이제 쿼드가 준비되었으니 쿼드를 이미지에 그려보자.

love.graphics.drawq( image, quad, x, y, r, sx, sy, ox, oy, kx, ky )

이 역시 각 인수가 어떤 역할을 하는지 알아보자.

image는 그릴 원본이 있는 이미지이다. 예제를 준비해볼까?


자그마한 파일을 준비했다.

실제 게임의 맵을 처리할 때도 저런 식으로 맵 스프라이트를 처리하고

쿼드라는 것도 스프라이트를 처리할 때 유용하다.

스프라이트라는 것은 2D 게임 만들면서 엄청 많이 나오는 개념이니 알아보자.



역시 필자가 즐겨 플레이하는 모 게임을 예제로 들어 설명하면

실제로 한글화 등을 목적으로 해당 게임을 뜯어보면 저런 그림들이 게임 내에 있음을 볼 수 있다.

여러개의 이미지를 한번에 로드하면 힘드니까 저렇게 큰 이미지를 한번에 로드한 뒤

필요할 때 필요한 부분만 적절히 잘라서 표시해주는 것이다.

여러 개의 스프라이트를 짧은 시간 안에 보여주면 애니메이션 효과도 낼 수 있다.

2D 게임의 전성기에는 그래픽카드가 몇 폴리곤을 보여줄 수 있는가로 성능을 결정하는 것이 아닌

몇 개의 스프라이트를 동시에 올릴 수 있느냐로 성능을 결정하기도 했다 카더라.


쓸데없는 소리를 했는데.. 뭐 어쨌든 우리의 목적은 2D 게임을 제작하는 것이기 때문에 언급하고 넘어가봤다.

설명이 길어져서 글쓰기 힘들다, 무슨 인수 있는지 보려면 스크롤을 올려야 하니..


quad는 만든 틀이다. 우리 저번에 틀을 만들지 않았는가? 틀의 이름도 정해 두었고, 그 이름을 적어주면 된다.

나머지 인수는 지난 편에서의 이미지와 같으므로 과감히 생략한다.

아, 다른 게 하나 있는데, kx, ky이다. 이것은 자르는 점을 의미하는 듯 한데.. 당장은 필요없어보이니 넘어가자!


지금 보니 설명을 영 부실하게 한 것 같다, 뭐 다 아는 척 하고 있지만 사실은 위키를 보면서 배우면서 쓰는 것이니.. 쿼드는 앞으로도 많이 사용하고, 중요한 개념이 될 것 같으니 다음에 다시 다루겠습니다.

어쨌든 이제 쿼드와 위의 이미지를 사용해서 맵을 만들어보자!


function love.load()
    img = love.graphics.newImage("quadexample1616.png")
    map1 = love.graphics.newQuad(0, 0, 16, 16, 48, 64)
    map2 = love.graphics.newQuad(0, 16, 16, 16, 48, 64)
    map3 = love.graphics.newQuad(0, 32, 16, 16, 48, 64)
   
    map4 = love.graphics.newQuad(16, 0, 16, 16, 48, 64)
    map5 = love.graphics.newQuad(16, 16, 16, 16, 48, 64)
    map6 = love.graphics.newQuad(16, 32, 16, 16, 48, 64)
   
    map7 = love.graphics.newQuad(32, 0, 16, 16, 48, 64)
    map8 = love.graphics.newQuad(32, 16, 16, 16, 48, 64)
    map9 = love.graphics.newQuad(32, 32, 16, 16, 48, 64)
   
    map10 = love.graphics.newQuad(0, 48, 16, 16, 48, 64)
    map11 = love.graphics.newQuad(16, 48, 16, 16, 48, 64)
    map12 = love.graphics.newQuad(32, 48, 16, 16, 48, 64)
end


function love.draw()
    love.graphics.drawq(img, map12, 0, 0)
    love.graphics.drawq(img, map12, 0, 16)
    love.graphics.drawq(img, map12, 0, 32)
    love.graphics.drawq(img, map12, 0, 48)
    love.graphics.drawq(img, map4, 0, 64)
   
    love.graphics.drawq(img, map12, 16, 0)
    love.graphics.drawq(img, map12, 16, 16)
    love.graphics.drawq(img, map12, 16, 32)
    love.graphics.drawq(img, map12, 16, 48)
    love.graphics.drawq(img, map4, 16, 64)
   
    love.graphics.drawq(img, map12, 32, 0)
    love.graphics.drawq(img, map12, 32, 16)
    love.graphics.drawq(img, map5, 32, 32)
    love.graphics.drawq(img, map12, 32, 48)
    love.graphics.drawq(img, map12, 32, 64)
   
    love.graphics.drawq(img, map12, 48, 0)
    love.graphics.drawq(img, map12, 48, 16)
    love.graphics.drawq(img, map12, 48, 32)
    love.graphics.drawq(img, map12, 48, 48)
    love.graphics.drawq(img, map4, 48, 64)
   
    love.graphics.drawq(img, map12, 64, 0)
    love.graphics.drawq(img, map12, 64, 16)
    love.graphics.drawq(img, map12, 64, 32)
    love.graphics.drawq(img, map12, 64, 48)
    love.graphics.drawq(img, map4, 64, 64)
end


drawq 부분에서 뒷부분은 생략했습니다. 자동으로 다 0으로 들어갑니다.

실제 맵 처리를 저렇게 막장으로 하는 건 아닙니다.

중요한 건 drawq지 테이블이나 For문의 처리가 아니니까요. 사실은 귀찮았습니다.

나중에 소코반을 Love2D 엔진으로 옮기면서 제대로 된 걸 만들어보겠습니다.



모든 것이 계획대로라면 위와 같은 이미지가 나옵니다.

만세! 여러분은 이제 쿼드를 어떻게 쓰시는지 대충 감을 잡으셨습니다.


요약

- 쿼드는 틀이다

- 쿼드에 명시된대로 미리 로드된 이미지를 사각형으로 잘라서 표시할 수 있다.
- 이것은 맵 타일이나 스프라이트 등을 구현하는 데 매우 유용하고, 자주 쓰인다.

- 새 쿼드 틀을 만들고 싶으면 [쿼드이름] = love.graphics.newQuad( x, y, width, height, sw, sh )

- x랑 y는 쿼드가 시작하는 곳, width랑 height는 쿼드의 크기를 말한다.

- 쿼드를 그리고 싶으면 love.graphics.drawq( image, quad, x, y, r, sx, sy, ox, oy, kx, ky ) 를 사용한다.

- image는 자를 이미지, quad는 앞서 생성한 틀 이름, 나머지는 이미지를 그릴 때의 인수 사용법과 같다.


다음부터 Lua로 소코반을 구현해보겠습니다. 안녕.

조회 수 :
821
등록일 :
2013.09.17
08:37:59 (*.209.135.92)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=study&document_srl=703472
List of Articles
번호 제목 글쓴이 조회 수 추천 수 날짜sort 최근 수정일
145 {질문}그림에대한 질문일세. [5] 슈퍼타이 1703   2008-01-30 2008-03-17 04:37
뭐 만화에서보면 눈이 빛나거나 빠르게 달리는것처럼 효과주고 점프할때 바닥에 ^^ 이런식으로 효과 주는거나 빙글빙글돌때는 주변에 원같은거 그려주고 그런걸 뭐라고 하죠? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:26)  
144 흥크립트 궁금한점. [5] 장펭돌 1704   2008-01-31 2008-03-17 04:37
1. AVI 같은 동영상 파일이나, 플래시파일 재생 지원 가능한가여? 가능하다면... 뭐라 쓰면 되는지...? 2. 던전앤 러버처럼 마우스 클릭으로 실행되는 이벤트 만드는 방법 설명좀 부탁... * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:03)  
143 클릭 문제.... ㄱ- [1] 장펭돌 1801   2008-01-31 2008-03-17 04:37
~클릭 100, 123, 0, 276, 186 @계속 ^100 이벤트 발생! 그림판에서 좌표수를 확인하고나서 123,0 부터 276,186의 위치를 위 처럼 정한뒤 흥크립트 실행후 아무리 클릭해봐도 안되네요... 또하나 궁금증은 창모드가 아닌 전체화 모드에선 마우스가 안나오는데.....  
142 흥크립트 질문 [1] 장펭돌 1733   2008-02-01 2008-03-17 04:37
흥크립트에서 if처럼 변수1이 1이면 어떻게되고 변수1이 2면 어떻게되고 이렇게 어떻게하나요? 역전심판에서 1+1 답 얘기할때, 정답을 말하느냐 오답을 말하느냐에 따라서 달라지는것 처럼 말이죠... 봐도 잘 모르겠네요... * 똥똥배님에 의해서 게시물 이동되...  
141 [re] 흥크립트 질문 똥똥배 1782   2008-02-01 2008-03-17 04:37
조금 복잡하지만 이렇습니다... ====================================== [분기] ([레벨]==16)?91:[분기] [분기] ([레벨]==15)?92:[분기] [분기] ([레벨]==14)?93:[분기] [분기] ([레벨]<=13)?94:[분기] @이동 [분기] ^91 당신의 랭크 : S @이동 95 ^92 당신의...  
140 흥크립트, 이건 답변 안해주신듯... [1] 장펭돌 1669   2008-02-02 2008-03-17 04:37
마우스를 지원하게 하고싶은곳과 지원 안하게 하고싶은곳... 이 두곳을 어떻게 구분하죠? 저같은경우엔 특별한 경우를 제외하곤 마우스가 안나오게 할껀데... 어떻게 해야... 하는지 자세히 설명좀 부탁... ㅈㅅ.. * 똥똥배님에 의해서 게시물 이동되었습니다 ...  
139 아아, 그렇다면... 흥크립트에서 [1] 장펭돌 1712   2008-02-02 2008-03-17 04:37
제가 타이틀을 만들고 나서 @마우스지원 해놓고 나니까 선택지에서 키보드로 선택할수 있는 커서가 사라지더라구요? 이건 원래 그런건지... 키보드로 선택해도 되긴 되는데 커서가 없어서 지금 뭘 고르고 있는건지 알수가 없는데.. 원래 이런건가요? 으음, 그...  
138 흥크립트 AVI 지원에서... [2] file 장펭돌 1823   2008-02-02 2008-03-17 04:37
 
137 흥크립트 기본 바꾸기. [3] 장펭돌 1855   2008-02-03 2008-03-17 04:37
흥크립트 마우스 포인터를 바꾸려는데, system 의 "커서"를 바꾸면 된다구 하셨짢습니까? 그럼, "DATA\XXX.mlc" 이렇게 해야 되는겁니까, 그리구, 기본 커서 크기좀 알려줏메. ps. 또 문제가 생김... 왠일인지 동영상이 그냥 곰플레이어로 재생하면 멀쩡한데, ...  
136 마우스 포인터 바꾸기가 안되네요... +질문2 장펭돌 1748   2008-02-04 2008-03-17 04:37
어떻게 해도 자꾸 마우스 모양이 안보이길래... 아예 mlc 파일을 DATA폴더 밖으로 꺼내고... System.txt와 같이 둔 상태로 그림 파일명이 "마우스" 이므로.. {#커서} "마우스" 이렇게 해봤는데도 안되네요... 으음,, 어떻게 해야하는겁니까... ㅇ 질문 2 "DIVX...  
135 마우서 포인트 바꾸기 질문 다시 ㄱ- [2] 장펭돌 1807   2008-02-05 2008-03-17 04:37
똥똥배님이 알려주신대로, DATA 폴더내에 mlc 파일을 하나 생성하고, 커서에 "파일명" 이렇게 재대로 했는데.. 안됩니다. 똥똥배님은, Global.mlc 를 이용할수 있지만, 저는 Global.mlc 내에 그림파일을 추가시킬수가 없어서 안되는거 아닙니까? * 똥똥배님에 ...  
134 흥크립트에대해. [16] 궤레브 1711   2008-02-06 2008-03-17 04:37
음.. 그냥 몇가지 간단한 질문인데요 그림과 그림이 맞닿앗을때 라는 액션을 만들수 있나요? 만약 그림과 그림이 맞닿앗을때 액션이 없으면 턴알피지밖에 불가능할거같은데 마우스로 눌러서 공격하는 버츄얼캅같은 게임이 아니고선.. 이건 제가 직접 실험해볼...  
133 흥크립트 질문.. [3] 궤레브 1747   2008-02-07 2008-03-17 04:37
흔히 알만툴에서 쓰이는 조건분기를 어떻게 쓰나요? 펭돌님 말로는 if문이 있다던데.. 그리고.. 흥크립트 테스트인가? 슬라임같이 생긴 사람이 돌아다니면서 사람들 만나면 대화 나오게 만드신게 있더군요? 거기서처럼 그냥 아무 추가 이벤트가 없어도 꺼지지 ...  
132 [re] 흥크립트 질문.. [2] 똥똥배 1797   2008-02-07 2008-03-17 04:37
>흔히 알만툴에서 쓰이는 >조건분기를 어떻게 쓰나요? 펭돌님 말로는 if문이 있다던데.. >그리고.. >흥크립트 테스트인가? 슬라임같이 생긴 사람이 >돌아다니면서 사람들 만나면 대화 나오게 만드신게 있더군요? >거기서처럼 그냥 아무 추가 이벤트가 없어도 ...  
131 갑자기 급질문.. 궤레브 1737   2008-02-08 2008-03-17 04:37
별 특별한건 아니구요 변수 강좌 보니까 ? 가 사용되더라구요? ?는 무슨 의미인가요? [분기] ([레벨]==16)?91:[분기] [분기] ([레벨]==15)?92:[분기] [분기] ([레벨]==14)?93:[분기] [분기] ([레벨]<=13)?94:[분기] @이동 [분기] 여기서 보면 [레벨]==16 이런...  
130 [re] 갑자기 급질문.. [1] 똥똥배 1548   2008-02-08 2008-03-17 04:37
>별 특별한건 아니구요 >변수 강좌 보니까 ? 가 사용되더라구요? >?는 무슨 의미인가요? > >[분기] ([레벨]==16)?91:[분기] >[분기] ([레벨]==15)?92:[분기] >[분기] ([레벨]==14)?93:[분기] >[분기] ([레벨]<=13)?94:[분기] >@이동 [분기] > >여기서 보면 >[...  
129 흥크립트 개선점 흑곰 1578   2008-02-08 2008-03-17 04:37
글자변수 외에 숫자변수도 화면에 표시할 수 있으면 좋겠음 글자입력시 아무 것도 안썼으면 다시 입력받을 수 있도록 하면 좋겠음 글자변수도 조건문을 할 수 있으면 좋겠음 if문이 있으면 좋겠음 아이콘 변경이 되었으면 좋겠음(실은 이건 컴파일 문제이지만)...  
128 [re] 흥크립트 개선점 [3] 똥똥배 1928   2008-02-09 2008-03-17 04:37
1. 글자변수 외에 숫자변수도 화면에 표시할 수 있으면 좋겠음 이건 내부적인 문제이기도 한데, 화면에 표시할 때는 위치정보, 색 등 엄청난 데이터가 필요합니다. 글자는 길이가 있고 하니 어차피 덩치가 커서 상관없다고 생각했지만, 숫자변수는 4바이트면 ...  
127 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...  
126 조건분기할 때 [5] 흑곰 1745   2008-02-12 2008-03-17 04:37
&& and || or == 같다 != 같지 않다 원래 vc++ 에서 쓰는 것인데 흥크립트에도 쓰여요. (마지막 것은 확인 못해봤음) 흥크립트도 조건문을 활용하면 if문이 가능합니다. if문을 여러개 구현하다보면 그렇게 빠르진 않은 것 같습니다만 * 똥똥배님에 의해서 게...