XNA(Game API) > XNAではじめに作るゲーム
丸山塾:クラウド型プログラミング習得スクール(塾) |
XNAではじめに作るゲーム
どんなゲーム?
よくある、ウィンドウ内のボールの移動で、フレームにぶつかると跳ね返るという
単純なプログラム。
手順と作り方
まず、新しいプロジェクトで、XNAを選んで、テンプレートからWindowsゲームを選択して、
プロジェクトを作成。
このままビルド&実行すると、何もしないウィンドウが表示される。
テンプレートで作成されたコードをチェック
Windowsアプリケーションで同じみのMainメソッドがちょっ違う。
Program.cs
static void Main(string[] args) { using (Game1 game = new Game1()) { game.Run(); } }
Game1クラスの親はGameクラス。インスタンス化して成功したら
単純にRunメソッドを呼び出しているだけ。
至ってシンプルだ。
Game1.cs
Microsoft.Xna.Framework.Gameクラスを継承し、必要な処理は
Gameクラスのメソッドをoverrideして記述する構造になっている。
プロジェクトを作成すると、Game1.csには下記のメソッドが生成されている。
メソッド | 概要 |
public Game1() | コンストラクタ |
protected override void Initialize() | 初期化(baseクラスは必須) |
protected override void LoadContent() | リソースのロード処理など |
protected override void UnloadContent() | リソースのアンロード処理など |
protected override void Update(GameTime gameTime) | 更新 |
protected override void Draw(GameTime gameTime) | 描画 |
それぞれのメソッドが呼び出されるタイミングを調べてみた。
Main()からGame1.Run()メソッドが呼び出されると、
- Initialize()
- LoadContent()
- Update()
- Update()
- Draw()
- Update()
・
・
Update() - Update()
- Draw()
- Update()
- Draw()
- Update()
- Draw()
終了するまで繰り返す
終了時点でUnloadContent()が呼び出される。
タイミングは、オペレーションではなくて、Gameクラス側が呼び出すため、
これ以上の詮索はできなかった。
因みに、Gameクラスのソースコードの表示を試してみたが、dllはダウンロード
できたものの、ソースコードは入っていなかった。
Update()とDraw()には、前回から今回までの時間が引数で渡ってくるので、時間を考慮する場合役に立ちそうだ。
「はじめに作るゲーム」
このテンプレートが基本になっているので、簡単に理解できるだろう。
全ソースコードのイメージ
リソースの扱い
一般的なWindowsアプリケションと違うのはリソースの扱いだ。
リソースはContentに作成(コピー)する
Ball.pngで周囲を透過するように作成
プログラムでは、リソースを指定する場合アセット名を記述するればいい。
protected override void LoadContent() { spriteBatch = new SpriteBatch(base.GraphicsDevice); myTexture = base.Content.Load<Texture2D>("Ball"); }
アセット(英語ではasset):和訳すると、資産、財産ということらしいが・・・
base.Content.Load<クラス名>
次のファイル形式に対応している。
クラス名 | サポートファイル(拡張子) |
Effect Class | .fx |
Model Class | .fbx、 .x |
SpriteFont Class | .bmp、.dds、.dib、.hdr、.jpg、.pfm、.png、.ppm、.tga |
Texture Class Texture2D Class |
.bmp、.dds、.dib、.hdr、.jpg、.pfm、.png、.ppm、.tga |
Texture3D Class TextureCube Class |
.dds |
.試してはいないけど gif の記載がないので注意しよう。
描画処理
描画処理も至ってシンプルになっている。
protected override void Draw(GameTime gameTime) { graphics.GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(SpriteBlendMode.AlphaBlend); spriteBatch.Draw(myTexture, spritePosition, Color.White); spriteBatch.End(); base.Draw(gameTime); }
背景色の初期化は、ここで毎回行っていた。
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
Begin-Draw[Draw,・・・]-Endは一連の流れとして覚えておこう!
spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
spriteBatch.Draw(myTexture, spritePosition, Color.White);
フルカラーで着色なしの場合は Color.White を指定する
Begin()が呼び出されていない場合、例外が発生する。
spriteBatch.End();
Draw()が完了したら必ずEnd()を呼び出すこと。
ウィンドウを閉じるまで、永遠に繰り返される。
Q:キー入力はどうすればいいんだろう?
Q:マウスを有効にする方法はあるのだろうか?