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の位置づけ
  • ワールドサーバーを管理するのはどこ?
2009-04-06

土日が忙しい

この春は子どもの卒業式とか卒園式とか入学式とか入学式とかあってただでさえ忙しいのに、 3月は家族で海外旅行したり、両親の住む群馬へ行ったり、なんだかんだ家族がらみのイベントがやたらと多くなってて、 やりたいことがいろいろ出来ていない。

ここ数ヶ月、Ruby系の勉強会への参加は壊滅的で、いつ何が行われているのかさえよく把握できていない。

最近始めたボ会と横浜へなちょこプログラミング勉強会には継続的に参加させてもらいたいんだけど……。

一昨日は横浜へなちょこプログラミング勉強会だったんだけど、楽しすぎて大変なことになった。 今尚三日酔いが続いている(いやさすがに酒は抜けてるけどダメージがでかすぎて体調が完全でない)。

あと昨日yhara君の何かがあったみたいなのだけど(いまだになんだったのかよくわかっていない)、すごく楽しそうだったので参加できなくて残念。 せっかく呼んで頂いたのにごめんなさい。

土曜日の午前中に種を蒔いた。結局ナスはいまだに蒔けずじまい。今年はもう間に合わない気がする。

もうちょっとちゃんとブログを書かないと、せっかくのチャンスを失っている気がする。 twitterを積極的にやるべきか。 iPhone買っちゃうとか?

2009-04-04

[開発]Javascript+Canvasで実装したクライアント

追記: ソースを書き直した新しいバージョンがこっちにあります。

「3D空間上にキャラと地面を表示して歩かせる」というのをJavascriptとCanvasで実装したもの。

world20090404.png

http://dgames.jp/archive/world/client20090404/world2.html

※動作確認をしてるのはWindows上のChrome、Firefox、Safari。Canvasが使えないIEはまともに動かないはず。スペースキーで視点回転、その他の操作はウィンドウのテキスト参照

去年の夏から秋にかけて作っていたのだけど、キャラ画像が借り物だったので公開できないでいた。 先日良い素材を見つけたので手直しして公開。 まだまだ試作品レベルだけど。

動かす場合はChrome推奨。Firefoxより断然速く、手元の環境では秒間30〜60フレームくらい出る(FPSは画面右上)。 最初プロトタイプをStar Rubyで書いてたんだけど(ポリゴン描画ができないのでワイヤーフレーム)、 Javascriptに移したらかなり速くなった(うろ覚え)。 3D座標と変換はJavascriptでちまちま計算してる。 Javascriptを良くわかってないので、もっと速く動作するように書くことができると思う。 現時点ではあまり速度は追求してない。 とりあえず動かしてみたら思ったより快適に動いた。

ちなみに、公開しているのはクライアント部分(静的なHTML)のみだが、実際はサーバー側と連動して、複数のプレイヤーでチャットをしたり、キャラの移動情報が共有されるようになっている。 今回はサーバーサイドとやりとりする部分は切り取ってある。 サーバー側はRails+ShootingStarで実装してる。

メモ。

  • HTMLで画像を読み込んでおかないとGifアニメが動かない
  • スクリーン内のフォントは2度書きして影をつけているので、フォントによっては表示が崩れるかも

バグ。

  • たまに止まることがある。キャラ画像の切り替えがうまく言っていない模様(よくわかってない)
  • スリープに入ってから再開するとウィンドウ上をクリックしても移動できない
  • たまに視点がキャラを追随しない