티스토리 뷰

증강 현실이란 개념이 등장한 것은 얼마 안됬습니다. 하지만 오늘날에는 이를 구현한 어플들이 많이 등장하고 있습니다. 가까운 예로는 오브제라는 앱이 있습니다. 카메라를 이용해서 건물을 비추면 건물에 입주해있는 상점에 대한 정보를 보여주는 기능을 하는데 현실 공간속에 임의의 정보를 실시간으로 띄워주면서 조금더 삶을 풍성하게 해주지요. 이런 걸 키넥트로도 할 수 있습니다.

이번 프로젝트의 이름은 CloudGame입니다. 사람이 게임속에 직접 들어가서 구름을 움직일 수 있는 프로젝트이죠. 물론 매우 복잡한 프로젝트이기에 여러차례로 나눠서 언급하고자 합니다. 참고로 여기에는 앞 포스팅에서 언급했던 ColorFrame, DepthFrame, SkeletonFrame이 전부 사용됩니다. 일단 XNA 프로젝트로 게임을 만들어봅니다. 그리고 키넥트와 관련한 레퍼런스를 추가해줘야겠지요.

맨 처음으로 할일은 구름을 백개 생성하는 일입니다. 그 구름에 대한 것은 아래의 이미지를 받아서 Content에 삽입해주면 됩니다.

C#의 특징은 이런 개체를 클래스화시킬 수 있다는 겁니다. 이런 구름에 대한 정의를 한개만 해두면 100개를 생성할 때는 그 클래스를 한번만 언급해주면 그대로 사용할 수 있는거지요. 그래서 그 개념을 사용하고자 합니다. 우선은 이 클라우드를 그리기 위해서는 XNA 내에서 Update와 Draw 메서드가 필요합니다. 이걸 따로 빼서 interface화 시킵니다. 다음과 같이 처리해주면 됩니다.

이제 Cloud에 대한 클래스에서는 Cloud뒤에 ISprite라는 문구만 써주면 똑같이 game1내에 있는 Draw와 Update 메서드를 쓸 수 있게 됩니다. 역시 이 부분은 다음과 같이 써줍니다.

옆의 코드맵을 보셔도 아시겠지만 Isprite 하위 메서드로 Draw와 Update가 설정되어 있는 것을 확인할 수 있습니다. Cloud라고 정의되어 있는 부분 내에서도 똑같이 사용할 수 있습니다. 이 클래스 내에서 사용할 변수를 선언해줘야 합니다. 대신 클래스내에서 정의할 때는 공용을 쓰게 하기 위해서 public 이 적용되어야 합니다. 물론 그 변수가 선언된 클래스 내에서만 쓰일 경우에는 private를 써주면 되고요. 지금 cloud의 위치와 같은 정보는 이 클래스 외에서도 적용되기 때문에 당연히 public화 시켜줘야 합니다.

우선 내에서 선언해줘야 할 부분은 구름을 그려주는 것, 구름의 위치, 구름이 이동하는 속도, 그리고 건드렸을때 터지는 것에 대한 정보를 Burst와 CloudPopSound로 두었습니다. 무엇보다도 게임을 만듬에 있어서 가장 중요한 요소는 바로 랜덤화입니다. 무언가가 나타날 패턴이 정해져 있다면 그건 게임이 아니고 재미도 없겠지요. 그것에 대해서 랜덤 메서드를 사용하는 겁니다. 이제 이 밑으로는 그리는 것에 대한 코드를 작성해주면 됩니다. 

Draw는 간단합니다. 그저 그림만 그려주면 되지요. 다만 역시 game1의 메서드를 그대로 빌려서 쓰기 때문에 항상 game.xxx 식으로 써줘야 그대로 사용 가능합니다. 다음은 Update 입니다.

우선 이 부분에서는 구름의 위치를 정해줘야 합니다. 그 위치는 cloudTexture의 크기에 따라서 결정됩니다. 다만 게임화면의 시점에서 나올때만 등장해야되기 때문에 그 조건이 활성활 됬을 때 정확한 Position이 정해집니다. 참고로 X는 그냥 그 폭이 될것이고 Y는 random 함수를 정해줘서 임의 위치에 나타내주면 될겁니다.

참고로 밑에 있는 조건은 Cloud를 건드렸을때의 조건입니다. 이는 구름이 생성될때 모든 구름이 다같은 속성을 지니기 때문에 이를 Cloud 클래스에 삽입시킨겁니다. 이때는 터지는 소리가 나고 Brust가 true가 되면서 이미지가 없어진다면 조금 효율적인 표현이 되겠지요. 자 이제 cloudContains 에 대한 코드입니다.

이 CloudContains의 입력으로는 사용자의 포인트점을 찍어주면 됩니다. 그래서 구름의 폭만큼의 범위내에만 포인트가 찍히면 true값을 반환하게 됩니다. 이는 충돌 이벤트라면 기본적으로 적용되는 메서드입니다. 

자 이걸 공용 메서드로 사용하기 위해서는 다음과 같이 쓰면됩니다.

이렇게 처리하면 밖의 메인에서도 그냥 Cloud 메서드만 쓰면 여기에 해당하는 클래스 함수내 메서드들이 자동으로 실행될겁니다. 이로써 cloud 클래스는 마무리 됩니다. 이제는 메인에서 처리해줍니다. 

자 우선 아까 지정하지 못한 PinVector를 지정해줍니다. 

그리고 이제 클래스화시킨 구름을 50개 만들어야 합니다. 그전에 각각의 정보를 나열할 리스트가 하나 있으면 좋겠지요. 물론 각각은 아까 생성한 ISprite가 포함되어야 합니다.

이제 할일은 그림을 그리는 일입니다. 물론 그전에 앞서서 LoadContent 부분에서 Content에 삽입한 Cloud.png 파일을 불러와야합니다. 여기에 덧붙여서 이런 List에 Cloud를 삽입하는 작업을 해줘야 합니다.이에 대한 코드는 다음과 같습니다. 

참 아까 변수 선언시에도 Random 메서드를 하나 생성해줍니다. 그래야 위와 같이 쓸 수 있습니다. 아까 Cloud의 마지막 변수는 SoundEffect였습니다. 그에 대한 것도 역시 삽입해주면 좋겠지요. 자료는 다음걸 첨부하시면 됩니다.

그리고 역시 LoadContent에서 호출합니다. 

자 이제 구름을 몇개 만들지만 결정하면 됩니다. 이를 좌우하는 변수는 바로 noOfCloud 입니다. 앞에서 50개를 만들려고 했으니 역시 변수 선언을 통해서 정해줍니다.

마지막으로 Draw와 Update에서 다음과 같이 처리해주면 됩니다.


이것이 결과 영상입니다.


오늘은 어쩌다 보니 키넥트관련 이야기가 아니라 게임을 만드는 이야기를 했었네요. 아무튼 다음 포스팅에서는 실제로 그림속에 사람을 등장시키는 걸 해보고자 합니다. 물론 이때는 지금까지 배웠던 내용이 총망라되겠지요 ㅎ 



댓글