블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 
 
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으로 했네요.
 
오늘 MS 개발자 행사인 RemixK에 다녀왔습니다.
10년 이상 자바개발자 행사만 다닌 저한테는 다소 낮선 자리였습니다.

오늘 컨퍼런스 내용중에 흥미로웠던것중에 하나가 WinMobile7이었습니다.
년말에나 나올 '내일폰'이긴 합니다만.
Feature들이 흥미로워서 이야기 해봅니다.

크게 개발환경이 SilverLight와 XNA로 나뉘어 지는데, 일반적인 애플리케이션 개발은 SilverLight기반으로 하게 되어 있습니다. 그런데 개발툴이 일반 개발자 개발툴이라기 보다는 동영상 저작도구 같은 느낌이더군요. 아이폰의 Object C 개발환경, 이클립스 기반의 안드로이드 개발환경을 맛본 저로써는 다소 신선했습니다. 저작도구 답게 UI프로그래밍이나 이펙트가 매우매우 쉽습니다.
아마 아이디어만 있다면 웹디자이너라도 쉽게 기본적인 어플은 만들 수 있겠더군요.

그리고 다음이 XNA인데, 게임 개발 플랫폼입니다. 상당히 흥미로운 점은 XNA로 개발된 윈모7게임은 XBOX와, WIN7에서도 똑같이 동작합니다. 물론 화면 사이즈에 맞춰서 다시 렌더링 되서 말이지요. 이게 소위 MS에서 이야기하는 3Screen입니다. 한번 개발해서 모바일,데스크탑,TV에서까지 모두 사용할 수 있다는 겁니다.
게임 개발 프레임웍도 상당히 쉽습니다. 10년전(?)에 Direct X로 게임 개발을 하고 OPEN GL로 3D 프로그래밍 경험을 했을때 이것저것 만드느냐고 상당히 시간이 오래걸렸는데, 허허~~ 오늘 보니 이건 거의 거져 만들더군요. 충돌 로직이나 조이스틱,화면 IO,애니메이션 처리.. 한마디로 거져라고 말할 수 밖에 없을만큼 쉬워졌습니다.

그럼 이런것들이 무엇을 뜻 하느냐?

1. 개발자들의 진입이 쉬워집니다.
누구나 아이디어만 있다면 기술의 장벽을 넘어서 컨텐츠를 제공할 수 있다는 겁니다.
2. 시장이 넓다.
XNA기반의 게임 컨텐츠는 한번 개발하면 PC,X-BOX,모바일 환경에 모두 판매가 가능합니다. 한마디로 개발자의 투자 대비 수익이 늘어나는 거지요..

이 두가지 특징만 해도 모바일 플랫폼으로 무시 못할듯 싶습니다.
여기에 더불어서, 윈모7 탑재 디바이스들은 철저하게 스펙 규약이 있기 때문에 (화면 사이즈, CPU 제약,메모리 제약). 안드로이드가 겪고 있는 여러 스펙의 디바이스로 부터 오는 문제를 피해갈 수 있습니다.

또한 MS의 Azure 클라우드는 모바일 서비스에 새로운 가능을 제시해줍니다. 3G망 기반의 모바일 애플리케이션들은 인터넷을 통해서 통신을 하거나 OPEN API들을 호출합니다. 애플이나 안드로이드에서 작동하는 앱들은 대부분 공개된 오픈 API를 사용합니다.
그렇다면 특화된 서비스를 개발하고 싶다면? 서버 사이드를 구축해야할 필요가 있다면?
사야져... 서버도 사고.. 세팅과 운영도 하고... 개인이 하기는 비용이 만만하지 않습니다. 그래서 일부 전문 업체만 서버를 두고 OPEN API를 통해서 자사의 앱과 통합하는 형태를 가집니다.
그런데....
MS는 Azure를 들고 나왔습니다. 클라우드 플랫폼이져.. 개발이 다른 클라우드 플랫폼에 비해서 매우 쉬운 (비주얼 스튜디오에 개발환경이 통합되어 있어서, 기존 웹 개발 환경만 이해한다면 별도의 Learning Curve가 필요없습니다. ) 장점을 가지고 있고, 사용량에 대해서 과금을 하기 때문에, 손쉽게 서버를 갖출 수 있습니ㅏㄷ.

XNA지원,3Screen,모바일용 클라우드 보유

이 3가지 장점만 해도 모바일 2라운드를 한번 해볼만 하지 않을까 싶네요.
애플이 4세대 아이폰을 내고, 안드로이드 2.2가 경이로운 성능을 보여주기는 하지만 근본적으로 접근 방법이 틀리다는데에서 기대를 걸어봅니다.