| ←前のページ | トップ |
こちらにアップしていたテンプレートプロジェクト(SimpleXNAGame)をひっそりと更新しました。
更新内容は以下の通り。
- WindowsFont.MeasureText()のスペルミス修正
- Game.Exitingイベントハンドラ内にリソース解放処理追加
- AssemblyInfo.cs内のGUIDが毎回ランダムになるように修正
- その他細かいコメント修正
前回はXNAの中身を追いかけることでGraphicsDeviceにまつわるイベントの発生順序・タイミングを明らかにした上で正しいイベントハンドリングの方法を検討しました。実際のコード例も書きましたが、それをもう少し整理した上で後から拡張しやすいような形に修正し、テンプレート化してみました。
上記ファイルを右クリック→拡張子を".zip"に変えてダウンロードし、マイドキュメントの"Visual Studio 2005\Templates\ProjectTemplates"に保存して下さい(解凍しなくてOK)。するとVisual C# Expressの"新しいプロジェクトを開く"のマイテンプレートに「Simple Game (XNA)」というアイテムが追加されます。これを選んで適当なプロジェクト名を付けて開けば準備完了。あとは煮るなり焼くなりお好きなようにどうぞ(^^)。
何となく勢いで「Simple Game Framework」なんて言ってしまいましたがゲーム作りに必要な機能は何ひとつありません(´・ω・`)ガッカリ。あ、一応ここで紹介したWindowsFontクラスの改良版を組み込んでいますので文字を出すくらいはできます。もちろん初期化やリソース管理に必要なイベントハンドラは一通り登録した状態となっていますのでちょっとだけラクできるはずです。
コードの見通しが立ちやすいように不要な部分は折りたためるようにしておきました(下図参照)。
ここから実際のゲームプログラムを組んでいくにあたっては、
をそれぞれ開いて出現するメソッドの中に必要な処理を書いていけばOKです。最初の状態でビルドするとフレームカウンタとフレームレートを表示するプログラムができます。トレース出力を開いておけばイベントが発生する状況やリソース確保のタイミングなどを見ることもできますので参考まで。
尚、オマケ機能としてウィンドウ最小化からの復帰やリサイズ時にフォーカスが消失する問題に対応するコードも埋めておきました。これを行っているのは以下の箇所です(見易いように変更してます)。
private void graphics_DeviceResetting(object sender, EventArgs e)
{
// ウィンドウのフォーカスが失われるバグ(?)対策
Form form = (Form)Form.FromHandle(Window.Handle);
form.BringToFront();
}
本当はForm.ClientSizeChangedを拾う方が正しいんでしょうけど面倒だったので(ぉ。ただ、これ以外にもフルスクリーンにまつわる種々のバグ(Alt+Tabで変になるとか)が未対策ですが、それを修正するのは各自の課題ということにさせて下さい(単なる手抜きです)。
さて、そもそもXNAフレームワークでゲームプログラムが実行されるとき、内部では一体どのような順番で処理が行われているのでしょうか? そして、リソースの初期化/再作成は一体どのタイミングで行えばいいのでしょう?? ざっと考えられるだけでもこれだけあります。正直多すぎてワケ分かりません┐(´ー`)┌
XNAのチュートリアル(Getting Started with XNA)ではOnStartingメソッドとGraphicsDevice.ResetイベントハンドラでLoadResourcesメソッドを呼んでいますし、「Spacewar Starter Kit」ではコンストラクタ、Startingイベントハンドラ、そしてDeviceCreatedイベントハンドラのそれぞれで初期化処理を行っているようです。両方ともMicrosoft提供なのに全く一貫性がありません。
というわけで、リフレクションを駆使(?)してXNAの中を追っかけてみた結果、以下の順番で処理が行われていることが分かりました。MyGameクラスが自分が作成したGameクラスだとして…。
ここんとこ国内外のゲームプログラミング界隈でXNAの話題が盛り上がっているようなので色々見て回っているのですが、早くも遊べるゲームを作りましたという人がちらほらいらっしゃるようで敬服させられっぱなしです。実際は以前からManaged DirextXを使っていた方が多いようですが、それでも始めて2〜3日で遊べる状態のものを作り上げるというのはすごいと思います。
そんな自分はというと、完璧なものを作ろうとするあまり細かいところにばかり目が行ってしまって、種々の資料に当たったりXNAフォーラムを覗いたり試行錯誤したりの連続で遅々として作業が進みません。例を挙げるとリソースの作成はどのイベントハンドラで行うのが正しいのかとか、デバイス消失/破棄時の正しい処理方法とか、その際のリソースの再作成はどのように行うべきなのかとか……。主にC#(というか.NET)のGC機構とDirectX特有の仕様との折り合いをどうつけるかという問題なのですが。
ここ数日XNA Game Studio Expressで遊んでいるのですが、デバッグしたり動作確認したりするのに何かと必要な文字列を表示するクラスが無かったので作ってみました。本当は必要なフォントを予めビットマップ(テクスチャ)化して持っておくべき(*)なんでしょうが、使う文字を全て列挙するのも大変なので今回はWindowsに入っているフォントからSystem.Drawingを使って動的に生成することにしました。必然的にWindows専用になります(´・ω・`)
スクリーンショットはこんな感じ。
上記ファイルを右クリック→拡張子をzipに変えて保存し、中に入っているWindowsFont.csを自分のプロジェクトに追加して下さい。System.DrawingとSystem.Windows.Formsへの参照を追加するのをお忘れなく。
基本的な使い方は次の通り。
WindowsFont winfont = new WindowsFont(graphics, "MS ゴシック", 14);
winfont.DrawText(0, 0, Color.White, "ほげほげ");
詳しい使い方はソースコードを参照して下さい。
尚、XNAの次のリリースではフォントを扱うクラスが提供されるらしいです。
Windows/Xbox360で動くゲーム制作を可能にするXNA Game Studio Expressのベータ版が出たってんで早速入れてみました。
で、試しにスターターキットに入っているSpaceWarというサンプルゲームを動かしてみたところ、何故か奇妙な現象が発生してしまいました┐(´ー`)┌
スクリーンショットはこんな感じ。
別にハングアップしているわけでもないし、エラーや例外が発生しているというわけでもないみたいなんですが……ううむ、謎だ(´・ω・`)
のっけからこれじゃあ萎えるなぁ……。今のPC使いだしてかれこれ4年になるし、やっぱ環境が古すぎるのが原因なのかなぁ?? 一応グラボはGeForce 6600なのでDirectX9のShader Model 2.0には対応してるはずなんだけど……。
とりあえずドライバを最新にしてみて、それでもだめだったらサポートに投げてみるつもり。
(追記) グラボのドライバを最新版にしたら直った。けど、Xboxコントローラーが無いのでまともに操作できず……。キーボードで操作すると1Pと2Pが同時に動くし(^^; ま、とりあえず動いたのでよしとするか。
昨年11月より1年間限定で無償公開されていたVisual Studio 2005 Expressですが、好評につき(?)公開期間が無期限に延長されたそうです。といっても以前からダウンロードは期間限定でもインストールした後は無期限に使用可能だったはずなので、実質的には急いでダウンロードする必要がなくなったというくらいの意味しかないわけですが。
それよりも個人的に気になるのは以下の点です。
また「Beta: Skype Wrapper for .NET Starter Kit」は、自身のアプリケーションからSkype機能の呼び出しを可能にするインターフェイスである。
日曜プログラマに朗報、MSがVisual Studio Expressを無期限フリー化 (MYCOM PC WEB)
う〜ん、これってActiveSとは別モノなんでしょうか?……ここを見る限りクラス名などが違うのでどうやら別モノと考えて良さそうです。せっかくの機会なのでコレを使ってDskCapSkを.NET2.0に移植してみようとか思ったり思わなかったり。作っても需要がなさそうだしなぁ……。
| ←前のページ | トップ |