프로그래밍/Windows Phone7

Windows Phone7의 게임 개발 환경 (XNA) 리뷰

Terry Cho 2010. 8. 9. 22:26
Learning Kit에 들어가 있는 간단한 게임(갤럭시같은..) 튜토리얼을 따라해보고 리뷰를 올립니다.
먼저 이글을 올리기전에 제 백그라운드에 대해서 소개할 필요가 있는데,
94~97년정도까지 게임 개발을 했습니다. MS-DOS상에서 인라인어셈블리와 C/C++을 이용해서 2D 게임을 만들고, Direct-X 초창기 버전과 Direct 3D등으로 게임을 만들어본 경험이 있습니다.
시절이 10년은 지났으니, 결과적으로 게임 프로그래밍에 대해서 기본 개념은 있지만, 요즘 최신 게임 프로그래밍 기법에 대해서는 정보가 부족한 상황임을 미리 이야기 해둡니다.

사실 윈폰7의 게임 개발 프레임웍쪽에는 아주 기대가 컸습니다. 게임 이라는 컨텐츠가 스마트폰의 킬러앱중의 하나이고, 특히 윈폰7에서 XNA를 기반으로 개발된 게임은 X-BOX에서도 수정없이 포팅되서 돌아갈 수 있기 때문에, 개발자 입장에서는 같은 컨텐츠로 콘솔 게임과 스마트폰 게임 시장 양쪽을 모두 공략할 수 있다는 장점을 가지고 있습니다. 그리고 타 스마트폰 플랫폼과 다르게 전용 게임 플랫폼을 제공한다는 것이 매우 흥미로웠습니다.
일전에 개발자 컨퍼런스에서 윈폰7 XNA를 이용한 3D 게임 개발 데모를 본적이 있었는데, Collision 처리 (충돌처리-두개의 개체가 충돌하였다는 것을 알려주는 처리-예를 들어 총알에 맞았다. 이런거..)가 API하나로 해결되고, 각종 3D 이펙트(먼지가 난다거나, 샤방샤방 별가루가 떨어지는 처리등)이 아주 쉽게 개발되는 것들이 아주 신기했기 때문에, 나름 기대를 하고 튜토리얼에 접했습니다. 사실 제가 게임 개발했을때는 이런건 다 날코딩으로 만들어야 했습니다. 심지어 Direct X 이전에는 애니메이션을 표현하기 위한 스프라이트 처리 엔진 조차 인라인 어셈블리로 다 만들어야 했으니까요.

아래는 예제로 따라서 만든 게임 스냅샷입니다.

따라 해보시면 아시겠지만, 상당히 간단합니다.
2D 게임이라서 그런지, 몬가 대단한것이 있을거라는 기대(?)에 몬가 대단한것은 나오지 않았습니다. (그도 그럴것이 2D 게임에 필요한 프레임웍들이 뻔하니..)

몇가지 특이한것만 집어 보겠습니다.

리소스 로딩
게임에 필요한 음성,캐릭터 이미지,백그라운드 이미지들을 로딩하고 관리해야 합니다. 보통 파일을 열어서 일일이 읽어서 메모리에 적재하고, 필요한 파일들도 배포할때, 묶어서 배포해야 하는데, 이부분이 상당히 편리합니다. 다른 스마트폰 플랫폼에서도 될것 같긴한데... 구닥다리 게임 개발자의 시야에서는 신기하더군요.
필요한 리소스들을 비주얼 스튜디오에서 레퍼런스 부분에 Import만 하면됩니다.
리소스들을 사용할때는

이렇게 Load만 해주면 됩니다.
마치 자바의 리소스 번들과 같은 느낌입니다. 배포할때는 모든 리소스들이 함께 패키징 되니까는 상당히 편리하져.

3 스크린 지원
MS의 전략중에 강력한 전략중 하나가, 3 스크린이라는 전략이 있습니다. TV-PC-모바일을 모두 지원하고, 하나의 플랫폼처럼 지원하겠다는 겁니다. VOD 서비스를 TV-PC-모바일을 통해서 각 장점을 통해서 하겠다 모.. 그런건데..
XNA기반의 게임 역시 이 전략의 연장선산에 있습니다.
위에서도 언급했듯이, XNA기반의 게임은 윈폰뿐만 아니라, X-BOX는 물론이고 PC용 윈도우에서도 작동됩니다.
이를 가능하게 하려면, XNA로 개발한 게임을 해당 타겟 플랫폼에 맞게 빌드하면됩니다.
위에 스크린샷에도 보면 알 수 있듯이 Windows와 X-Box 360용 프로젝트로 만들어서 컴파일이 됩니다.

게임 처리 프레임웍
게임 개발 플랫폼에서 당연한것이겠지만, 게임의 실행 사이클에 맞는 프레임웍을 제공합니다.
게임은 보통 하나의 화면 단위로 진행되고, 하나의 화면은 리소스 로딩후, [ 입력을 받고, 캐릭터의 위치나 충돌 처리등과 같은 계산을 하고, 계산 결과에 따라서 화면과 음성으로 출력] 하는 루프를 반복합니다. 이런 프레임웍들이 내부적으로 다 구현되어 있습니다.
예를 들어 화면 처리 패턴은
class GameplayScreen : GameScreen
이런식으로, 상위 클래스로 지정되어 있구요. :)
스프라이트 처리 패턴을 보면 다음과 같습니다.
SpriteBatch.Draw(tankTexture, player.Position, Color.White);
이런식으로요. 상당히 편리하져.
아직 전체 프레임웍을 다 본게 아니라서 모라 말하기는 어렵지만, 일단 게임 개발의 생산성을 높이고, 게임 개발 패턴을 위한 상당히 성숙된 프레임웍을 갖추고 있습니다.

다음에 시간이 되면 3D 게임쪽을 찾아서 한번 봐야 겠습니다. 3D 게임쪽에서 다른 스마트폰 플랫폼들과 차이가 많이 날것 같네요. 혹시 아이폰이나 안드로이드에서 게임쪽 프로그래밍 하신분 계시면 피드백 환영합니다.


=== 추가 ===

충돌 처리 로직
위에서도 잠깐 언급했었는데, 게임 프로그래밍에서는 충돌 처리 로직이 필요합니다.두개의 객체가 충돌했을때를 감지하는 로직인데, 위의 예제에서는 별도 API를 안쓰고, X,Y 좌표축만으로 해서 몰랐는데, 다른 예제를 보니까는 충돌 처리 API가 있네요.

        void CheckForCollision()
        {
            BoundingBox bb1 = new BoundingBox(new Vector3(spritePosition1.X - (sprite1Width / 2), spritePosition1.Y - (sprite1Height / 2), 0), new Vector3(spritePosition1.X + (sprite1Width / 2), spritePosition1.Y + (sprite1Height / 2), 0));
            BoundingBox bb2 = new BoundingBox(new Vector3(spritePosition2.X - (sprite2Width / 2), spritePosition2.Y - (sprite2Height / 2), 0), new Vector3(spritePosition2.X + (sprite2Width / 2), spritePosition2.Y + (sprite2Height / 2), 0));
            if (bb1.Intersects(bb2))
            {
                soundEffect.Play();
            }
        }

BoundingBox라는 사각형 공간을 정의하고 두 공간간에 충돌을 intersects라는 함수로 비교합니다.
잘 보시면 아시겠지만, BoundingBox를 정의하는것을 두개의 벡터로 정의합니다. 각각의 벡터는 3개의 좌표를 가지고 있습니다. X,Y,Z축 입니다. 즉!! 3D에서 충돌처리를 지원하기 위한 함수라는 것입니다. 위의 예제는 2D의 예제라서 Z축을 0으로 했네요.
 
그리드형