「ゲーム開発」カテゴリーアーカイブ

ゲーム開発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);
}

ゲーム開発1:Visual Studio 2008 Express Edition with SP1を入れる

ネットニュースでVisual Studio 2008 Express Edition with SP1が提供開始したとなっていたので、これを機にインストールしてみました。無料だし。

以下のサイトから
http://www.microsoft.com/japan/msdn/vstudio/express/

Visual StudioのExpress Editionは、無料で使えるプログラムの統合環境です。色々制限がかかってるけど、商用利用もOKなので、同人ゲーム開発なんかには良いね。俺はVisual C++を使うことにしました。

ためしにコンソールアプリケーションで“Hello, world!”を表示させてみました。うん、簡単。次にWindowsアプリのテンプレートプロジェクトを開いてみたら…よくわからん。知らない構造体?クラス?や関数だらけだし。まあネットでちょっと調べてみたら、Win32で組むプログラムの構造は昔と変わってないみたいだったので安心した。

次にDirectXの開発一式を以下からダウンロード
http://www.microsoft.com/japan/msdn/directx/downloads.aspx

今の最新はMicrosoft DirectX SDK (Mar 2008)です。インストールしたら勝手にVisual Studioにパスを通してくれるから便利だね。

これで一通り準備は整いました。ちなみに、試しにDirectX8.0で組んだプログラムをビルドしようとしたら色々足りないってエラー出たw 今はDirectX9.0cの時代だからまぁ仕方ない。

次回はメインループを組んでみようかね。

ゲームつくろう!

知り合いの社長さんと今後の事業計画を練ってる時、なんとなく「ゲーム作りたいなぁ」と言ったところ、「やりましょう!」と同意されてしまいました。マジですか。

まあ、その人はゲーム開発をわかってない人なので、ポシャる可能性の方が高いけどね。

しかし個人的にゲーム作るのも良いかもね。前に同人でゲーム作ってたのは5年位前か。当時と比べると、今は色々変わってるだろうな。まだ主流はWindows&C++&DirectXなんだろうか。グラフィックボードの機能は共通化されただろうか。3Dは扱いやすくなっただろうか。

仕事の合間に調べながらプログラム組んでみようかね。作るゲームは初心に戻ってアクションゲームの予定です。