DAY BY DAY---Inside Game---

現在作っているゲームのまとめ
最終更新日:2007/10/7 18時
OnlineGame
進歩は亀以下並みに遅いけど、空いた時間を見つけてせっせと作ってます。とにかくソロソロ本気で、数人でテストできるところまで持っていかないとヤバイ気がする。
けっこう時間が空いて、サーバープログラムなんか全然訳ワカラない状態だと思う。


<実装状況>
□--予定 ■--実装中[%]  ★完了  !バグ・エラー  △考え中
アルゴリズムライブラリ
STL使えよ!とか言わないで;;
★List、Node、Queueをクラス化しDLLに。(2007/10/04)
★DynamicArrayをクラス化し上に追加。(2007/10/04)
★List、DynamicArrayクラスは未使用。(バグ多過ぎのため
Lis→STLのlistDynamicArray→STLのvectorを使用。
Direct3D系ライブラリ(停滞中)
★メッシュ表示
★回転、移動、拡大縮小
★ライト設定
■フォグ設定[10]
 
GUI

★GetGlyphOutlineを使って文字テクスチャを生成できるようにした。
  現時点ではID3DXSpriteのDraw関数にて描画。
  そのうち頂点バッファとかつかってDrawPrimitiveで描画するかも。
  そっちの方が早かったり、遅かったり。どっちが良いのかワカラない。
★GUIライブラリ内で生成される各GUIの番号を管理する。(2007/10/04)
★デスクトップウィンドウの実装。内容はスタティックウィンドウと同じだが、一番最初に生成され、優先順位が変わらないウィンドウ。(2007/10/07)
△描画対象をデスクトップウィンドウにすると、例えばマップチップとかが置けるようにする。
  これではスピードが遅くなる???

サーバー:(停滞中)
□サーバー情報をFTPでサイトにアップロード
クライアント:
★FPS制御(2007/10/3)
□パケット暗号化
□チャットメッセージの送信間隔を極端に短くならないようにする
□新規発言の度にチャットログを下に更新
アップデータ:(停滞中)
★暫定のアップデーターを作る
サーバー&クライアント:
□ユーザー情報パケット

<サーバー>
画面:

タブ画面
・サーバー情報画面 -> サーバー情報:
・ユーザー情報画面 -> 管理:
管理:
・現在の接続者リストから選択したプレイヤーを切断・ログアウトさせれる。
・アカウントリストから選択したアカウントを削除できる。
・総接続者数、ゲーム中人数、アカウント数を表示。
サーバー情報:
・サーバー名、ドメイン名、IP、ポート、状態、起動時間をサーバーアプリに表示
起動:
・メニューで、開始・停止・終了を選択できる
処理分担:
受信スレッド、送信スレッド、同期処理スレッドに分ける。
キャラクター移動等、フレームに関係あるものは同期処理スレッドで処理する。
チャット等同期を取る必要が無いものは受信スレッドで処理。
<受信>
@WSAAsyncSelectでソケットイベントが来たらWindowProcにメッセージを渡すように設定。
AWindowProcでソケットイベントを取得。
BLPARAMがイベント名、WPARAMがソケットなので、構造体で纏めてイベントキューに詰め込む。
C受信スレッドからイベントキューのデータを取り出す。
DLPARAMでFD_ACCEPT、FD_READ、FD_CLOSEの場合分け。

<送信>
@ユーザー1人1人の接続情報等を持っているデータからソケット情報などを取り出す。
Aパケット送信
ココは、特定ユーザー(1人)に送信、特定ユーザー(複数人)に送信、全員に送信という具合で処理を分ける。

<同期>
@時間計測開始
Aゲーム中の人数分ループをまわす
Bキャラクターの同期が必要な情報が更新されている→更新
C時間計測終了
D1フレームを処理するのにかかった時間を計算し、残りの時間スレッド停止(オーバーの場合回り続ける・・かな)
コレは本のアルゴリズム。
<クライアント>
画面:

・ゲーム画面(DirectXで更新)
・独自のGUIを使用する。

グラフィック:
 2D→3Dに変更しつつあるかも。
面倒になったら2Dで行くことに。。
面倒なんでとりあえず2Dでがんばってみよう。(2007/10/3)
チャット機能:

・入力→サーバー→クライアントという具合に、一旦サーバーに送る。
・マップ毎に送信クライアントを絞り、さらにマップ内エリア毎にクライアントを絞り送信する。
・チャットメッセージは「キャラネーム:発言内容」で表示
コマンド機能:
入力ボックスに/〜と入力すれば色々なコマンド送信可能にする。

<GUI>
GUIハンドル型:

GUIHND型 
GUI作成方法:
<例>

DXDat dd;    //DirectXのデータ
MGUIDLLInit(hWnd,&dd);

GUICONFIG Config;   //GUI設定構造体
Config.m_Caption = "TITLE";
Config.m_Name = "window001";
Config.m_GUIType = WINDOW;
Config.m_GuiStyle = GS_WINDOW|GS_STANDARD;
Config.m_Width = 320;
Config.m_Height = 240;
Config.m_PosX = 100;
Config.m_PosY = 50;
Config.m_GUIProc = GUIProcTest;   //GUIプロシージャ

if(MGUIRegister(&Config))
{
  return 1;//登録エラー
}
GUIHND hnd = MGUICreate(&Config);
if(hnd == NULL)
{
 return 2;//GUI作成エラー
}

という具合に基本的にWinAPIみたいな感じ。

<リンク>
MMORPGを作ってみたい
Revelation of ALTERMIA
SOUL GAINER
SBO
SOCIA online 開発ノート
ゲーム作成経験なしのオレがMMORPGを作るブログですが・・・何か?
どっと村
○×つくろーどっとコム
<参考書>
MMORPGゲームサーバープログラミング
オンラインゲームプログラミング
 Copyright(C) 2006 DAY BY DAY. All rights reserved.