본문 바로가기
Development/Free Topic

XNA from Siverlight 방법

by IMCOMKING 2014. 6. 17.

주의사항 1.

 게임 쪽을 수정한 다음에는 반드시 게임 프로젝트를 빌드하여야만 dll이 갱신되어 올바르게 작동한다.


주의사항 2.

 서버를 이용하는 경우 서비스 레퍼런스이름이 실버라이트의 것과

똑같아야한다. 왜냐하면 아마도 서비스레퍼런스.클라이언트콘피그 이 파일이

본래의 프로젝트의 실버라이트 것만 참조하기 때문인 것 같다.



0. 기존 실버라이트 솔루션에 오른쪽 버튼눌러 add를 클릭하여

existing 프로젝트를 눌러 xna 프로젝트를 추가한다.


그리고 기존 실버라이프 프로젝트에 모든 xna레퍼런스를 추가한다.


그리고 system.window 도 추가해준다.


그다음 프로젝트를 카피하여 윈폰으로 만든다음, 원래 윈도우 프로젝트는 지운다.


그다음 컨텐트(정확히 Content라는 이름으로) 폴더를 하나 만든다음, 디버그 폴더를 잘뒤저서

.xnb 파일들을 다 추가한다. 그다음 프로퍼티에서 빌드액션을 콘텐트로 바꿔준다. 여러 게임 프로젝트를 추가할경우, 이 리소스 이름이 안겹치게 조심할것


그리고 윈폰 프로젝트에서 debug 폴더안에 있는 dll을 레퍼런스로 추가


1. 게임을 불러올 Page1.xaml 파일을 하나 생성한다.


2. NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative));


으로 메인 페이지에서 버튼등을 눌렀을때 Page1.xmal을 불러온다. 동시에


protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)

{

     //this.NavigationService.GoBack();

     Page1.game.Exit();


}

을 써준다.



3. Page1.xaml 파일에 다음을 추가한다


그리고 


using System.Windows.Threading;

using Microsoft.Xna.Framework;


을 선언해준다



//이때 윈도우폰게임1 의 이름은 프로젝트 네임스페이스에 맞게 바꿔준다

        private DispatcherTimer gameLoopTimer;

        static public WindowsPhoneGame1.Game1 game;


        public Page1()

        {

            InitializeComponent();


            game = new WindowsPhoneGame1.Game1();


            game.InitializeGraphics();

            game.CallInitialize();

            game.CallBeginRun();


            GameTime gameTime = new GameTime();

            this.gameLoopTimer = new DispatcherTimer();

            this.gameLoopTimer.Tick += new EventHandler(this.gameLoopTimer_Tick);

            this.gameLoopTimer.Interval = game.TargetElapsedTime;

            this.gameLoopTimer.Start();

        }



        private void gameLoopTimer_Tick(object sender, EventArgs e)

        {

            game.RunOneFrame();

            if (game.getgoout())

            {

                //NavigationService.GoBack();//이걸쓰면 뭔가 라이프사이클이 죽어버린 상태로가버린다

                

                NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));//그래서 이걸 써야 라이프사이클을 새로부른다.

                //그랬더니 어플을 종료시키면 게임의 마지막 화면이 떠버린다.. 그래서 뒤로돌아가면서 자기자신을 죽여야 할것같다.

                

                

                gameLoopTimer.Stop();

                game.CallEndRun();

                game.FinalizeGraphics();

                game.Dispose();

                //game.Exit();//이걸하면 계속 다죽어버린다...거참이상하네. 아무래도 게임에서 뭔가 강하게 라이프사이클을 잡고있는듯..

                

            }

        }





4. Game1.cs에 다음을 추가한다.



생성자 public Game1(){}에


     TargetElapsedTime = TimeSpan.FromTicks(333333);




멤버변수 선언



        bool goout=false;


다음 메서드를 추가



        public void CallInitialize()

        {

            this.Initialize();

            this.graphics.DeviceReset += new EventHandler<EventArgs>(graphics_DeviceReset);

        }


        void graphics_DeviceReset(object sender, EventArgs e)

        {

            this.LoadContent();

        }


        public void Call_LoadContent()

        {

            this.LoadContent();

        }


        public void Call_UnLoadContent()

        {

            this.UnloadContent();

        }


        public void CallBeginRun()

        {

            this.BeginRun();

        }


        public void CallEndRun()

        {

            this.EndRun();

        }


        public void CallUpdate(GameTime gameTime)

        {

            this.Update(gameTime);

        }


        private IGraphicsDeviceManager graphicsDeviceManager;


        public void InitializeGraphics()

        {

            this.graphicsDeviceManager = this.Services.GetService(typeof(IGraphicsDeviceManager)) as IGraphicsDeviceManager;


            if (this.graphicsDeviceManager != null)

            {

                this.graphicsDeviceManager.CreateDevice();

            }

        }


        public void FinalizeGraphics() {

            GraphicsDevice.Dispose();

            //this.

            //ContentManager c = new ContentManager)

        }



        public bool getgoout() {

            if (goout == true) {

                //this.Exit();

                return goout;

                }

            return false;

        }







업데이트 종료 조건을 다음으로 변경


            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

            {

                goout = true;

            }







Draw 함수의 맨 위와 아래에 다음을 추가



            graphicsDeviceManager.BeginDraw();


            graphicsDeviceManager.EndDraw();


댓글