SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Windows Phone 7.5でつくる3Dアプリケーション

SilverlightとXNAを融合させてWindows Phoneアプリケーションを開発しよう

Windows Phone 7.5でつくる3Dアプリケーション(2)

  • X ポスト
  • このエントリーをはてなブックマークに追加

Silverlightの上でXNAが動作する画面

 Silverlight/XNAのベースがSilverlightであるということは、着目すべきはSilverlightの上でXNAが動作している水色の画面(GamePage)です。この画面は「GamePage.xaml」と「GamePage.xaml.cs」から構成されています。これらのファイルを解析することにより、Silverlight/XNAの仕組みを見てみましょう。

 「GamePage.xaml」ファイルは、以下のように、ほぼ空のXAMLコードになっています。

GamePage.xaml
<phone:PhoneApplicationPage 
    x:Class="SlXnaApp1.GamePage"
    …中略…">
    
    <!--完全に XNA Framework を使用してページをレンダリングするため、XAML コンテンツは必要ありません。-->

</phone:PhoneApplicationPage>

 一方、「GamePage.xaml」のコードビハインドである「GamePage.xaml.cs」ファイルには、以下のようなコードが書かれています。

GamePage.xaml.cs
public partial class GamePage : PhoneApplicationPage
{
    ContentManager contentManager;
    GameTimer timer;
    SpriteBatch spriteBatch;

    public GamePage()
    {
        InitializeComponent();

        // アプリケーションからコンテンツ マネージャーを取得します
        contentManager = (Application.Current as App).Content;

        // このページのタイマーを作成します
        timer = new GameTimer();
        timer.UpdateInterval = TimeSpan.FromTicks(333333);
        timer.Update += OnUpdate;
        timer.Draw += OnDraw;
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        // グラフィックス デバイスの共有モードを設定して XNA レンダリングを有効にします
        SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode(true);

        // 新しい SpriteBatch を作成します。これは、テクスチャの描画に使用できます。
        spriteBatch = new SpriteBatch(SharedGraphicsDeviceManager.Current.GraphicsDevice);

        // TODO: ここで this.content を使用してゲーム コンテンツを読み込みます

        // タイマーを開始します
        timer.Start();

        base.OnNavigatedTo(e);
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        // タイマーを停止します
        timer.Stop();

        // グラフィックス デバイスの共有モードを設定して XNA レンダリングを無効にします
        SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode(false);

        base.OnNavigatedFrom(e);
    }

    private void OnUpdate(object sender, GameTimerEventArgs e)
    {
        // TODO: 更新ロジックをここに追加します
    }

    private void OnDraw(object sender, GameTimerEventArgs e)
    {
        SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Color.CornflowerBlue);

        // TODO: 描画コードをここに追加します
    }
}

 それでは、このコードに関して、要点を説明していきましょう。

Silverlightの上でXNAのゲームループを生成する

 まずフィールドに着目すると、GameTimerというクラスを定義しています。このクラスこそがSilverlight/XNAにおける要の一つです。

GameTimer timer;

 XNAでは、Gameクラスを継承し、そのUpdateメソッドやDrawメソッドをオーバーロードしていましたが、Silverlight/XNAでは、このGameTimerクラスのUpdateイベントやDrawイベントを使ってゲームループ処理を記述します。この際、GameTimer.UpdateIntervalプロパティには、ゲームループの発生間隔を設定できます。

public GamePage()
{
    timer = new GameTimer();
    timer.UpdateInterval = TimeSpan.FromTicks(333333);
    timer.Update += OnUpdate;
    timer.Draw += OnDraw;
}
GameTimerクラスによるゲームループ
GameTimerクラスによるゲームループ

 GameTimerクラスは、PhoneApplicationPage.OnNavigatedTo()メソッド内で開始し、PhoneApplicationPage.OnNavigatedFrom()メソッド内で停止しています。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    timer.Start();
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    timer.Stop();
}

 これらはそれぞれ、他画面から自画面に遷移したときと、自画面から他画面に遷移するときに呼ばれるメソッドです。これにより、自画面に遷移したときにゲームループが開始され、他画面に遷移するときにゲームループが停止する仕組みとなっています。

PhoneApplicationPageクラスによる画面遷移
PhoneApplicationPageクラスによる画面遷移

次のページ
Silverlightの上でXNAの描画を有効にする

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Windows Phone 7.5でつくる3Dアプリケーション連載記事一覧

もっと読む

この記事の著者

もとひろん(モト スクウェア ソリューション)

自営業でシステムエンジニアを営んでおります。主に.NETテクノロジによるシステム開発を得意としておりますが、いざとなれば何でもやります。ふつつかものですが、よろしくお願い致します!WebサイトMOTO SQUARE SOLUTIONTwitter@MOTOSQUARE 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6244 2011/11/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング