주의사항 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();
'Development > Free Topic' 카테고리의 다른 글
안드로이드 DB, SQLite (0) | 2014.06.19 |
---|---|
Excel, Spread Sheet(google), VBA (0) | 2014.06.17 |
디자인 패턴(Design Pattern) (0) | 2014.06.11 |
안드로이드 여러가지 트러블 슈팅 (0) | 2014.06.10 |
안드로이드 파일 입출력, 경로, 모드 / 네트워크 통신 (2) | 2014.06.10 |
댓글