神代クロ のすべての投稿

ゲーム開発5:DirectX Graphics(Direct3D)を初期化する

ちょっと間が空いたけど、今回はDirect3Dの初期化と解放です。ここも定型処理だね。今回使うのはDirect3Dのデバイスとオブジェクト、Direct3DXのスプライトとフォントです。ちなみにDirect3DXはDirect3Dのラッパーです。

将来的にDirectXのバージョンが変わる可能性を考慮して(もう新しいの出てるけど)、クラスは2つに分けます。CGraphicisBaseとCGraphicsです。CGraphicisBaseにはDirectXに依存する処理を入れておき、CGraphicisに継承させます。いざ環境が変わったらCGraphicisBaseだけ差し替えれば動く、という感じにします。クラス名はCGraphicisBase90cみたいにバージョン入れた方がわかりやすいかもね。

しかし今回もDirectX8時代のソースを基に組んでるけど、細かい所が色々変わってるね。同じ名前なのにクラスがオーバーロードする訳でもなく、別物になってたりするし。ゲイツめ…

//---------------------------------------------------------
// 初期化

BOOL CGraphicsBase::Init(HWND hWnd)
{
 // 表示系初期化
 if (InitD3D(hWnd)==E_FAIL) {
  MessageBox(NULL, "Direct3Dの初期化に失敗しました", "CGraphicsBase::Init", MB_OK);
  return E_FAIL;
 }

 // スプライトオブジェクトの作成
 D3DXCreateSprite(D3Device, &D3Sprite);

 // フォント初期化
 InitFont(&D3DebugFont);

 return S_OK;
}

//---------------------------------------------------------
// Direct3D初期化

BOOL CGraphicsBase::InitD3D(HWND hWnd)
{
 D3DPRESENT_PARAMETERS d3dpp; 
 D3DDISPLAYMODE   d3ddm;

 // Direct3Dオブジェクトの作成
 if (NULL==(D3D=Direct3DCreate9(D3D_SDK_VERSION))) {
  MessageBox(NULL, "Direct3Dオブジェクトの生成に失敗しました", "CGraphicsBase::InitD3D", MB_OK);
  return E_FAIL;
 }

 // 現在のディスプレイモードを検出する
 if (FAILED(D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) {
  MessageBox(NULL, "ディスプレイモードの検出に失敗しました", "CGraphicsBase::InitD3D", MB_OK);
  return E_FAIL;
 }

 // 3Dアプリケーションの動作を指定する
 ZeroMemory(&d3dpp, sizeof(d3dpp));
 d3dpp.BackBufferWidth=640;
 d3dpp.BackBufferHeight=480;
 d3dpp.Windowed=System->ScreenMode; // フルスクリーン:FALSE
 d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
 d3dpp.BackBufferFormat=d3ddm.Format;

 // Direct3Dデバイスの作成
 if (FAILED(D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
         D3DCREATE_SOFTWARE_VERTEXPROCESSING,
         &d3dpp, &D3Device))) {
  MessageBox(NULL, "Direct3Dデバイスの生成に失敗しました", "CGraphicsBase::InitD3D", MB_OK);
  return E_FAIL;
 }

 return S_OK;
}

//---------------------------------------------------------
// フォント初期化

void CGraphicsBase::InitFont(LPD3DXFONT *D3Font)
{
 // テキスト設定
 D3DXFONT_DESCA FontDesc={
  32,     // 高さ
  0,     // 幅
  0,     // 太さ
  0,     // ミップレベル
  FALSE,    // イタリック
  SHIFTJIS_CHARSET,
  OUT_DEFAULT_PRECIS,
  DEFAULT_QUALITY,
  DEFAULT_PITCH | FF_DONTCARE,
  NULL,
 };

 // フォントオブジェクト作成
 D3DXCreateFontIndirect(D3Device, &FontDesc, D3Font);
}

//---------------------------------------------------------
// Direct3D解放

void CGraphicsBase::TermD3D()
{
 // フォント解放
 if (D3DebugFont!=NULL) {
  D3DebugFont->Release();
 }

 // スプライト解放
 if (D3Sprite!=NULL) {
  D3Sprite->Release();
 }

 // Direct3Dデバイス解放
 if (D3Device!=NULL) {
  D3Device->Release();
 }

 // Direct3Dオブジェクト解放
 if (D3D!=NULL) {
  D3D->Release();
 }
}

ぐるみんプレイ中

秋葉原に行ったらぐるみんというゲームが500円(ワゴン)で売ってましたw なのでプレイしてみます。

ゲーム自体は4年位前に出たもので、ファルコム3Dアクションです。主人公の女の子がドリルで敵を倒すというのが、ちょっと懐かしいですね。最初オープニングムービーの音が出なかったので、あれこれ試してたんだけど、ffdshowをアップデートしたら音が鳴ったよ。

とりあえず1時間くらいプレイしましたが、なかなか面白いです。子供向けなファンタジックなストーリーと雰囲気のお陰で、気楽にプレイできます。PCよりコンシューマ向けじゃないかと思ったら、やっぱりPSPでも発売されてるね。

のんびりプレイしますか。

六本木で外人さん達と飲む

今更サイトにアイコンを付けてみた>挨拶
---

今日は六本木で打ち合わせしました。その後、そこの会社の人達+αで飲む事に。

面子はイギリス人、フランス人、オーストラリア人、ロシア系日本人、ハワイに住んでる日本人、あとは生粋の日本人が3人です。生粋と言っても俺以外は海外に行って商品の買い付けとかしてる人達なんだけどね。

でもその場でのメインの言語は日本語だったので助かりましたw 横に座ったフランス人は明日からはじまる東京ゲームショウに作品を出展すると言うので、しばしゲーム話をしましたよ。昔俺が開発に関わったゲームとか知ってて、ちょっと嬉しかったり。

ちなみに料理は鍋でした。肉が速攻で無くなって野菜鍋になってたけど。あと日本酒を薦められ飲んでたのですが、大量に薦められて久しぶりに酔っ払ったよ。

日本語が通じにくかったりしたけど、みんなテンション高くてなかなか面白かったです。

秋葉原の焼肉屋に行く

秋葉原の焼肉屋に行きました。面子は前回参加のうちの3人。秋葉原にある焼肉屋は値段が高い所が多いので、安い所を探そう、とか言って歩き回ったけど見つからず。昔は食べ放題の鉄板焼き屋とかあったのにね。

もう焼き鳥屋でいいか、という雰囲気になったけど、最後のあがきでケータイでgoogle検索してみる。そしたらちょうど近くに焼肉屋があるって出たので行ってみました。

そこは…風俗ビルでしたよ(汗) 風俗ばかりが入る雑居ビルの1フロアが焼肉屋になってます。でも入ってみたら普通っぽい雰囲気だったので入店。

食べ放題メニューを選択してしばし肉を食べてました。意外に普通の店だな。値段は安いし、特に問題なく腹が膨れるまで食べれました。

まぁたまにはこんな店もいいか。

ゲーム開発4:システムクラス作成

ちょっと間が空いてしまいましたが、システムクラスCSystemを作成しています。もともと58.8fpsで動くように作ってあったのをそのまま流用です。そのうちちゃんと60fpsにしよう。

ProcessNextFrame()メインルーチンWndProc()から呼び出して、システムをフレーム単位で動くようにしています。ProcessNextFrame()内にあるWaitTime()で、動作が一定になるようにウェイトを入れてます。

昔作ったシステムでは場合分けやエラー処理をたくさん入れてたけど、最近はPCの性能も上がったし、OSもWindowsXP以上で動かすこと前提で組んでいるので、ばっさり切ってます。

いつまでも画面が表示されないと寂しいので、次はグラフィックスクラスCGraphicsを作って何か表示させようかね。

//---------------------------------------------------------
#define SPF 17 // 58.8フレーム

//---------------------------------------------------------
// 生成
CSystem::CSystem(HWND hWnd)
{
 // パラメータ設定
 MyhWnd=hWnd;

 // 乱数初期化
 srand((unsigned)timeGetTime());

 // タイマの高精度化開始
 timeBeginPeriod(1); 
}

//---------------------------------------------------------
// 解放
CSystem::~CSystem()
{
 // タイマの高精度化終了
 timeEndPeriod(1);
}

//---------------------------------------------------------
// Name: フレーム処理
HRESULT CSystem::ProcessNextFrame()
{
 // 計算

 // 時間待ち
 WaitTime();

 // レンダリング

 return S_OK;
}

//---------------------------------------------------------
// 時間待ち
void CSystem::WaitTime()
{
 static DWORD dwLastTick=0;
 static LONG  lErrTick=0;
 DWORD   dwCurrTick, dwNowTick;
 LONG   lWaitTick;

 // 待ち時間を計算
 dwCurrTick=timeGetTime();
 lWaitTick=SPF-(dwCurrTick-dwLastTick)+lErrTick;
 lErrTick=0;

 // 処理落ちしている?
 if (lWaitTick<0) {
  lErrTick=lWaitTick;     // lErrTickはマイナスになる
  if ((SPF+lErrTick)<0) lErrTick=0;
  dwLastTick=dwCurrTick;
  return;
 }

 // 処理が早ければスリープする
 if (lWaitTick>=4) {
  Sleep(lWaitTick-3);
 }

 // ループで細かい時間待ち
 while (SPF>((dwNowTick=timeGetTime())-dwLastTick)) {
  ;
 }

 dwLastTick=dwNowTick;
}

豚肉料理専門店に行く

ジョニーから豚肉料理専門店に行こうと連絡がありました。またジョニーか! とか思ったけど、学生時代の人間が東京に来ているとの事だったので、参加です。

面子は俺を含めて5人。みんな学生時代の連中です。肉を食いながら投資の話やセミナーの話が出たり。そういえば最近はセミナーとか行ってないなぁ。最後に行ったのはコールドリーディングの人のだったかな。最近ちょっと気になってるフォトリーディングのセミナーの話やマインドマップなんかの話が聞けてなかなか面白かったです。

そういえば知人の何人かが、「そろそろセミナービジネスやりたいなぁ」とか言ってたっけ。トークに自信のある人達は良いね。まあ俺は彼らと協力して、そのセミナーで収録したCDやDVDをネットで販売して儲ける、とw

たまにはこういう話題を肴に飲むのも良いね。

しゃぶしゃぶ食べ放題

今日はジョニーが「肉が食いたい気分でごわすゲマ」とか言うのでしゃぶしゃぶ食べ放題に行きました。いい加減このネタも古いな…

季節的にちょっと寒くなってきていたので、しゃぶしゃぶは良いですね。牛と豚を交互に、そしてたまに野菜を含めて食べてたよ。

ジョニーはオタクで情報系の学校に行っていたにもかかわらずネットに疎く、持ってるテレビはなぜかVHFしか映らない、さらにビデオデッキやHDDレコーダーも持っていない情報弱者なので、最近の(番組改編で終了してるけど)アニメなんかを教えてみました。どうやら幾つかは興味を持ったみたいで、DVDを買うとか言ってたよ。

食べ放題の店でジョニーがやらかす事は、食べきれない程の料理を持って来て余らせてしまうです。今回も余らせてたけど、迷惑な客だね。

都内の温泉に行く

今日は師匠たちと都内の温泉に行きました。ちゃんと地下1000メートルくらいから汲み上げてる温泉らしい。

露天に行くと源泉の湯があって、入ってみるとなんかぬるぬるしてたよ。源泉なのに40℃くらいなので、丁度良い温度でした。

しばし入った後、一旦出てビールを飲みます。風呂上りの一杯は美味いね。飲みながらビジネスの打ち合わせをはじめてみたり。ビジネスアイデアを出しても、やはり営業が弱いんで、そこがネックですね。

そして2度目の入湯。暗くなった夜空を眺めながらのんびり浸かりました。ちなみに、ちょっと雨がぱらついてたけど、それもまた良し。

久しぶりにのんびりでした。

パソコンを設定する

今日は取引先のパソコンを設定しに行きました。

7年位前に買ったパソコンが調子悪いから、新しく買ったとの事。データの移行とか、アプリの設定なんかをしてほしいと言われました。

行ってみると、パソコンはAthlon 64 X2でメモリ2GByteな感じのものでしたが、ディスプレイをデュアルにしてたんで驚いたよ。22インチを2台机に並べてるし。俺は未だに17インチCRTが1台なので、ちょっと羨ましい。

設定後、古いほうのパソコンを軽くしてほしい、と言われたけどリカバリディスクが無いみたいなので、不要なアプリを消してディスクのクリーンアップや最適化程度で止めときました。ちなみに自分のパソコンはレジストリクリーナーで掃除してるけどね。

にしてもパソコンの設定は時間がかかる…ほぼ1日仕事になっちゃいました。

サーバ移転します

ウチのサイトは4年以上、XREAを利用していましたが、ここ半年ほど某サイトでCORESERVERを試していて、特に問題なさそうなので移転する事にしました。

XREAもCORESERVERも同じ会社のサービスなんだけどね。普通にHTMLを載せとくだけなら今のサーバでも良かったんだけど、システムが古いまま更新されなくて、例えばPHPはサポートが終了してるバージョン4.4.8のままだし。まぁ勝手に更新されても困るけどね(バージョンの違いでシステムが動かなくなったりする)。

幾つかのサイトは既に載せ替えたんだけど、PHPかPEARのバージョンのせいか、文字化けを起こすので、ちまちまエンコードを変換させてました。でも作業はそれくらいで、問題なく移転できました。

メインのyagasuri.comはシステム部分をリニューアルしてから載せ替えようと思いつつ、手付かずのまま結構時間経ってたり(汗)

そのうちリニューアル&移転します。