XNAバージョンアップ
XNAがバージョンアップして2.0になったようです。
XNA Game Studio 2.0 (Beta)
XNA Game Studio 2.0 (Beta) が配信されました
XNAいじって遊んでたのが去年の今頃か…1年たつのはホント早いですね…
| 固定リンク | コメント (0) | トラックバック (0)
XNAがバージョンアップして2.0になったようです。
XNA Game Studio 2.0 (Beta)
XNA Game Studio 2.0 (Beta) が配信されました
XNAいじって遊んでたのが去年の今頃か…1年たつのはホント早いですね…
| 固定リンク | コメント (0) | トラックバック (0)
「参加します」とほざきつつ何もできなかったヘタレの俺ですが
世界の皆さんはがんばって応募した、"Dream-Build-Play"
結果発表があったようです。
XNA Game Studioの世界的なコンテスト“Dream-Build-Play (ドリーム ビルド プレイ)”の結果が発表
なぜか米国の総本山からはリンクが張られていないのですが
こちらの↓日本の総本山からはいくつかのゲームがダウンロードできるようです。
http://xna-studio.jp/contest/01.html
トレーラーも見ることが出来ます。
と、いうか日本の総本山、いつの間にこんなきちんとしたサイトが出来上がっているとは。
ここから先、何も出来なかった自分のことは棚に上げての発言ですw
コンテストの結果を見ていただくと分かるのですが
日本産のゲームがひとつも受賞していないですね。
うーん、残念。
まあ、日本だと目先が利いて、なおやつやる気のあるやつらは
ケータイとかWEBの開発に矛先が向かっているのでしょうか?
それとも、XBOX360にはあまり興味なし!でしょうか?w
| 固定リンク | コメント (0) | トラックバック (0)
ゴールデンウィークも終わりましたね。
久しぶりに9連休という、ほんまにゴールデンやぁという感じの
休みが取れたため、今日はものすごい休みボケでございました。
気を取り直していきましょう。
XNAの新バージョンがリリースされた模様です。
XNA Game Studio Express 1.0 Refresh リリース
ですが、結局のところXファイルのモーションファイルへの
対応は行われていないようです。残念。
有志の方達がアニメーションライブラリを作られているので
これを使えばモーションアニメを使えます。
http://www.codeplex.com/animationcomponents
と、いうことで以下のリンクからサンプルをダウンロードして眺めてみたのですが…
使い方:XNAでキャラアニメ
なんだか使いにくい、というか、単に俺の趣味に合わないような
構造になっているライブラリのようですね…
うーん、どうしようかなあ、、これを使うとなると
また、使い方をおさらいしないといけないのでめんどくさいしなあ。。。
| 固定リンク | コメント (0) | トラックバック (0)
とりあえずカメラクラスとプロジェクションクラスを
ひょひょいと作りました。
実働時間1時間未満。。。プログラムを作るというよりも
C#の細かいことをもう、忘れてますね、、1ヶ月前のことを。。
公開するまでもないソースなので晒しません(・・;)
こんなペースで7月の締め切りに間に合うのでしょうか、うむ、厳しいw
いちおう次のステップでは
3Dのプリミティブ描画をさらっとテストして、
プリミティブ描画を使ったちょっとしたゲームを公開することを考えてます。
と、ここに書いて、自分を追い込みますw
| 固定リンク | コメント (0) | トラックバック (0)
土曜日も仕事。。。つまりプログラムしていると
さすがに日曜日くらいはプログラミングから離れたいなぁと思うのは
俺が真のギークじゃないからなんでしょうねぇ。
と言い訳しながら、引き続き3Dデータの作成をしています。
以前、MetasequoiaLEを使う、、、と書いていましたが、
LEバージョンだと、テクスチャUVの設定に何かと制限があるようなので
通常版をインストールしなおして使っています。
とりあえず自作オブジェをお披露目。
カウボーイハット、(三角66ポリ)
刀、(三角44ポリ)
うーん、レンダリングしてみるとま、そこそこなんじゃないの?
という気もしますが、無駄な部分にテクスチャを多く割り当ててしまっている、
など、生のデータを見るとダメなところが多いですw
これがそのダメな感じ公開画像!
ポリゴンの割り方も、プロのデザイナさんならもっといい感じになると思います。。。
が、まあその辺は大目に見てください。
これら2つのオブジェはこれから作るゲームに
活用される予定です。
刀とカウボーイハット? あのゲームじゃん?
| 固定リンク | コメント (0) | トラックバック (0)
Xファイルから読み込んだ3Dモデルデータの表示テストは終わっているので
Xファイル、モデルデータそのものを作る準備をしないといけません。
Xファイルからのモーション読み込みは、
今のところXNAでサポートされていないようです。
が、4月のバージョンアップでサポートされることを期待して気にせず先に行きます。
タダで使える3Dデータ作成ソフトはたくさんありますが、いろいろ試してみた結果、
MetasequoiaLE
で、モデルデータを作成し
RokDeBone2
で、モーションをつけるのが一番簡単ぽいです。
Blenderなど、ひとつのソフトでいろいろできるものもあるのですが
俺の画力ではどうせたいしたものはできないし、
多機能すぎて操作をおぼえるまでが大変! Metasequoiaは簡単!
モーション作成ソフトとしては
Mikoto
というのもあるようですが、このソフトからはXファイルが出力できないようです。
…ですがサンプルデータはこのサイトからいただきました。
ありがとうございます。
では、実作業。
Metasequoiaでモデルをロード。RokDeBone2用にボーンを付け直して…
RokDeBone2でモーションをつけてみました。
初めてだったので、ボーンのつけ方を思いっきり間違ったことに後から気がつきました…
基準点?(1番最初のボーン)は体内に埋め込まないほうがいいのですね。。
刀を振り下ろすモーションを作ってみたところ。
なんかへっぴり腰だし、かっちょ悪いです…
XNAで表示してみたところ。
モーションが無いので面白くもなんとも無いですね。
| 固定リンク | コメント (2) | トラックバック (0)
マイクロソフトのゲームコンテストへの応募作品、
ここ2週間ほど、脳内企画を立ててはダメだしを繰り返していましたが
「なんとなくこの路線で」
というのが確定したのでぼちぼちプログラムに入らないと。。
企画としては、いちおう3D表示を扱いたい、できればXファイルのモデルを
表示したい企画となっております。
ですので、Xfileビューワが欲しいのです。しかし、
Microsoft DirectX SDK (December 2006) のDirectX Viewer...
起動すると即落ちるのです。ファイルを読み込みしてもいないのに。
ウチのPCのドライバなどに、なにか問題があるのだろう。。と思っていたのですが
どうやらもともと何か不具合がある様子。
Directx SDK (december 2006) viewer crashes on startup
マジかよ。。困ったね。
古いバージョンのDirectX Viewerならちゃんと動くようなので古いのをダウンロードしに行きました。
http://www.microsoft.com/japan/msdn/directx/downloads.aspx
新しいバージョンでてるじゃん!
Microsoft DirectX SDK (February 2007) ダウンロード
新しいバージョンをインストールしたら
DirectX Viewer うまく動きました。
| 固定リンク | コメント (0) | トラックバック (0)
先日お伝えしたマイクロソフトのゲームコンテスト、
dreambuildplay
概要を読んでみると
「"Torque X"というツールを使っても良い。」
と書いてありました。
と、いうことで"Torque X"なるものを調べてみました。
http://www.garagegames.com/products/torque/x/
"Garage Games" という会社が作っている商品のようです。
この開発キット、フリーウェア版というものは無いようです。
…この時点で「"Torque X"を使って何かしてみよう」という気持ちはほぼ消滅しているのですがw
「ゲーム開発ツール」として、
どのような環境を用意しているのか?どのような商品なのか?
を調べておくのは有用なので
30日間トライアル版 "Torque Game Builder - INDIE License"
をダウンロードしてインストールしてみました。
もしかしてインストールする方がいればひとつだけ注意。
インストール時に以下のダイアログが出たときに、
"YES"
にチェックを入れておかないと、何もインストールされないバグ?仕様?
があるようですのでお気をつけください。
さて、インストールして実行してみました。
…めちゃくちゃ重い…
ウチのPCがしょぼいのか分かりませんがとにかく重い。
どうやらこのツールそのものがC#を使った.NET上で動くアプリのようで
そのせいだと思うのですが、重い。
マウスカーソルを思ったところに移動するのさえ難しいような重さ、でした。
これだと、正直ウチのPCでは使い物にならないし
どのような商品なのか?をチェックすることすらしんどい…。
ということで、インストール後1時間もたたずにアンインストールしてしまいました。
まったくお役に立たないレポートで申し訳ないです。
とりあえずスクリーンショットはこんな感じでした
(ExampleMyFishDemo というサンプルプロジェクトをロードしたところ)
↓↓↓
日本のゲーム産業、ひいてはソフトウェア産業の発展のため
もっと"初心者でも簡単にゲームが作れてなおかつ奥が深い"
ゲーム開発ツールを、コナミあたりが開発&販売してくれるとうれしいですね。
RPGツクール、より少し難しいやつをぜひ。
| 固定リンク | コメント (0) | トラックバック (0)
XNAプロジェクト、ぷよぷよ未満を作って終了。。。となったわけではないのです。
ちょっとづつなんかしてます。
で、いきなりハマったことがあるので書いておきます。
「Modelクラスにカスタムシェーダーを適用する」です。
XNA SDKではコンテントパイプラインと呼ばれる、
グラフィックデータをゲームに取り込む環境がわりとよく出来ています。
Xファイルを読み込んで3Dデータを表示する際、
デフォルトのシェーダーを使って描画するのに苦労はありません。
ファイル読み込みのシステムも用意されているので楽チンです。
↓参考にさせてもらいました。
ん・ぱか工房さん
んで、HLSLで何かして遊びたいなあ、と考えている俺としては
この読み込んできた3Dデータ(プログラム中ではModelクラスにアタッチされる)
に、自分で作ったシェーダーを適用したいのです。
でも、XNAの開発日記を書いているほかの方のサイトでは
HLSLを使っている方はいるのですが、モデルデータじゃなくて自分で頂点配列を作って、
それをシェーダーに流し込んでるようなつくりをしているサンプルばかりで。。
ヘルプを見ても
>This render code is designed for only those models with a BasicEffect.
>For custom effects, the inner for-each loop should be changed to use Effect instead of BasicEffect.
>In addition, the world, view, and projection matrices must be manually set
>using EffectParameter objects.
と、なんだかよくわからんわけです。
WEBをさまよい、やっといい方法を見つけました。
http://xbox360homebrew.com/blogs/kobalt64/archive/2006/11/05/1273.aspx
以下、重要なところを抜き出し
// ------固定シェーダーを使う場合------
foreach (ModelMesh mesh in m_CModel.Meshes)
{
//エフェクトの指定
foreach (BasicEffect effect in mesh.Effects)
{
// ここで変換行列を適用
....
}
//メッシュの描画
mesh.Draw();
}
// ------カスタムシェーダーを使う場合------
foreach (ModelMesh mesh in m_CModel.Meshes)
{
for(int i = 0; i < mesh.MeshParts.Count; ++i )
{
// Drawの中で毎フレームやる必要はない、、とおもう、
// エフェクトを適用
mesh.MeshParts[i].Effect = m_effect;
}
mesh.Draw();
}
うーん、こんな単純な話なのにここまで探すのに時間がかかるとは…
みんなやりたくなることだと思うのですが。。。
Xファイルにシェーダーを埋め込めるみたいなので、
そっちの方法を取るのかなあ、世の中。。いや、そんなはずはないはず。
サンプルのソースもUPしておきます。半分以上、ん・ぱか さんからのコピペですがw
「GameMain.cs」をダウンロード
| 固定リンク | コメント (0) | トラックバック (0)
さて、XNAの正式版リリースから約1ヶ月。
Webでさまよってみると、俺のような遅筆、遅プログラマ&マッタリスピードではない
世界のトップガンプログラマ達がいろいろと面白いプロジェクトを進めているみたいですね。
昔からゲーム関係のハックはいろいろと面白いものが多かったのですが、
今、俺が大注目なのはこちらです。
WiiリモコンをBlueTooth で PCと接続し、
マウスとして使っちゃおうというプロジェクトです。
BlueTooth対応アダプタがあればWiiリモコンの3軸加速度センサを用いて
マウス代わりに使えてしまう!
さらに、赤外線センサーバーを自作すればモーションセンサも使えるようになるようです。
ス、スゴいおもろい!
「XNAのでゲーム作ってWiiリモコンで動かして遊べば
クラスプラットフォームではない、ミックスプラットフォームだ!」
…という妄想が沸いてきました。
WiinRemoteを使わせてもらい、ゲームをマウスでコントロールできるように改造すれば
”ぷよぷよ未満”も直ぐにWiiリモコン対応ゲームにできますね!
WiinRemoteを使わなくても、
BlueToothで接続されている機器からデータが受け取れればWiiリモコンで遊べるなあ、
と思って少し調べてみたのですが
C#からウィンドウズが管理しているBlueToothデバイスにどうやってアクセスするのか…?
↓この方法でいけるのかな?
ここのサンプルのように簡単にシリアルポート通信みたいにして使えるのでしょうか?
XBOX360でも動いたら面白いんですけどね。
どちらにせよ、WiiリモコンとBlueToothが手元に無いと話が始まらないですが…
Wii本体は購入できないし…「はじめてのWii」買いに行くか…?
| 固定リンク | コメント (0) | トラックバック (0)
・追試のパッド
ゲームのコントローラーは基本的にXBOX360純正品以外は未対応…
といううたい文句になっている様子のXNA。
XBOX360…買う気はあるんだけど買ってませんごめんなさい…なので、
今、手元にあるのは確か\980-で買ったPC用の安物ゲームパッド。
これ↑をPCにつないでXNAフレームワークから認識できたら
とりあえずはゲームパッドで遊ぶ環境が整う。(アナログスティック無いけど…)
ということで、以下のようなコードを書いて実行してみました。
XNAから認識されていれば
”PAD CONNECT OK”
と、表示されるはず。
{
...
GamePadState nowPadData = new GamePadState();
nowPadData = GamePad.GetState(Microsoft.Xna.Framework.PlayerIndex.One );
Debug.WriteIf(nowPadData.IsConnected, "PAD CONNECT OK" );
...
}
…認識していない模様…お疲れ様でした…
しかし薄型が発売されるとの噂もある今、XBOX360を買うのは躊躇われますw。
XBOX360のコントローラーだけ買いに行くか…?
| 固定リンク | コメント (0) | トラックバック (0)
・追試のHLSL
ぷよぷよ未満 (6)で、
>>Effect Class .fx
>のエフェクトが何を指しているのか知らないのですが…シェーダー関係かな?
と、間抜けな発言をしていますが
*.fx ファイルとは頂点シェーダーとピクセルシェーダーのプログラムを記述した
HLSLプログラムを記述したファイルの事を指すんですね。
"エフェクト"と言われると日本人にはちょっとピンとこない…のは俺だけですか。。
CgとかHLSLとか、C言語っぽいスタイルでシェーダーが書けるらしい…
という情報は知っていましたがXNAだと、この辺を書かないと3D描画ができないみたいです。
昔はDirectXのシェーダーを書くならアセンブラっぽい言語で記述する必要がありました。
「トゥーンシェードできた、イェイ」
とかなんとかほざきながら少しだけ遊んだ記憶がありますが、そうですか、今はC言語風で記述できるんですね。
あの頃からがんばっていればもしかして今頃シェーダー職人に…なってないかw
サンプルゲーム Spacewar に付属しているship.fx 等を眺めてみました。
…PS2もこれくらい簡単ならうれしかったなあ…
HLSLプログラムを出力できるツールもあるんですね。
↓
Rendermonkey
応用を利かせるといろんな表現ができそうで面白そうです。
まあ、その応用って奴を自力でひねり出せるほどのエースストライカープログラマじゃないのが悲しいところですが…
Web上の情報であらましはわかったのですが、
参考書籍として何か1冊手元においておきたいなあ…
この本が良いかなと思って速攻でカートに入れようと思ったら
DirectX 9 シェーダプログラミングブック
Amazonで取り扱いなし…絶版!?
本屋へ走って店頭在庫を探しに行ってきます。
…
…
…
ゲットだぜ!
ちなみに
|
|
プログラミングMicrosoft DirectX9 グラフィックスパイプライン
著者:マイクロソフト,クリス グレイ |
こちらもちょっとだけ立ち読みしました。
DirectX 9 シェーダプログラミングブックがチュートリアル(手引き書)だとすると、
こちらはリファレンス(辞典)と言った趣。
お金に余裕があればそのうち手に入れます。。。
| 固定リンク | コメント (0) | トラックバック (0)
・なんとなく完成
市販されている"ぷよぷよ"になるまでには相当なものが足りない状態ですが
"ぷよぷよ未満"
としてとりあえずは完成です。
矢印キーで移動
Xボタンで進む&ぷよ回転
となっています。
画面サイズからばれてしまうかもしれませんが
もともとはケータイ用に作ってみたJavaのソースの
画像表示部分&キー読み取り部分をちょこっといじって作りました。
だから、、というわけではないですがグローバル的に扱う
GraphicsDeviceManager クラスや、CRamdom クラスなどの扱い方が
非常によろしくないプログラムになっています。
本格的なゲームを作る場合には、今回のようなクラス構成にしていると
後から泣くことになるのでステキなゲームプログラマの方は真似しないでくださいねw。
ぷよぷよっぽいゲームの作り方についてのお勉強は
どこか他のWebサイトにお任せします。
参考になるかわかりませんがソースと実行ファイルを置いておきます。
もし、うまく動かない場合は教えていただけるとありがたいです。
XNAをインストールしていない環境で実行してみたことが無いので
XNA-SDKをインストールする前の方にぜひ遊んでいただきたいですw
「release.lzh」をダウンロード
←遊びたいだけならこちら
「PuyoProject.lzh」をダウンロード
←プロジェクト&ソース付
続く?
| 固定リンク | コメント (0) | トラックバック (0)
・メモリのこと
重要な点を見逃していました。
メモリ管理はC#が言語仕様として吸収してくれる…のは良いのですが
「今使えるメモリ量はどれくらいなのか?」
が、わからないことには不安いっぱいですw。
ウィンドウズ上で動かすだけなら、もし物理メモリが足りなくなっても
ある程度ならウィンドウズがメモリをどうにかしてくれるのですが
XBOX360ではハードディスクを搭載していないタイプがあるため
「メモリが足りなくなったからキャッシュで…」
というわけには行かないはずです。
…と、ここまで書いて気がついたのですが
もしかしてXNAゲームはハードディスク付のXBOX360が無いと動かないのかな。。?
ぷよぷよ未満くらいのゲームだったらメモリが足りなくて困ることは無いですが…
なんにせよ、現在のメモリ状況は知りたいですね。
WEBで調べた結果以下のようにすればメモリ量が判明するようです。
短いコードなのでソースを全部載せておきます。
このコード、XBOX360でうまく動くのかな…?。
もっと良いやり方を知っている方がいれば教えていただきたいです。
↓↓↓↓↓↓↓↓↓↓
using System.Diagnostics;
using System.Runtime.InteropServices; // for DllImport
class CmemoryTest
{
[DllImport("kernel32.dll")]
extern static void GlobalMemoryStatus(ref tagMEMORYSTATUS lpBuffer);
public struct tagMEMORYSTATUS
{
public int dwLength; // 構造体のサイズ
public int dwMemoryLoad; // メモリの使用状況(0-100)
public int dwTotalPhys; // 物理メモリ 合計
public int dwAvailPhys; // 物理メモリ 空き
public int dwTotalPageFile; // ページファイル 合計
public int dwAvailPageFile; // ページファイル 空き
public int dwTotalVirtual; // 仮想メモリ 合計
public int dwAvailVirtual; // 仮想メモリ 空き
}
public static void PrintStatus()
{
Debug.WriteLine("");
tagMEMORYSTATUS ms = new tagMEMORYSTATUS();
ms.dwLength = Marshal.SizeOf(ms); // 準備
GlobalMemoryStatus(ref ms); // メモリ情報を取得
Debug.WriteLine("使用率 = " + ms.dwMemoryLoad.ToString() );
Debug.WriteLine("物理合計 = " + ms.dwTotalPhys.ToString() );
Debug.WriteLine("物理空き = " + ms.dwAvailPhys.ToString() );
Debug.WriteLine("ページ合計 = " + ms.dwTotalPageFile.ToString() );
Debug.WriteLine("ページ空き = " + ms.dwAvailPageFile.ToString() );
Debug.WriteLine("仮想合計 = " + ms.dwTotalVirtual.ToString() );
Debug.WriteLine("仮想空き = " + ms.dwAvailVirtual.ToString() );
}
}
続く
| 固定リンク | コメント (0) | トラックバック (0)
・やっと画像表示
画像を表示するためには画像ファイル(以下、リソースファイル)をディスクから読み込まなくてはいけません。
そのために活用するのが
ContentManager
クラスになるようです。
XNAでは
リソースのコンバート(*bmpから独自形式への変更など)
リソースの配置、読み込み
などが簡単にできるような仕組みを提供していて、
その恩恵にあずかるためには ContentManager を使う必要がある、と。
ContentManagerで扱うことのできるリソースは以下
>Model Class .fbx, .x
>Effect Class .fx
>Texture Class, Texture2D Class, TextureCube Class .bmp, .jpg, .png, .tga, .dds
最近のDirectXを扱ってないので
>Effect Class .fx
のエフェクトが何を指しているのか知らないのですが…シェーダー関係かな?
コンシューマゲームの場合、
CD(DVD)からのリソースデータロード時間をなるべく短くしたいため
”複数のリソースデータをパックする”等の方法を使ったりします。
XNAではそういうこともできるみたいですが、
そのためには自前でファイル読み込みなどをする必要があります。
ContentManager.Load 関数は…
ヘルプを見ても特に記述が無いですがブロッキングの読み込み関数ですね。
リソースファイルをプロジェクトに追加する手順は
以下のサイトの説明が詳しいのでここでは割愛。
http://www.saturn.dti.ne.jp/~npaka/xna/index.html
リソース追加の注意点として
ソリューションエクスプローラー内のフォルダ構成と
実際のハードディスクのフォルダ構成を同じにする必要があります。
ちょっとだけ不便なような、間違いが減らせて良いような。
あと、2D画像表示に必要なクラスは
SpriteBatch クラス (主にレンダリングステートを変更するようです)
Texture2D クラス(テクスチャの実体)
これらのクラス、とりあえず使うだけなら簡単簡単。
でも、いろいろ楽しいことをするためにはクラス説明のヘルプとにらめっこしながら…ですね。
以下、参考ヘルプ
2D Graphics Overview
・入力デバイス
キーボード 使うのはこの辺のクラス↓
KeyboardState
Keyboard
key
ゲームパッド 使うのはこの辺のクラス↓
GamePad
マウス(XBOX360では今のところサポートなし) 使うのはこの辺のクラス↓
MouseState
Mouse
入力デバイスの状況は実行毎フレームGetState関数を呼んでやれば良いようです。
コールバックやウィンドウメッセージを使わないようにした仕様は
”ゲーム作成環境”として提供されているXNAならではという感じがします。
以下、参考ヘルプ
Input Overview
・ランダム
Random クラスを使用。
ランダムの精度などは調べていませんが、ま、とりあえずこれを使いましょう。
サウンド以外の下調べがやっと完了しました。
あとはパパッと作っちゃうだけです。
続く。
| 固定リンク | コメント (0) | トラックバック (0)
・Game1.cs を眺めると…その2
実際にゲームを作るにあたって、全体的な構造がどうなっているか知っておいたほうがよい…
というか、俺の場合知らないと気になる性質なので調べておきます。
*ゲームループの構造
ヘルプを調べると以下に簡潔にまとめられているのでリンクを張っておきます。
XNASDKがインストールされていればヘルプもインストールされているはずなのでリンク先を開けると思います。
Application Model Overview
ms-help://MS.VSExpressCC.v80/MS.VSIPCC.v80/MS.XNAFX.1033/XNA/AppModel_GameLoop.htm
以下、ざっくりと日本語で説明とテスト結果などを。
Game1 クラスはMicrosoft.Xna.Framework.Gameからの派生クラスである
ゲームの骨格クラスです。
>public class Game1 : Microsoft.Xna.Framework.Game
Program.cs で
using (Game1 game = new Game1())
{
game.Run();
}
とされると
Game1.Game1(); // コンストラクタ
Game1.Initialize(); // 初期化処理
Game1.LoadGraphicsContent(bool loadAllContent); // グラフィックのロード
が順次実行されその後
Update と Draw 関数が交互に呼ばれるループに突入する。
Game1 クラスの Exit(); が呼ばれるとこのループが終了し
Game1.UnloadGraphicsContent(bool unloadAllContent);
が実行された後 using が使われているので
Microsoft.Xna.Framework.Game.Dispose() が実行されてゲーム終了。
自分が使うリソースの後片付けを確実にするために、
Game1 クラスの Dispose() ←引数なし は親クラスの関数をオーバーライドできないので
Dispose(bool disposing) ←引数あり こちらの関数をオーバーライドしておく。
可変フレームレートと固定フレームレートの切り替えは以下のフラグで管理している。
Game.IsFixedTimeStep = true or false;
デフォルトでは固定フレームレートになっている。
今回のプロジェクトでは簡易のため固定フレームレートを選択。
フレームレートを制御している変数は
Game1.TargetElapsedTime で、
デフォルトで
TargetElapsedTime.Milliseconds = 16
になってるので秒間60フレーム。
今回のプロジェクトでは30フレームにしたいので以下のようにする。
C++使いには非常に違和感(恐怖感)があるnewしてぶっ込むソースですが
C#ではこういうのが常套手段になるんでしょう。
public Game1()
{
…
this.TargetElapsedTime = new TimeSpan( 333333 );
…
}
フレームレートを変更すると、
Game1.Update 関数を呼ばれる回数は変化する
Game1.Draw 関数を呼ばれる回数は変化しない
VCスケルトンでは自動生成されないが
BeginDraw 関数
EndDraw 関数
をオーバーライドしておけばそれぞれGame1.Draw 関数の実行前後に実行してくれる。
ウィンドウサイズ(ゲーム画面表示サイズ)はデフォルトで800*600に設定されている。
X-BOXで実行する場合には800*600の設定でいけるのかどうか不明。
今回はPCで動くことだけを目標としていて、
なおかつ小さいウィンドウで動かしたいためウィンドウサイズをもっと小さくしたい。
そんな場合は以下のやり方でできるようだ。
public Game1()
{
…
// 画面解像度(ウィンドウの大きさ)を240*240にセット
graphics.PreferredBackBufferWidth = 240;
graphics.PreferredBackBufferHeight = 240;
…
}
ここまでのところをまとめたソースGame1.cs を以下にUPしてみます。
続く
| 固定リンク | コメント (0) | トラックバック (0)
・Game1.cs を眺めると…その1
たかだか100行もないスケルトンソースなのですが
C#的にわからないところが結構あります。
C#使いの方々は「いまさら何言ってんだプププw」ってところでしょうが
C++使いの方たちのためにもメモを残しておきます。
*baseってなに?
たとえば
protected override void Initialize()
{
base.Initialize(); <- これ
}
のように”base”という、grepしても定義もしくは実体が見つからない何かがあるわけですが
これは
>base キーワードは、派生クラス内で基本クラスのメンバにアクセスするために使用されます。
というように、C#の予約語らしいです。
*#region #endregion ってなに?
http://msdn2.microsoft.com/ja-jp/library/9a1ybwek(VS.80).aspx
→#region を使用すると、コードのブロックを指定できます。
→このブロックは、Visual Studio コード エディタのアウトライン機能を使用して、展開や折りたたみができます。
そもそもC#が”microsoftの息がかかっていないと使えない言語”
という趣がありますがそれにしてもmicrosoftオンリー仕様の雰囲気がある機能ですね。
これは積極的に使わない方針で行きたいと思います。
*partial ってなに?
”partial”という予約語はVCで生成されるスケルトンプログラム Game1.cs には
含まれていないのですがサンプルゲームSpacewarで使われています。
>partialは、クラスや構造体などの型を複数のソースファイルに分割して記述するための予約語。
とのこと、つまり
a.csに以下を記述
partial public class A
{
private int a;
}
b.csに以下を記述
partial public class A
{
private int b;
}
ということができる機能という事のようです。
これは…積極的に使う理由が見当たらない言語使用な感じがしますね…
複数人での開発時に便利なようでいて最終的にグタグタになりそうな…
*printf デバッグは?
using System.Diagnostics; // C++でいう所のインクルードをして…
Debug.WriteLine( "Sunday-XX" ); // で標準出力にアウト、と
詳しくは下記リンク↓
http://msdn2.microsoft.com/ja-jp/library/system.diagnostics.debug.writeline(VS.80).aspx
リリースビルドでの実行時には出力されないことが確認できました。
ので、おそらくリリースビルド時には”まったく無かった事”
として扱われているんじゃないかなあと思います。
また、Assert機能も同じくDebugクラスに以下の関数があるので活用しましょう。
Debug.Assert(bool condition, string message);
その他、System.Diagnostics.Debug クラスにはちょっと便利なデバッグ関数が
いろいろ入ってるので確認しておくといいと思います。
VCのエディタ上で"Debug"って書いたある所にカーソルを合わせて左クリック→定義に移動 ですよ!
いまだぷよぷよの”ぷ”の字も出てこない状態ですが
基本が肝心ということで、お許しいただきたく…道のりは長くなりそうです。
続く
| 固定リンク | コメント (0) | トラックバック (0)
・Program.cs を眺めると…
内容としてはこれだけ↓
static void Main(string[] args)
{
using (Game1 game = new Game1())
{
game.Run();
}
}
C#ではプログラムエントリとして、static void Main 関数が使われる、と。
んで、いきなり意味不明の using ですが
これは以下のリンク参照↓
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_011/cs2_011_03.html#cs1110
のように、このブロックで生成されたオブジェクトが、
このブロック内で何か例外を吐いて飛んだとしてもブロック終了時には
必ずDisposeメソッドを呼んでくれる、という安全のための言語仕様のようです。
メモリ開放(オブジェの実態の消滅)がいつ行われるか不定である、
つまり、デストラクタがいつ実行されるか不明である。
したがって、明示的にデストラクタのようなものを実行できるような関数が必要→これがDisposeメソッド
うーむ、メモリ管理をプログラム言語に任せるツケがここに回ってきているんだな、
という印象ですね。
”なるべく基幹システムを破壊しない”という思想なんでしょうけど
X-BOXのゲームで頻繁に例外吐いて落ちるようなゲームを発売しちゃったら
確実に祭になって回収騒ぎで…
という胃が痛いどころでは済まない事態になるわけで、
実行されるのはデバッグ時だけであって欲しいと願うところですねw
*まとめ*
Program.csの内容としては
Game1 クラスのインスタンス(実体)を作ってそれを実行 game.Run();
させるだけって感じです。
game.Run 関数の中で無限ループが行われているはずなのですが
この関数のソースコードを見ることはできませんでした。
ここの中身はバイナリ化されてるってことですね。
*感想*
ここまで製作記を書いてきて感想。
プログラムの本を書いてる人ってやっぱすごいですわ。
このブログの記述内容はあくまでも個人日記みたいなものだと考えてるのですが
それにしたって「誰かの役に立つといいなあ」という気分もこめられているわけで
そうなってくると”どのくらいのレベルの人達に向けて記事を書くのか?”
って事を考えなくてはいけないわけですが、それって結構大変。
今のところ俺はそういうことを考えてないのですが…
それでもテキストを書くのにプログラムを組む何倍もの時間がかかります。
偉大な先人たちには頭が上がりません。
続く
| 固定リンク | コメント (0) | トラックバック (0)
・プログラムの記述ルール
商用ゲームのように多人数でひとつのプログラムを作成する場合、
プログラムの記述ルール(コーディングルール)を決めることが多いです。
メインプログラマの気質によって縛りがきつかったりゆるかったりするわけですが
だいたい、「このくらい守っとけばいいんじゃないかな」という
目安のラインがあります。
さて、C#での記述ルールはどんな感じが標準的になるんでしょうか?
たとえばクラスのメンバ変数
GraphicsDeviceManager graphics;
はC++的な頭で考えると
メンバ変数で、ポインタで、クラスを意味する…
という感じになるはずなので
たとえばこんな感じ
// C++ だったら↓
// GraphicsDeviceManager *m_pCGraphics=null;
// m_pCGraphics = new GraphicsDeviceManager(this);
// C# なので↓
GraphicsDeviceManager m_pCGraphics;
m_pCGraphics = new GraphicsDeviceManager(this);
接頭語としてそれぞれ
"m"(メンバ変数を意味する)
"p"(ポインタを意味する)
"C"(クラスを意味する)
っていう書き方をしたりするわけですが
C#だと「メンバとクラスの意味あいはいいとしてもポインタじゃないからなあ…」
ということになるわけで。
サンプルゲーム Spacewar では接頭語をまったく使ってないし
Webで見つけたサンプルもつけてるソースはほとんどないですね。
メモリの開放し忘れというのがC++ほどクリティカルなダメージに
ならない言語とはいえ…接頭語って消え行く運命なのですか?!
うーむ… あ、まてまて!
そもそもC#で
GraphicsDeviceManager m_pCGraphics;
こう書いた時点でm_pCGraphicsの値(初期値)ってどうなってるの? nullが入ってるの?
答えは以下リンク↓
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_005/cs2_005_02.html#cs0505
>C#では、ローカル変数などは、値を代入する前に参照しようとするとコンパイル・エラーになる。
>クラスのメンバ変数などは、Visual Basicのように、変数を既定の値で初期化する。
うーん…なんか微妙ですね。
続く
| 固定リンク | コメント (0) | トラックバック (0)
今回から「ぷよぷよ」っぽいゲームの作成記事を連載します。
計何回でおしまいになるかわかりませんがしばしお付き合いくださいませ。
これからXNAでゲームをつくろうかなあ…と思っている方々の人柱として
少しでもお役に立てれば幸いです。
何でぷよぷよにしたかというと
*とりあえず2Dだけで
*昔作ったぷよぷよプログラム(Java)が手元にあるのでそのソースコードを移植する
というなんというか、まず、感触をつかんでみよう、という訳ですね。
・環境を整える
何はともあれ環境整備です。
VisualStudioExpress2005 C# と XNA SDK はインストールできているので
環境は整っているのですが、細かいオプションを俺仕様にして
使いやすくします。
以下のセッティングはあくまでも”俺仕様”なので
必要を感じない場合はしなくても問題ありません。
C#では内部で使用される文字コードがunicodeになるそうです。
ということで愛用している秀丸エディタの設定を変更します。
*.cs という拡張子のファイル、つまりC#プログラムのファイルの
保存・読み込みには UTF-8 を使うように設定。
VisualStudioのエディタも結構頻繁に使う予感がするためこちらもセッティングします。
とはいっても、変更箇所は1個だけ。
VCのエディタでTabキーを使ったタブを入力するとスペースを4つ入力したのと同じことになってしまう…
という初期設定を変更します。
ちなみにこの、Tabキーで入力するタブ(文字インデント)を”ハードタブ”と言い、
スペースで入力していくことを”ソフトタブ”って言うらしいです。
XNAに付属のサンプルゲーム Spacewar では全部ソフトタブで記述されていますが、
ソフトタブは嫌いなのでハードタブを使用するように設定します。
メニュー→ツール→オプション→テキストエディタ
で、”すべての設定を表示”にチェック。
すると、C#エディタのタブ設定ができる画面が表示されるので
”タブの保持”にチェックします。
・プロジェクトの作成
VC2005とXNASDKがちゃんとインストールされていれば
VCのメニュー→ファイル→新しいプロジェクトを選択すると
XNAゲーム用のテンプレートがすでにあるので
”WindowsGame”というのがあるはずなのでこれを選択してプロジェクトを作成します。
X-BOX360用とウィンドウズ用とテンプレートが別なのが気になりますが…
別テンプレートになっている理由もやってくうちに何か見えてくるでしょう。
プログラムがちゃんとできていればウィンドウズ用のアプリを
X-BOXに移植することもそんなに大変なことではないんでしょう…たぶん。
プロジェクト名”Puyo”で
プロジェクトの作成が完了すると
ルートにPuyoフォルダ、いくつかのサブフォルダと基本のソースコードなどが自動で出来上がります。
その中でも Game1.cs と Program.cs という2つのソースファイルが基本部分ですね。
VCが自動で作ってくれたスケルトンのままビルドして実行すると
以下のようにウィンドウが表示されます。
気分が高まってきましたね。
初回なので気張って画像をいれてみましたw
続く
| 固定リンク | コメント (0) | トラックバック (0)
C#、とC言語の進化系のような名前の言語なので
使いこなすまでにそんなに苦労しないであろうと予想しつつ、
全体的にさらりとお勉強できるサイトを探してみたところ
↓ここがよかったので紹介。
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/
http://www.ne.jp/asahi/nami/mei/cpp2cs.html
後々もっと詳しいことを知りたくなったら、書籍を買う必要があるでしょうが
今のところこれで十分事足ります。
…ふむふむ…
やっぱりC++とJAVAとミックスしたくらいの感じですね。
構文の使い方もC言語のノリでだいたい何とかなる、と。
しかし、ヘッダファイルってだいぶ嫌われ者になってきましたね。
C#もJAVAと同じように、ヘッダファイルは使わなくて、
インクルード周りはコンパイラに任せちゃう形式です。
「2重インクルードしちゃうとダメっていうのがメンドクサイ」
っていうのもわかるんですけど、俺は”ヘッダファイルはあったほうがイイ派”です。
仕事で人のソースを修正することって結構あります。
修正する場合でなくても、
ざっくりとクラスの構成を見たい、
このクラスって何なの?っていうのをチェックしたい、
そういう場合が結構あります。
そんな時にはヘッダファイルがあると助かります。
自分でクラスを構成しているときも
「ヘッダファイルだけ先に書いちゃう」ってこと、結構やります。
…D言語もヘッダファイルを使わないみたいですね、D言語、流行るかどうかわかんないけどw…
そうかぁ、ヘッダファイル無しに慣れておかんとあかんですか…
| 固定リンク | コメント (0) | トラックバック (0)
C#を覚えることを嫌ったわけではないけれど、
XNAでゲームを作るにあたってC++で記述したいなあ、という希望がありました。
何でかっていうと、やっぱり慣れてるんですよね。
XBOX PS ニンテンドー 現在店頭で買えるゲームのソフト、
ほぼ、C、C++ (もしくはアセンブラ)でプログラムされています。
(JAVAを使ってるのはケータイのゲームと、オンラインゲームのサーバー側くらいでしょうか。
PCゲームでC#使ってるタイトルってあるんでしょうか?
C#はVS.NETのころから使えるわけだから、ありそうですね。)
ということは、
ウィンドウズで動くゲーム製作を助けるツール(たとえばマップエディタとか)
を作らない限り仕事上でC#を使う機会が無かったのです。
で、そういうツールを作る仕事は最近トンとご無沙汰で。
「仕事で使わなくても勉強しとけ!」
…そうですね、がんばりますorz
閑話休題。
「XNAもC++でいこうじゃないの」ということでWEBを調べて回ったのですが
結論から言うと、「やっぱりC#でいこう」
ってことになりましたw。
C++からXNAのライブラリを使うためには「C++/CLI」ってものを
使わなくちゃいけないみたいなのですが。。。
↓参考リンク
http://www.atmarkit.co.jp/fdotnet/special/cppcli/cppcli_01.html
C++を使うことによって楽をしようと思ってたのに” ^ ” の記号に XOR 以外の意味があるなんて!
…慣れてしまえばどうってこと無いんでしょうけど、
無駄な勘違いで時間を食うのももったいないので心機一転、C#で突き進んだほうがよいかな、と。
「C#ってあれでしょ、C++のネームスペースがちょっと拡大されて
あとはポインタが無くて参照とかJAVAみたいなもんでしょ?」
と言いながら次回。
| 固定リンク | コメント (0) | トラックバック (0)
XNAとは?↓
http://www.microsoft.com/japan/xna/
X-BOX360で動くゲームをアマチュアでも開発できる環境を
マイクロソフトが用意してくれました。
X-BOX360で動かすためには
XNA会員として年間1万円くらいをマイクロソフトに奉納する必要があるようなのですが
PC上で動くゲームに関しては完全にフリーで始められます。
…そりゃやってみるしかないわな、ということでして以下のサイトを参考にして始めました。
http://www.saturn.dti.ne.jp/~npaka/xna/index.html
http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld04/directxworld04_01.html
1・Visual Studio C# 2005 Express Edition をインストール
http://www.microsoft.com/japan/msdn/vstudio/express/
2・DirectX SDK - December 2006 をインストール
http://www.microsoft.com/japan/msdn/directx/downloads.aspx
3・XNA をインストール
http://msdn.microsoft.com/directx/XNA/default.aspx
ここまで、特に問題なく進みました。
XNAに付属のサンプルゲーム「Space War」
も問題なくビルド→実行できることを確認。
あとは、このブログのためのアカウントを作ったり
Visual Studio 2005 のisoイメージをCDに焼いたりして、今日は終了。
歩みがのろいですねw
| 固定リンク | コメント (0) | トラックバック (0)