본문 바로가기

개발 Story

[기초]자바 2D 게임 프로그래밍

여기서 다시 한번 감사의 인사를. ㅎㅎ.
말은 2D 지만 3D 도 원한다면 나중에 올려드리곘어요.

물론 아시는 바와같이 3D 는 리소스를 많이 먹는데다가 자바가 c++ 보다 느린점을 감안할때 자바로 할려는 사람은 없겠죠?

고로, 2D 를 먼저 알려드리곘어요.

일단 자바 모바일 한국에선 위피를 쓰더군요.

모바일 게임을 짜본적이 있다면 SE 환경에서 짜는것도 어렵지 않아요.

그게 그거니까... 하지만 한쪽은 모바일 환경 한쪽은 컴퓨터.

컴퓨터에서 게임을 짜는것이 더 용이 합니다. 이것은 나중에...

필요한것: 실력(초보는 ㄴㄴ), 영어(모든 문서, 소스는 영어로 되있습니다. 영어문서하나 못읽는 다면 ㅂㅂ). 수학(한국인들이야 

수학을 잘하니 말할필요는 없겠죠. 솔직히 수학은 그리 필요하지 않습니다)

----------------------------------------------------------------------------------------------------------------
Q. 자바 초보라고?

A. 자바가 아무리 쉬운 언어라고 해도 자바를 처음 시작하는 단계라면 ㄴㄴ 그대는 가서 공부나 하세요.

게임이란 프로그래밍의 최상위 단계.

모든 지식을 총동원하는곳입니다. 

초보는 그냥 가서 딴 프로그램이나 짜고 오세요.


Q. 영어가 싫어요.

A. 자바의 모든 최신 문서는 영어입니다. 자바의 나이를 생각해볼때 한국에 초고수의 숫자는 손에 꼽을 정도고

자바문서를 번역할 사람들도 그리 많지 않죠. 자바 한글 API 가 자바 5 일까 그럴껍니다.

영어를 자바 문서 하나 읽지 못할 정도라면 자바를 포기하고 다른 언어를 배우는게 좋을것 같군요.

왜 냐구요? 결국 번역을 기다리다보면 최신 기술은 못받아드리고 실력이 늘지 못하기 때문입니다.

------------------------------------------------------------------------------------------------------------
저도 자바 마스터는 아니고 대학생이기 때문에... 완벽하진 않습니다.

제 말투가 거슬리면 한국에 중학 1 년 까지만 살아서 그런거니까 그런줄 아세요.

-----------------------------------------------------------------------------------------------------------
자바로 2D 게임을 짜는것이 힘든가....왜 만드는 사람이 이리 적은가?!

1. 자바 기술에 대한 지식이 해박한 사람이 적다.

2. 자바 배우는 사람이 압도적으로 적다.

3. 자바가 느려서.

;ㅅ; 그러니까 이글을 읽고 님들도 자바 게임 팍팍 만들어서 뿌리는 겁니다. 으헤헤헤헿

---------------------------------------------------------------------------------------------------------
자바 게임 이미지 출력에 필요한것....

스윙!_! 오예! awt 는 느립니다. 그리고 이쁘지가 못하죠. 네모 버튼은 지쳤습니다. 세모나 동그라미로 변형시키고

그 외 좀 이쁘게 바꾸고 싶습니다! 그러면 스윙으로 ㄱㄱ 싱 으헤헤헿ㅎ 물론 awt 도 가능할듯 싶습니다만...흐음...

스윙 컴포넨트의 좋은점은 더블 버퍼링을 초기에 지원한다는 겁니다.

Double Buffering: 이것은 게임을 만들때 흔히 볼수있는 flickering 이라고 화면에 흰줄이 막 그어지는것을 예방하는 기술이빈다.

일단 화면은 하나죠.... 그러니까 그림을 계속 그리다 보면 할수없이 플리커가 생기는데...

그것을 예방하기 위해서 프로그래머들은 이미지 두개를 만든후 하나의 이미지를 그리고 화면에 출력하면서

두번째 이미지에 미리 그림을 그린후 이미 출력된 이미지와 잽싸게 바꾸는 겁니다.

그런데 스윙에선 그런 번거로운 짓을 할필요가 없죠.

그렇다고 더블 버퍼링을 모르면 안됩니다. 나중에 쓸데가 있기때문이에요.

이미지! 이미지란 무엇인가! 이미지란 모든것! 이미지를 컨트롤 하는것이 게임의 핵심!

자바의 이미지를 크게 3 개로 나눠 봅시다(정확히는 4가지)

이 이미지를 나누는것은 제가 글을 적는 것보다 링크를 다는것이 더 효과적일듯...

http://java.sun.com/developer/technicalArticles/Media/imagestrategies/index.html

이해가 가시죠?

게임에서 쓰이는 이미지 속도.

Image < BufferedImage <VolatileImage 순입니다.

잘 모르곘다면 BufferedImage 추천! VolatileImage 설명은 밑으로 스크롤 쭉쭉 내리시길...
------------------------------------------------------------------------------------------------------------------
그렇다면 이 이미지들을 만들을 어떻게 그릴까...

흔히 g.drawImage(ImageName); 을 쓰는데요.

정확한 답은

Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(ImageName); 이 맞습니다.

물론 기본적인 이미지 출력이라면 g 도 괜찮습니다만 Graphics2D 의 이름처럼 더 많은것을 지원합니다.

API 를 읽으실 분은 구글에 쳐보세요. 자바 검색의 기본은 구글!_!

---------------------------------------------------------------------------------------------------------------
그렇다면 이미지끼리의 충돌은 어떻게 확인하는가!?

몇가지 방법이 있는데:

첫번째, Shape 을 이용한다. 사각형, 동그라미, 자기지정도형 을 이용하여

도형들과 이미지를 중첩시킨후 도형들이 부딫힐때 부딫힘을 표현한다.

즉,

Rect1.intersects(Rect2); 에서 리턴된 값이 참이라면 두개의 이미지가 겹쳤다는것이고 아니라면 아니라는거죠.

정확한것은 구글에 API 검색 ㄱㄱ

이 기술은 재일많이 쓰이는 기술로써 이 기술이 이해가 되지않는다면 게임 못만듬...고로 무조건 읽어보시길...


두번째, 픽셀값을 불러 들어서 충돌을 구분한다. 

이 기술은 포트리스에서 쓰였죠.

이기술을 사용하기 위해서는 위에 첫번째 기술이 필요합니다.

먼저 두개의 도형이 중첩이 될때 중첩된  도형안에 이미지를 픽셀단위로 조사하여 이미지가 충돌했는지 안헀는지를 구분합니다.

PixelGrabber 를 이용합니다.

API 는 이곳에! http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/PixelGrabber.html 

친절한 예제도 있답니다 :D

이외에도 그 게임의 특성에 맞는 충돌태스트 방법이 있겠지만 제가 열거한 방법이 게임에선 많이 쓰이니까 공부하도록 하세요.

----------------------------------------------------------------------------------------------------------------
자바는 느리다! 왜 그럴까?!

소프트웨어 가속밖에 안써서 그럽니다.

위피는 여기까지가 한계죠.

자바에서는 Opengl 혹은 DirectX 하드웨어 가속을 지원합니다.

위피에선 쓸수없습니다...;ㅅ; 위피 캐 불쌍

몰랐다고요? 알고 있는데 어떻게 쓰는지 모른다구요?

첫번째로, 예를들어 컴파일을 할때 
<pre>-Dsun.java2d.opengl=true// 오픈지엘...다이렉트x 는 다른것을 사용.

을 추가해서 할경우 opengl 가속을 사용합니다. 물론 있을경우에만 말이죠.

두번째로, 그래픽 카드의 매모리를 사용하는 Volatile Image 를 사용합니다.

이기술을 사용하려면 위에서 언급한 더블 버퍼링을 알고 있어야 합니다.

이 두가지 기술을 병행할경우 속도는 결코 느리지 않습니다.

----------------------------------------------------------------------------------------------------------------
</pre>이제 밑밑한 이미지는 그만쓰고 움직이는 이미지를 사용해 봅시다.

일명 스프라이트라고 여러개의 이미지를 한번에 돌려서 마치 이미지가 움직이게 하는것처럼 하는 기술이죠.

스프라이트 이미지는 대부분 하나의 이미지로 나오는데요

http://www.bghq.com/fft/Ramza.PNG

이렇게 하나의 그림으로 오기 때문에 이 그림을 쪼개서 사용해야합니다.

어떤분은 g2d.clip(); 을 사용해서 저 이미지를 통째로 사용하던데요.

그렇게 사용해도 되긴 됩니다만.... 이미지를 잘라서 이미지 배열에넣은후 사용하는 편을 추천합니다.

그렇다면 하나의 이미지를 여러개로 어떻게 자르는가?!

여기에는 이미지 필터를 이용합니다. ImageFilter API 는 구글에서 검색 ㄱㄱ

이미지를 쪼갠후 이미지를 재빠르게 플레이하면 움직이는 것처럼 보이게 되는거죠.

----------------------------------------------------------------------------------------------------------------

소리 ... 게임의 40% 는 소리가 중요합니다... 타격감이란 것도 사실은 맞을때 나오는 소리가 좌우하는 거에요.

자바에선 wav와 몇몇 포맷을 지원합니다. JMF 에선 더 많은 것을 지원합니다만...

JMF.jar 을 추가하기엔 게임이 너무나 커져 버립니다.

저는 그래서 jorbis(ogg 포맷을 자바에 지원) 혹은 mp3spi(mp3 포맷을 자바에 지원) 을 사용합니다.

둘다 100 kb 정도 밖에 안하구요. mp3 음악파일이 wav 보다 엄청 작다는 것을 감안할때 게임을 만든다면

무조건, 저둘중 하나를 사용하셔야 합니다.

무조건 입니다. 얄짤없음 ㅎㅎ
---------------------------------------------------------------------------------------------------------------
제가 지금 까지 언급한건 솔직하게 그리 어려운것도 아니고 쉬운것도 아닌

게임에 관심이 있으시다면 알수있을만한 것이 었습니다.

다만 외국에서는 자바 게임진행이 활발한데 반해 한국에는 그렇지 않아서 지식 공유가 부족한것이겠죠.

제가 더욱 자세하게 설명할수있다면 그리 하였을 테지만...

귀찮고...


귀찮네요.

제가 언급한것들중 더욱 자세하게 아시고 싶은 것이 있다면 ggode.net  자유 게시판에 글을 써주시거나

이 블로그에 질문을 남겨주시면 되겠습니다. 물론 시차를 생각하세요. 미국 동부와 한국의 시차는 11 시간인가? 그럴겁니다.

저의 블로그 http://goshijin-java.blogspot.com 에 오시면 때때로 저와 채팅을 하실 기회가 있습니다.

그리고 저의 팁을 올려놓곤 하는데요. 요즘 만들어서 별로 읽을것이 없다능...;ㅅ; 그래도 오시라능...

----------------------------------------------------------------------------------------------------------------
파일로 간단한 자바 2D 게임 예제를 올려놓았습니다. mp3 음악 재생 예제 소스도 있으니까 필요하시면 쓰시면되겠네요.

다만 내 게임에는 추가를 안했읍니다.ㅎㅎ 쓰는법은

PlayMusic myMusic = new PlayMusic("song.mp3//path"); 하신후.
myMusic.start(); 재생
myMusic.stop(); 멈춤고 지움

입니다.

자바로 2D 게임을 만들고 계시거나 만들려고 하시는분중에

도움이 필요하시면 언제나 도와드릴태니 연락주세요.

그럼 전 이만 저녁먹으로 으해해해해햏

----------------------------------------------------------------------------------------------------------------
ps. 이글의 작성자는 정신이 온전치 못합니다. ;ㅅ;



출처: http://krrrrrrrrrr.tistory.com/74 [눈감고하는 코딩]