がりらぼ

WindowsRuntimeの応援ブログ

WindowsPhoneでゲームがつくりたいんだろ?基礎知識伝授するよ!

どうも、走るブタとかつくってたがりっちです。
9日目ということでノリで参加したAdventCalenderというわけでみんなとネタがかぶらないようにかつ、Geekすぎないようにいろいろ考えた訳ですが、走るブタがゲームというわけあってゲームの作り方を解説していきたいなとおもっております。
前置きはさておき早速解説していきますが、私がそうなようにゲームを何作も出してる訳ではないのでそんなにすごいところまで解説できません。WP初心者がゲームを作りやすくなるように解説していくつもりです。

  • XNA GameStudio

さてWPでゲームつくるにはどうするか。SilverLight!←チガウ。そう、皆さんご存知!?XNAプラットフォームです。
XNAというものはMicrosoftのゲーム開発環境、つまり次世代DirectXみたいなもんです。←違ったらごめんなさい。
画像表示や音楽再生、ゲームループなど基本的なゲーム開発機能だけでなく、GameConponentというゲームの部品化システムや.NetFramework資産の活用など大規模ゲームを開発しやすくなっています。XBoxのゲームだって作れちゃいます。
つまり、XNAでゲームを作るとWindowsPC、Xbox360、WindowsPhoneでわりと互換性があるんですね。すごいです。
言語はC#でつくります。C#いいですよね。C#かわいいよC#C#知らないひとは勉強してきてください。

  • ゲームの基本

では早速作っていきましょう。
VisualStudioの新規プロジェクト→XNAGameStudio4.0のWindowsPhoneゲーム(4.0)でプロジェクトを作成しましょう。
VSさんは便利で新規作成したら大まかなめんどいコードは勝手にうってくれます。すごいですね。
Game1.csを開きましょう。たくさんコードが出てきましたね。
大雑把に説明するとInitializeメゾッドが初期化処理、Updateメゾッドは更新処理、Drawメゾッドは描画処理、LoadContentは読み込み処理、UnloadContentは特に使いません。
ゲームというのは基本的にfps(1秒間に更新する回数)だけ1秒間にゲームを更新、描画する必要があります。つまり、更新するたびに画像をちょっとづつずらしていけばまるで動いているように見えるんですね。すごいです。
XNAの場合、UpdateメゾッドとDrawメゾッドが30fpsなので1秒間に30回実行されます。
Updateメゾッドで更新し、Drawメゾッドで描画する、これがXNAでの基本なんですね。
f:id:garicchi:20111208024727p:image

  • フィールドの定義

今回は自分の画像が一定方向に進むプログラムを作ってみましょう。
まずはインスタンスを格納するためにフィールドを定義しましょう。
SpriteBatch spriteBatch;の下の行にでも、

Texture2D texture;

int x;

int y;

とでも書きましょう。
textureは読み込んだ画像の入るフィールドです。
xとyは表示させるオブジェクトの座標です。
本来ならばカプセル化するのがよいのですが初心者向け解説なので省きますね。

  • 初期化

オブジェクトの初期座標を決めておきましょう
Initializeメゾッドの中に、

x=0;

y=0;


  • 読み込み

それでは画像を読みこんでみましょう。
ソリューションエクスプローラからプロジェクト右クリックで追加矢印→既存の項目から好きな画像を選択して取り込みましょう。
そして、LoadContentメゾッド内に

texture=Content.Load<Texture2D>("[拡張しをのぞくファイル名]");

[拡張しをのぞくファイル名]の所を拡張子をのぞく、読み込んだファイル名に置き換えてくださいね。
これで読み込めました。

  • 更新

重要なとこに入ります。
今回オブジェクトが一定方向に進むプログラムなので、ジョジョに座標をかえてやる必要があります。
Updateメゾッドの中に、

x++;

y++;

これで1秒間に30回、xとy座標が1ずつ足されていきます。

  • 描画

では読み込んだ画像を描画してみましょう。
描画にはSpriteBatchというクラスを使う必要があります。しかし、LoadContentですでにspriteBatchというフィールド名で読み込まれているのでじゃんじゃん使っちゃいましょう。
Drawメゾッド内のGraphicDevice.Clear(Color.CornfloweBlue);
以降に、

spriteBatch.Begin();

spriteBatch.Draw(texture,new Vector2(x,y),Color.White);

spriteBatch.End();

と書きましょう。
これで実行するとなんと画像が左上から右下へ向かって移動していませんか?。
僕は実際に実行していないのでコードに誤りがある場合は報告してくださいね。
これで今回作成するゲームは完成です。え?どこがゲーム?
そう思うでしょう。しごく当然のことです。
しかし、ここからゲームに発展していくのです。座標同士を判定してはどうか?、とちゅうで座標の更新の幅や向きをかえてはどうか、spriteBatch.Drawメゾッドを複数書いてはどうなるか。など考えていくと発展の幅はとても広いです。
これが俗にいうあたり判定だとかだったりするんですけどね。

  • おまけ

走るブタを作成してるときに思ったのですが、WindowsPhoneのアプリでは画面上でBackボタンを押したとき、前の画面に必ず戻らなければならないんですね。おまけにゲームプレイ中ではポーズ機能になったり、最初の画面でBackを押すと
終了したりしなければならないんです。じゃないとリジェクトされちゃうんですね。
どうするかというとUpdateメゾッド内で
if(GamePad.GetState(PlayerIndex.One).Buttons.Back==ButtonState.Pressed){
}
の中で前の画面に戻す処理を実装してやる必要があります。
SilverLightで作るとデフォルトで前の画面に戻るのですがXNAではもどらないんですね。XNAで作るときはこういうところに注意しなければリジェクトされまくります。

  • おわりに

今回は基礎しか解説しませんでしたが初心者にWPゲームを開発するきっかけになればなと思います。
XNAで作成するとWindowsPC,Xbox360でのゲーム作成知識もつくはずです。
今後としては、あたり判定の知識、ゲームの流れの知識、ゲームの部品化の知識など、僕も未だに勉強中な項目などたくさんあるので勉強してみてはどうでしょうか。
XNAの資料はまだまだ少ないですがゲームの作成知識はほかのライブラリでも共通なところが多いのでそちらを参考にしつつ、ガンガンWPアプリを作成してもらって、さらにWPMarketを加速していってもらえたらなと思います。
暇になれば、WindowsPhoneのゲーム作成を解説するサイトを作りたいと思っています。
これでXNAの解説を終了したいと思います。
質問などはコメント、もしくはTwitterで送信してもらえば回答できる範囲で回答します。たぶん。