최근 시험기간과 과제물의 압박으로 포스팅이 많이 늦었군요...다시 시작해봅시다.. ㅎㄷㄷ
시작하기전에 잠시;;;말씀드리면 이 포스팅들은 tutorial 의 느낌보다는 제가 공부하는 느낌으로 작성
하는 것이므로-_-틀린내용이나... 모르는내용이 있을수 있습니다. ㅎ 다같이 공부하는 느낌으로 갑시다.^^
틀리면-_-;;;댓글도 달아주셔도 되구요 테클 환영이에요 플밍에대해서 잘 모르지만 게임제작이 하고싶어서
하게 된 학생이라서요^^;  

자 이번에는 헤드놈의 방향에 맞춰서 미사일을 발사시켜보겠습니다 2D게임의 미사일 발사와 비슷합니다.

가장먼저 해야 할것은 게임오브젝트 클래스에 있는 내용을 고쳐줘야 하겠습니다.

사용자 삽입 이미지









게임1 클래스로 돌아가서 선언합니다.

사용자 삽입 이미지




다음 로드컨텐츠에서 미사일수만큼 모델을 로드시킵니다.

사용자 삽입 이미지







  KeyboardState previousState;//연속방지용 키보드현재상태 맨위 선언쪽에 이거추가해주시구요

이제 스페이스 키를 눌렀을때 미사일발사 함수를 호출합시다 2D게임과 같은 형식입니다.

사용자 삽입 이미지





키보드 상태를 조절해서 이프문으로 한번에 한번만 함수를 호출하는 형식입니다.

사용자 삽입 이미지

함수를 작성합니다. 3D형태라서 위치와 좌표를 따로 함수로 지정해서 값을 리턴하겠습니다.

사용자 삽입 이미지
X,Y 좌표를 런쳐헤드에서 가져와서 좌표를 설정하고 이제 Z축으로만 움직이면 이동경로가 되겠습니다.
리턴합니다 노말라이즈(이동한다(앞방향으로,이동좌표에서))*속도만큼 곱


사용자 삽입 이미지
이동하는만큼 미사일위치를 계속 바꿔줘야 할것입니다.


이제 발사되었다면 미사일을 앞에서 적은 함수만큼 이동시켜야 할것입니다.
사용자 삽입 이미지

매시간 실행되는 함수입니다. 미사일이 발사되었다면 미사일을 이동좌표만큼 움직입니다.

이제 발사된 상태라면 화면상에 그립니다.
사용자 삽입 이미지







예이제 디버깅해보도록 합시다.
사용자 삽입 이미지
잘 날아가는군요 `ㅡ` 화면이 좀 검게 변했는데
2.0에서 3.0 으로 옮겼더니 전체적으로 색이 검게 변했네요;;
FBX 성능관련한 문제인데 이부분에 대해서는 나중에 따로 포스팅하겠습니다.
이제 미사일의 헤드부분을 불러와서 로테이션 시켜보겠습니다 키보드 입력에 따라서 ^^

사용자 삽입 이미지








게임오브젝트에 미사일헤드를 선언합니다.

로드컨텐츠에 가셔서 미사일헤드 3D파일을 추가시킵시다.

사용자 삽입 이미지






이제 움직임을 제어해봅시다.

그전에 소스를 조금 수정해야 되겠습니다;;;; ㅈㅅ
사용자 삽입 이미지








월드 부분에 XYZ순으로 작성해주세요 -_ -YXZ였죠?ㅎㅎ;;;
키보드 입력을 받아서 움직여봅시다.
사용자 삽입 이미지















X,Y,Z 에 움직임을 주시구요
MathHelper.Clamp 사용해서 각도를 제한하도록 합시다.
위 문법의 사용법은 2D 슈팅게임만들기에서 언급한내용입니다^^

이제 다되었습니다 디버깅해봅시다^^
사용자 삽입 이미지

좌우로 잘움직입니다.
다음시간은 미사일을 구현하도록 하겠습니다.^^
이번에는 미사일런처 를 출력시키겠습니다.-_-런처?;;;미사일거치대?;;;미사일...뭐...흠...조종대?...그런거..

출력물이 하나더 올라가는것보다는 이번 장에서 중요한것은 게임오브젝트 클래스를 만들것입니다.

2d게임만들기에서 게임에 등장하는 오브젝트들을 한번에 만들기위해 클래스를 만들었던것과 동일합니다.
그럼 클래스를 만들어봅시다.

위에 유징부분은 아래와 똑같이 붙여넣기 해주세요^^
사용자 삽입 이미지


















클래스를 하나 추가하시고 제목은 GameObject 로 지정합시다.
3D를 받을 모델과 그 모델의 위치 각도 크기를 지정할수 있습니다.

앞에서는 게임오브젝트클래스 없이 가져왔기 때문에 본래 소스들이 조금 바뀌겠죠?
사용자 삽입 이미지



위와 같이 선언해주시구요~

사용자 삽입 이미지







각 각 수정합니다.
미사일거치대 크기를 수정하였습니다. 원래사이즈에 1/5 크기죠? ㅎ

앞시간에 3D Draw를 위해 만들었던 함수도 이름을 아래와 같이 바꿔주시고
DrawGameObject(){
사용자 삽입 이미지











이펙트월드부분이 제가 이해를 잘못한듯합니다. 이부분은 조금더 공부한후 수정하도록
하겠습니다. 일단 흐름상 저렇게 이해했습니다.



이제 출력합시다.

Draw 부분에 작성했습니다. 상당히 깔끔해졌죠?^^
사용자 삽입 이미지



디버깅 하도록 합시다.
사용자 삽입 이미지
네 이번에는 3D 게임을 제작하겠습니다
가장먼저 배경부터 깔아보겠습니다^^

사용자 삽입 이미지
솔루션 탐색기에 모델폴더 이렇게 추가해주시구요~ 자시작합시다.
사용자 삽입 이미지
앞에 3D표현에 나오는내용과 똑같습니다 설명은 생략하겠습니다.
사용자 삽입 이미지
로드 컨텐츠 부분에 작성했습니다. 3D표현과 내용 동일합니다.
바뀐점은 카메라 앵글부분이 45도로 나와있습니다.
수치들이 확실히 눈에 익지않아서 어떤 부분이 어떻게 동작하는지 모를때는
각 각 수치를 조정해보면서 눈으로 보고 익히는것이 가장 빠릅니다. 설명보다는 ㅡㅡb

사용자 삽입 이미지

앞에 3D표현에서는 effect 관련해서 많은 코딩들이 있었는데요 그 것을 하나의 함수로
정의해놨습니다. 훨신 보기편하고 사용하기도 편하군요 `ㅡ`
DrawModel 을 호출합니다.
사용자 삽입 이미지
인자로는 모델과, 모델의 위치를 받고있습니다.
그리고 이펙트들을 설정해주고 있습니다.
전체적인 부분이 3D표현과 같습니다 앞에서 공부한 내용이니 빨리넘어갑시다ㅎ
디버깅해봅시다^^ 잘나옵니다~
사용자 삽입 이미지

#참고 fbx 파일은 3d맥스에 플러그인을 설치하시면 만드실수 있습니다.^^


3D게임 제작에 앞서 간단하게 어떻게 3D가 구현되는지 확인해보겠습니다.


위 파일이 저희가 구현할 3D 파일입니다. -_-친구가 모델링한걸 몰래 가져와서 씁니다 흐흐
가장먼저 솔루션 탐색기에 Models 폴더에 위에 다운받은걸 다 풀어주세요~ㅎ

사용자 삽입 이미지

선언부입니다 그림하나 표현하는데 상당히 많은 선언이 나타났습니다.
일단 쭈욱 한번 읽어보세용 ^^

사용자 삽입 이미지

#참고 출처(riemers XNA tutorial)
여기서 잠깐 matrix에 대한 얘기를 잠깐하고 넘어가겠습니다. 일반적으로 우리는 3D공간에 vertex라 부르는 일련의 점들을 위치시키곤 합니다. 하지만 우리가 눈으로 보고 있는 화면은 결국 2D입니다. 즉 우리가 3D라고 생각하는 공간은 어디까지나 가상으로 존재하는 공간일뿐, 실제하는 것은 2D인 화면뿐입니다. 그래서 우리는 가상의 3D공간을 2D의 화면을 통해 출력하기위해 matrix를 씁니다. 3D공간의 위치값을 matrix로 표현하면 이를 2D 화면의 위치값으로 변환하기가 간단해집니다.

위 매트릭스에 관한 간단한 지식을 가지시고 시작합시다.
CreateLookAT(카메라 , 카메라위치 , 위를 바라봄)
CreatePerspectiveFiedOfView(
카메라 앵글 각도
화면 크기 설정
대상 구간 최소값
대상 구간 최대값
)
대상 구간이란 표현한 3D객체가 그 범위안에 있어야 보입니다.
1~1000 안에 있어야 객체들이 카메라에 비춰질것입니다.

사용자 삽입 이미지
매시간 모델을 회전시키기위해 한줄 추가되었습니다.

사용자 삽입 이미지

Draw에 많은 내용이 있습니다.
foreach아래로 3d를 표현하기 위해  effect를 다 주었습니다.
전체적으로 3d를 표현하려면 이런 이펙트들을 줘야 한다 정도로 이해합시다
effect하나하나 보시면 어느정도는 이해가 가능하실 겁니다.

자 이제 모든 준비가 끝났습니다. 디버깅해봅시다.

사용자 삽입 이미지

 3D구현에있어서 간단하게 맛을 봤습니다.
잘 돌아가는군요 `ㅡ` 다음시간 부터는 3D슈팅 게임제작에 들어가겠습니다.

게임 점수판을 만들어 주겠습니다.
이것도 상당히 간단합니다. 전체적으로 이해만하신다면 순식간 + _ +흐흐

솔루션 창에 Fonts 라는 새폴더를 만들고 새항목 추가를 클릭하셔서
Sprite Font를 하나 만듭시다.

사용자 삽입 이미지
























제목은 위와 같이 해주시구요 ^^
만드신후 GameFont.spritefont 를 더블클릭하시면 XML이 나옵니다...뭐지...ㅎㅎ
걱정하지마시구 두가지만 설정해주시면 됩니다.
사용자 삽입 이미지








폰트네임과 크기를 설정해 주었습니다. 우리가 사용할 폰트 설정마쳤구요~이제 선언합시다.

사용자 삽입 이미지



선언부에 3가지가 추가 되었습니다. 위치에 0.1f,0.1f 이유는 아시겠죠 이제 ^^화면크기에 곱할거에욤
이제 폰트를 로드하도록 합시다.

사용자 삽입 이미지


요거 한줄 추가 되었습니다.

아 그리고 비행기 격추시 스코어 값을 더해줘야겠죠 ?

public void UpdateCannonBalls()함수에 이부분이 수정되었습니다.
사용자 삽입 이미지






1점씩 더해주시구요 이제 화면에 그리기만 하면 됩니다.^^

사용자 삽입 이미지





DrawString (
         글씨체(font),
         출력할text,
         위치,
         색지정
)
#참고 : ToString() 은 int값을 문자열로 반환합니다^^
자 이제 디버깅 해봅시다. ^^
사용자 삽입 이미지

이것으로 2D 슈팅게임 만들기가 완성되었습니다.
XNA에서 기본적으로 나오는 tutorial을 따라했습니다.
다음은 3D슈팅게임 만들기로 넘어가도록 하겠습니다.
소스 첨부 하겠습니다.^^
수고하셨습니다.



총알과 적기가 충돌하면 비행기가 사라지도록 구현하겠습니다.
간단합니다 충돌에 대한 메서드가 기본적으로 있어서-_-바로 적으면 되는군요;;

우리가 할일은 미사일영역과 비행기 영역을 설정해주고
그 두영역이 충돌시 없애주기만 하면 됩니다.
 public void UpdateCannonBalls() 함수를 수정합니다.
미사일이 발사 되었을 때 !!

사용자 삽입 이미지

















Intersects 이함수가 두영역이 곂쳐지면  true 를 출력합니다.
if문으로 간단하게 완성되었습니다.

디버깅해봅시다.

이번에는 적기를 출현시켜 보겠습니다.
선언부에 추가된 내용입니다.

사용자 삽입 이미지






적기 출현 높이가 0.1~0.5인 이유는 게임화면 높이에다가 곱해서 1/10지점에서~5/10 출현시키려고 합니다.

다음 로드컨텐츠에서 이미지를 로드합니다.
사용자 삽입 이미지
 





총알 발사와 마찬가지로 함수를 하나 만듭니다.
사용자 삽입 이미지




























적기 출현시 velocity 수치만큼  x축으로 이동할 것이구요~ 화면 밖으로 나가면 사라집니다.

위에 함수에서 새로 나온 부분이
                    enemy.position = //비행기의 출현 위치를 설정합니다//
                        new Vector2(
                        viewportRect.Right,
                        MathHelper.Lerp(
                        (float)viewportRect.Height * minEnemyHeight,
                        (float)viewportRect.Height * maxEnemyHeight,
                        (float)random.NextDouble()));
이부분 입니다.
조금 복잡해 보이지만 똑같습니다 MathHelper.Lerp 이부분만 이해하시면 쉽습니다.
MathHelper.Lerp(최소값, 최대값, 0~1비율값)
최소 최대값 사이에 값을 출력해주는 함수입니다.
0에 가까울수록 최소값에 가까운값을 출력하고
1에 가까울수록 최대값에 가까운 값을 출력합니다.
0이면 최소값 1이면 최대값이 되겠죠?
화면크기 높이* 0.1 ~ 화면크기높이 *0.5 이 사이에서 적기가 출현 할것입니다.
#참고 랜덤.NextDouble 0.0~1.0 사이의 난수를 반환합니다.

다음 움직임을 주는것도 똑같습니다. Vector2(x축,0) 비행기는 x축으로 움직여야 함으로
x축에 최대 최소 좌표값을 넣어두었습니다 1~5까지 랜덤하게 움직이겠습니다.
#참고 UpdateEnemies() 이함수는 매프레임 실행되어야 합니다. 어디에 넣는지 아시죠?

이제 적기의 모든 초기화가 끝났습니다. 이제 화면에 출력하도록 합시다.

사용자 삽입 이미지







별다른 내용없습니다. 이제 디버깅해봅시다.
사용자 삽입 이미지

+ Recent posts