메뉴 건너뛰기

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

이미지가 중요한 글인데 이미지가 다 짤렸네요. 압박.


준비물은 일단 이미지입니다.

예제 이미지로 럭키♥를 준비했습니다.




럭키! 럭키! 럭키! 와아아아!

어쨌든 이 럭키를 가지고 예제를 진행하겠습니다! 와아아! 글쓸 맛 난다!


일단 Love2D에서 뭔가 그린다는 건 좌표입니다.

저번의 배열에서 [y][x]로 처리했던것과 달리 이번엔 진짜 (x, y)꼴입니다.

와아아!



이런 럭키가 있으면 럭키의 x는 30, y는 10이 됩니다.

x 30, y 10에 그리면 저렇게 그려지는 겁니다.

(어쩐지 위키에 있는 그림이랑 똑같이 그려졌지만 럭키가 있으니 이쪽을 쓰겠습니다.)


하지만 파일이 있다고 바로 그릴 수 있는 게 아닙니다.

파일을 먼저 불러와야 합니다.

이것을 love.graphics.newImage로 불러옵니다.


[이미지] = love.graphics.newImage([파일경로])


[이미지] 부분에는 불러온 이미지를 식별할 수 있는 이름을,

[파일경로]에는 파일의 경로를 넣습니다.

Love2D의 main.lua와 같은 경로에 있으면 파일 이름만 적어도 됩니다.

이것을 유식한 말로 상대경로라고 합니다.


저는 pokemon이라는 이미지를 생성해보겠습니다.


pokemon = love.graphics.newImage("lucky.png")


공 식 위키에 따르면, 여러 번 실행되는 콜백(뭔지는 다뤘죠?)에서 저런 짓을 하면 상당히 게임이 느려진다고 합니다. 그러니까 그냥 한번만 불러온 뒤 (love.load 같은 콜백에서요!) 나중에 여러 번 호출하는 것이 훨씬 더 효율적이겠죠.

love.update나 love.draw같은 콜백에는 넣지 맙시다.


예제 코드:

function love.load()

pokemon = love.graphics.newImage("lucky.png")

end


이미지를 불러왔으니 이제 그릴 수 있습니다.

이미지를 그리는 것은 보통 love.draw 콜백에서 하게 됩니다.


love.graphics.draw(drawable, x, y, r, sx, sy, ox, oy, kx, ky) <br />

이게 뭔 개소리야?!

하나하나 뜯어봅시다.


Lua 글에서 설명했듯, 괄호 안에는 인수가 들어갑니다.

저기에 넣는 값에 따라 어떻게 그려질지가 달라지겠지요.


drawable는 그릴 수 있는 것이니, 이미지가 되겠네요.

방금 생성한 이미지 (예제에서는 pokemon)를 넣어주면 되겠습니다.


x랑 y는 뭔지 감이 잡히지 않습니까? 그림이 어디에 그려질지를 넣어주면 됩니다.

위의 그림이라면 x가 30이고 y가 10이겠지요.


r은 뭘까요? 회전시키는 겁니다.

그냥 그리고 싶을 때는 0을 넣습니다.


love.graphics.draw(pokemon, 100, 100, 0, 1, 1, 0, 0, 0, 0)

모르는 건 그냥 다 눈치껏 넣었을 때 어떻게 그려지냐면..



그럼 회전이니까 30도 돌리고 싶으면 어떻게 하나요? 30 넣으면 되나요?

위키에 조건이 있네요, 라디안으로 넣어달라고 합니다. 그게 뭐죠? 우걱우걱?

그래서 그냥 위키의 예제를 배껴서 math.rad(30) 를 넣었습니다.


love.graphics.draw(pokemon, 100, 100, math.rad(30), 1, 1, 0, 0, 0, 0)



얍.


주의할 점(?)은.. 기울어지면 좌표도 같이 기울어지는 듯 합니다.

90을 넣었더니 90도로 기울어지면서 아주 좌측의 창 테두리에 달라붙어 버리는 현상이;;

좀 더 파보면 좋겠지만 귀찮아서 생략,


sx랑 sy의 s는 scale의 약자입니다.

크기 조절!

기본값은 1이며, 넣은 만큼 크기가 줄어나거나 늘어듭니다.

0.5를 넣으면 반으로 줄어들고, 2를 넣으면 두배로 커집니다.

sx와 sy가 같을 필요는 없으며, 음수가 들어가면 그 쪽으로 잡아당겨서 커집니다.

그러니까.. -2를 넣으면 반으로 줄어드는 게 아니라 2배로 커지는데 좌표가 이동하면서 커집니다.

직접 한번 여러가지 해 보세요,



love.graphics.draw(pokemon, 100, 100, 0, 0.5, 1, 0, 0, 0, 0)

(가로를 반으로 축소)



love.graphics.draw(pokemon, 100, 100, 0, 1, 2, 0, 0, 0, 0)

(세로를 2배로 확대)


여담이지만 게임 엔진의 편리함을 몸으로 체험하고 있습니다.

빌려온 '세가의 신입 사원 교육 과정에서 배우는 게임 프로그래밍의 정석' 에서는 이미지의 확대, 축소, 회전을 큰 비중으로 다루고 있는데 엔진을 쓰면 코드 한 줄 쓰면 끝입니다.

얼핏 보니 회전을 다룰 때 삼각함수를 썼던가... 하지만 엔진을 쓰면 복잡한 수학은 그리 필요 없습니다.

하지만 엔진을 써도 어떻게 돌아가는지 원리는 알아야 합니다.

아니면, 엔진이 문제를 일으키면 속수무책이 되어버리던지, 엔진이 아직 없는 새로운 플랫폼에서 뭔가 개발하려면 무능해진다던지 하는 문제가 생깁니다.


ox와 oy는 뭘까요?

o는 아마 Origin, 시초? 뭐 그런 뜻입니다.

어디서부터 그릴지를 알려주는 것이라고 할 수 있습니다.



(위 그림은 예를 위해 그린 그림으로 실제 픽셀수와는 다릅니다.)


ox가 20, oy가 20이라면 그림의 20, 20 되는 점에서부터 그리기를 시작한다는 것입니다.

결과적으로 저렇게 잘린 럭키 이미지를 그리게 되는 것입니다.


이것만으로 '이미지를 다 그리게 되었다!' 라고 생각하면 좋겠지만...

타일 처리(뭔지는 나중에 설명해 드리겠습니다.)와 같은 것을 하기에는 아직 모자랍니다.

그래서 좀 더 찾아봤더니 Quad라는 것이 있는 고로 다음부터는 그 이야기를 해보겠습니다.


이미지 그리는 방법 2편, 기다려 주세요.

다음에는 Quad에 대해 파 보고, Quad가 뭔지, 어떻게 쓰는지 알아보겠습니다.

그리고는 Lua 소코반을 그래픽으로 옮기겠습니다... 모든 계획이 순조롭게 진행된다면요.


요약:

- Love2D에서 이미지를 그리기 전에 먼저 불러와야 한다.

- 불러오는 방법은 [이미지] = love.graphics.newImage([파일경로])

- 이미지를 그리기 위해서는 love.graphics.draw(drawable, x, y, r, sx, sy, ox, oy, kx, ky) .

- 일반적인 경우에 drawable, x, y만 지정해주고 sx, sy는 1, 나머지 인수는 다 0으로 지정해준다.

- 적절한 경우에 적절한 인수들을 적절히 사용하면 적절한 효과를 낼 수 있으며 이것을 적절히 사용하면 적절히 도움이 된다.
조회 수 :
812
등록일 :
2013.09.17
08:35:57 (*.209.135.92)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=study&document_srl=703469
List of Articles
번호 제목 글쓴이 조회 수 추천 수 날짜 최근 수정일sort
45 Lua 소코반: 벽을 뚫고 나가지 않게 해보자! 노루발 696   2013-09-17 2013-09-17 08:31
전체 코드입니다.슬슬 길어지니 요약글 기능이 필요해진달지.. -- 플레이어 위치를 저장하는 변수 -- 초기 시작지점은 5, 5로 설정. playerx = 5 playery = 5 -- 움직인 횟수 저장 moves = 0 -- 맵 데이터를 저장하는 8*8의 2차원 배열 Map 생성 map = {} for ...  
44 Lua 소코반: 상자를 만들고 옮기고 상자와 상자가 겹치거나 상자와 벽이 겹치지 않게 해 보자! 노루발 677   2013-09-17 2013-09-17 08:32
-- 플레이어 위치를 저장하는 변수 -- 초기 시작지점은 5, 5로 설정. playerx = 5 playery = 5 -- 박스의 위치를 저장하는 배열. box = {} -- 움직인 횟수 저장 moves = 0 -- 맵 데이터를 저장하는 8*8의 2차원 배열 Map 생성 map = {} for a = 1, 8 do     ma...  
43 Lua 소코반: 목표 지점을 만들고, 상자가 모두 옮겨지면 게임을 끝내자! 노루발 754   2013-09-17 2013-09-17 08:33
-- 플레이어 위치를 저장하는 변수 -- 초기 시작지점은 5, 5로 설정. playerx = 5 playery = 5 -- 박스의 위치를 저장하는 배열. box = {} -- 박스 목표 지점의 위치를 저장하는 배열. goal = {} -- 움직인 횟수 저장 moves = 0 -- 맵 데이터를 저장하는 8*8의...  
» 이미지 그리는 방법 1편 노루발 812   2013-09-17 2013-09-17 08:35
이미지가 중요한 글인데 이미지가 다 짤렸네요. 압박. 준비물은 일단 이미지입니다. 예제 이미지로 럭키♥를 준비했습니다. 럭키! 럭키! 럭키! 와아아아! 어쨌든 이 럭키를 가지고 예제를 진행하겠습니다! 와아아! 글쓸 맛 난다! 일단 Love2D에서 뭔가 그린다는...  
41 이미지 그리는 방법: 2편. 부제: 쿼드! 노루발 821   2013-09-17 2013-09-17 08:37
(역시 이미지가 중요한 글인데 이미지가 모두 잘렸습니다. 문화재 손실에 슬픔을 표합니다.) Quad에 대해 알아본댔습니다. 쿼드? 쿼드가 뭐지? 생소한 개념인데? 하나의 큰 그림을 로드해서 쪼개서 쓰는 겁니다. 타일 깔듯이요. 우리가 포켓몬스터 같은 걸 하...  
40 게임의 기본 설정을 담당하는 love.conf 노루발 763   2013-09-17 2013-09-17 08:39
안녕하세요, 노루발입니다. 여태까지 이것저것 많이 Love2D를 다뤄와서 제가 만든 소코반에 그래픽을 씌울 수준까지 되었지만 (물론 키 입력은 논외로 치죠, 나중에 다룰게요.) 아직 이걸로 정식 게임을 만든다면 모자라도 한참 모자랍니다. 창의 이름도 실행...  
39 Lua 소코반 EX: 그래픽 준비 노루발 1084   2013-09-18 2013-09-18 08:00
안녕하세요, 노루발입니다. 얼마 전 만든 Lua 소코반을 게임다운 게임을 만들기 위해 그래픽을 씌워보려고 합니다. 저번에 한 Love2D로 살펴본 뭐가 뭔지 모르는 복잡한 그리기 함수들도 사실은 모두가 소코반을 그래픽으로 만들기 위한 훼이크였습니다. 후후....  
38 Lua 소코반 EX: 포팅: 1 노루발 856   2013-09-18 2013-09-18 08:03
-- 플레이어 위치를 저장하는 변수 -- 초기 시작지점은 5, 5로 설정. playerx = 5 playery = 5 -- 박스의 위치를 저장하는 배열. box = {} -- 박스 목표 지점의 위치를 저장하는 배열. goal = {} -- 움직인 횟수 저장 moves = 0 -- 맵 데이터를 저장하는 8*8의...  
37 Lua 소코반 EX: 포팅: 2 (키가 눌리면 이동하게 해 보자) 노루발 832   2013-09-18 2013-09-18 08:04
-- 플레이어 위치를 저장하는 변수 -- 초기 시작지점은 5, 5로 설정. playerx = 5 playery = 5 -- 박스의 위치를 저장하는 배열. box = {} -- 박스 목표 지점의 위치를 저장하는 배열. goal = {} -- 움직인 횟수 저장 moves = 0 -- 맵 데이터를 저장하는 8*8의...  
36 Lua 소코반 EX: 포팅: 3 (머나먼 여행길 안녕 친구여) 노루발 913   2013-09-18 2013-09-18 08:05
안녕하세요, 노루발입니다. 오늘로 그래픽 소코반을 끝내기로 했습니다. 아쉽지만 끝내야죠. 일단 걸음수와 이것저것을 뿌려주기로 합니다. 그런데 이미 화면이 꽉 차버려서 뿌려줄 공간이 없네요... 없으면 만들면 되지. 창을 늘립시다. conf.lua를 수정. fun...  
35 CCTextFieldTTF 0바이트 메모리 누수 버그 해결법 똥똥배 692   2014-01-13 2014-01-13 10:38
CCTextFieldTTF::textFieldWithPlaceHolder("", FONT_NAME, FONT_SIZE); 이런 식으로 텍스트필드를 생성하면 ""가 0바이트라서 해체를 못하고 0바이트 누수가 발생한다. 그냥 스페이스(" ")라도 넣어주면 누수는 발생하지 않는다. 이 버그가 발생하는 버전은 2...  
34 Cocostudio의 ActionNode 메모리 누수 해결법(cocos2d-x 2.2.2) [2] 똥똥배 776   2014-03-09 2014-05-31 19:26
Cocostudio로 액션을 만들고 액션매니저를 이용해서 ActionManager::shareManager()->playActionByName 아래와 같이 실행을 해주면 액션이 실행되는 경우 메모리 누수가 발생한다. (액션을 실행하지 않았을 때는 메모리 누수 없음) 이 메모리 누수를 없애려면 ...  
33 cocos2d-x 2.2.2 UILabelBMFont 메모리 누수 해결법 [2] 똥똥배 783   2014-03-10 2014-05-31 19:30
만약 CocoStudio로 UI를 만든 후 GUIReader를 써서 지정 폰트를 불러오면 엔진 버그로 인해서 메모리 누수가 생긴다. 이걸 고치려면 LabelBMFont.cpp를 아래와 같이 수정해야 한다. void LabelBMFont::setFntFile(const char *fileName) { if (!fileName || st...  
32 cocos2d-x 2.2.2 윈도우 환경 기본 메모리 누수 똥똥배 640   2014-03-10 2014-03-11 03:51
cocos2d-x 2.2.2를 윈도우에서 실행시키고 나서 종료하면 기본으로 4바이트의 메모리 누수가 발생한다. 이건 CCScriptEngineManager가 원인인데 CCObject들은 delete를 실행할 때마다 CCScriptEngineManager의 sharedManager를 호출하기 때문이다. 결국 모든 C...  
31 cocos2d-x 2.2.2 문자열 출력 버그 [2] 똥똥배 601   2014-06-10 2014-08-23 22:35
cocos2d-x 2.2.2, 맥에서만 나타는 문제다. 윈도우, 안드로이드에서는 아무 이상 없다. 줄 수가 꽤 긴 문자열을 출력할 경우, 문자가 전부 다 나오지 않고 잘린다. 잘리는 기준은 줄이다. 문자 수가 어떻든 간에 줄 수에 따라서 잘려버린다. 아마 문자열의 줄 ...  
30 구글 인앱 구매 Soomla로 구현해본 후 팁 똥똥배 577   2014-09-20 2014-09-20 18:45
1. 일단 알파 테스트라도 앱을 출시시켜야 인앱이 작동한다. 그리고 APK 업로드 후에 바로 인앱이 적용되지 않는다. 구글에 게시되는 데, 시간이 걸리므로 인앱 등록 - APK 등록을 마친 후 다음날부터 구현하는 게 깔끔하다. 이걸로 모르고 하루종일 왜 안되나...  
29 Love2d 여러 플랫폼으로 빌드 자동화 노루발 470   2014-11-12 2014-11-12 17:35
https://github.com/MisterDA/love-release/blob/master/README.md http://www.ambience.sk/lua-love2d-game-distribution/  
28 Love2d 안드로이드 빌드하기 노루발 572   2014-12-15 2014-12-15 00:59
Love2d의 안드로이드 포트는 알파 단계입니다. 차차 개선되어 나가긴 하겠지만 아직 불안정한 부분이 많으며, 일어날 수 있는 오작동과 그로 인한 결과는 일절 책임지지 않습니다.   이 문서는 Windows 사용자 기준입니다. Linux나 Mac을 사용할 정도의 내공...  
27 Love2d 안드로이드 게임 패키징하기 [3] 노루발 546   2014-12-15 2021-01-11 12:11
이 문서는 개발 환경이 갖추어져 있는 상태이고, 빌드를 무사히 마친 뒤라고 가정합니다. 또한 이 문서는 https://bitbucket.org/MartinFelis/love-android-sdl2/wiki/Game%20Packaging#markdown-header-how-to-package-the-apk-with-your-own-love-090-game ...  
26 [번역] gamedev레딧의 Getting Started 문서 번역 [5] priling 1891   2014-12-26 2018-07-24 10:33
처음인 분들을 위한 '게임만들기' 가이드이 글은 [레딧 게임개발 커뮤니티의 /u/LordNed님의 포스팅]을 베이스로 작성한 것입니다. 이 글의 목적은 게임을 만들고 싶어하는 분들이 어떻게 시작할 수 있을지에 대해 명확한 가이드라인을 보여드리는 것입니다.  ...