月別アーカイブ: 2008年9月

ゲーム開発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はシステム部分をリニューアルしてから載せ替えようと思いつつ、手付かずのまま結構時間経ってたり(汗)

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

ゲーム開発3:システム構成を確認する

5f7d4ba8.jpgいきなりDirectXまわりを組んでいこうと思ったのですが、考えも無しに組んでいくと後々破綻しそうなので、とりあえず過去に組んだシステム構成を確認してみました。

画像のツリーがそれで、クラス毎に書いてます。WinMainからはじまり、CSystemで全体の初期化をします。その時にCGraphics等でDirectX関連の初期化も行います。またCSystemはフレームレート等の基底システムを司ります。

CGameModeは各モードの基底クラスで、タイトル画面だとか、エンディングとか、その時どきのシーンを派生します。

CMainModeがゲームプレイ時のシーンです。この中にキャラクタや移動するフィールドなんかを詰め込んでます。

図では分かりづらいですが、CMainMode等はCGameModeを継承、CMyChara等はCCharaを継承しています。

基本はこの構成で良さそうですね。ただこの過去のシステムでは、DirectXに依存する部分の隠蔽化が不十分だったため、今回ゼロから組み直すハメになったので、そこは気をつけてみます。

図を眺めてまず最初にやるのは、やはりCSystemクラスですね。その後DirectX関連を進めていきますか。

ゲーム開発2:ウィンドウを表示する

久しぶりにゲームを作ろうと思います。6年ぶりなので久しぶりどころじゃないけど。この6年で、覚えたことは忘れちゃったし、そもそも時代が変わってるので、新たな気持ちでゼロから勉強です。

せっかくなので、開発日誌をつけていこうと思います。ちなみに開発環境は、
WindowsXP SP3
DirectX9.0c
Visual Studio 2008 Express Edition with SP1
C++

で行きます。

まずはウィンドウを表示する処理を作ります。WindowsのプログラムはWinMain()からですね。最近はUnicode対応の関係から_tWinMain()とかいうのが定義されてるみたいだけど、とりあえず今まで通りで。

ここの処理はもう定型文みたいなものですね。描画はDirectXにやらせるので、以下のソースコードではウィンドウ内には何も表示されません。

次はフレームレートかな、それともDirectX Graphicsに進んだ方がいいかな。

//---------------------------------------------------------
// メイン

#include "windows.h"

#define WINDOW_NAME "開発テスト"
#define APP_NAME "devtest"

// システムメッセージの処理
LRESULT WINAPI WndProc(HWND, UINT, WPARAM, LPARAM);

//---------------------------------------------------------
// アプリケーション開始

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
 RECT rect={0, 0, 640, 480};
 MSG  msg;
 
 // ウィンドウクラスを登録する
 WNDCLASSEX wc={sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L,
       GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
       APP_NAME, NULL};
 RegisterClassEx(&wc);
 
 // アプリケーションのウィンドウを作成する
 AdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, FALSE, NULL);
 HWND hWnd=CreateWindow(APP_NAME, WINDOW_NAME, 
         WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, (rect.right-rect.left), (rect.bottom-rect.top),
         GetDesktopWindow(), NULL, wc.hInstance, NULL);
 
 // 独自の処理★
 
 // ウィンドウ表示
 ShowWindow(hWnd, SW_SHOWDEFAULT);
 UpdateWindow(hWnd);
 
 // メッセージループ
 ZeroMemory(&msg, sizeof(msg));
 while (msg.message!=WM_QUIT) {
  if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
  else {
   // 独自の処理★
  }
 }
 
 return 0;
}


//---------------------------------------------------------
// システムメッセージの処理

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg) {
 case WM_ACTIVATE:
  // ウィンドウがアクティブになった
  // 独自の処理★
  return 0;
 
 case WM_KEYDOWN:
  switch (wParam) {
  case VK_ESCAPE:
   // 強制終了
   DestroyWindow(hWnd);
   return 0;
  }
  break;
 
 case WM_DESTROY:
  // ウィンドウが閉じられた
  // 独自の処理★
  PostQuitMessage(0);
  return 0;
 }
 
 return DefWindowProc(hWnd, msg, wParam, lParam);
}

マウスジェスチャーのマウ筋を導入

昔からある事は知ってたけど、初めてマウスジェスチャーを導入してみました。マウスジェスチャーとはマウスのみで色んな事をさせるツールです。

入れたのはマウ筋です。なんかWikipedia最も有名って書いてあったからw しかしマウスジェスチャーって共通の仕様が無いんだね。どうしようか悩んだけど、とりあえず基本的なものだけ登録しました。

R→(進む)
R←(戻る)
R←→(リロード)
R↓→(ウィンドウを閉じる)

あと幾つか登録した。

たったこれだけなのに、なんか凄く使い勝手が良くなったよ! 今まではマウスでいちいちボタンの所まで移動させる必要があったけど、それが無くなったお陰で、かなり楽に操作できるようになりました。

特に俺はネットを見るとき、ノートPCにマウスを繋いで50cmくらい離れて操作してるから、キーボードのショートカットとか使えなかったんだよね。

そんな訳で、早速持ってるPCすべてに導入したよ。