Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2009-04-30

[開発]クライアント実装メモ

エリアの切り替えをもう少しちゃんと実装したい。 その他気になる部分。

  • マップデータの管理
  • 戦闘エリア
  • サーバーとの同期
  • Worldクラスとエリア管理は処理を切り分ける
  • キャラの移動処理、キャラ操作などもWorldクラスの設計を混乱させるもとなので注意
  • サーバー対応の処理がWorldクラスに紛れ込まないように注意
  • バトルエリアの発生
  • マップデータの引き出し、キャラの配置等ははっきり切り分けるべき

次のような機能もいいかもしれない。

  • エリア名の表示
  • 2Dマップ表示

[開発]クライアント実装メモ(2)

もっとシンプルに実装されるべき。 複雑な機能を実現するにしても、実装はシンプルじゃなくちゃいけない。 じゃないとそのうち手に負えなくなる(手を入れるのが嫌になる)。

  • リファクタリングの前にクリックできないバグを直す

まず現在のWorldクラスがやっていること。

  • スクリーンhtmlの生成(メソッドは空)
  • スクリーンのリサイズ管理
  • カメラの生成、座標更新、移動
  • スリープ用タイマの生成
  • スリープコールバックの設定(スリープ開始処理の定義)
  • スクロールメッセージ用割り込みの初期化
  • イベントの初期化
    • クリック
    • mousemove
    • キー入力
  • ループ処理
  • キャラ生成、3Dモデル生成、描画
  • ship操作
  • 当たり判定。エリア移動判定
  • キー入力イベント

外側からのコントロールにしたいこと。

  • ワールドの生成と破棄
  • キャラの生成
  • マップの生成と管理
  • 表示物のオールクリア

ワールドがあって、それを管理する(持つ)ものがあるという上限関係ではなく、 ワールドサーバーに対して、コマンドを一方的に投げつける(APIを叩く)感じが良いのでは。

2D表示物に関してもコマンド操作が良い。

コマンドは一方通行になる? 戻り値を返すコマンドがあれば……。それじゃメソッド。

厄介な問題。ワールドオブジェクトに対するマウス操作の介入について。

  • 2Dを3D座標辺変換する必要あり
  • キャラのnamePlateはクリックされる
    • 今の「Chara.prototype.click」を上書きする実装はなかなか良い
  • ChatWorldでチャット機能を付加する仕組みは、切り分けとしては成功

ワールドサーバー

新しいワールドサーバーに実装すべきもの。 下記APIがフラットに存在する。

  • 表示物その他の全消去
  • 地面の生成
  • キャラクターの生成
  • キャラクターの削除
  • キャラクターの目的地設定(移動)
    • クリック時のイベントはどう定義する?
  • FPSの変更

その他管理系。

  • サーバースレッドのスタートするAPIを設ける?
  • スクロールメッセージはワールドとは無関係とする
  • スクリーンの座標とサイズは外から設定できるようにすべき

APIは全てグローバルなメソッド。 内部実装にクラスを使うがクラスは見えない。 APIにクラスを使わないことで、内部実装との切り分けを明示する。

イベント管理について。 以下必要なイベント。

  • キャラのクリック
  • 地面のクリック(キャラの移動)
    • イベント処理。座標を受け取って主キャラの移動コマンド発行(どれが主キャラかはサーバーは知らなくて良い)
  • エリア出口との当たり判定
    • 出口の設定は、移動先の設定とセット

将来必要な2D表示物はどうする?

  • 基本的な考え方はチャットウィンドウと同列に
  • ワールドは2D表示物に関与しない

実装。

  • world.js …… グロバールなAPI
  • world/helper.jp …… ヘルパー
  • world/camera.jp …… 3Dカメラ
  • world/object.jp …… 表示物

client.js

  • コアが叩くグローバルなAPI
  • ループ処理を持たない
    • 初期化処理+コア向けAPIのみ
  • イベント駆動型

マップの管理

  • コアサーバに対するAPIの位置づけ
  • ワールドサーバーを管理するのはどこ?