socket.ioとenchant.jsでネトゲ作り始めた

某所に提出するように昔作ったもののコア部分を詰めて作ったんだけど、興が乗ったので今日そのまま作りこんでみた。

同時にログインして相手に近づいて殴ったらHPバーが減って死ぬ。死ぬと4秒でリポップする。
まだマップを実装したりモンスターを徘徊させたりしてない。実質一日で作ったものなので現状この程度。


ガワはenchant.jsで書いた。はじめてまともにつかってみたが、意外と複雑な構成に耐える印象。とくにアニメーション部分はavatar.enchant.jsの仕組みにほぼ乗っかっているのだが、サーバーサイドでステートを決定してクライアントで受け取っている。こんなこと自分以外はやっていないと思う。

一応Githubに置いた。グワーッと作りたかったので、まだテストコードを書いていない。

mizchi/node-mmo https://github.com/mizchi/node-mmo


git clone して redisでサーバー立てて npm install して coffee app.coffee すれば動く。(ライブラリ足りなかったらnpmで入れてください。


コードを書く基礎体力的な部分で、会社でレビューでボコボコにされたので品質的な部分ではだいぶ改善した気がする。サーバーでどういう状態を持って、クライアントがそれをどの程度まで知る必要があるか、とかは会社でゲーム作りながらで勘所がわかってきたので、すっきりできた。


そういえば常々Node.jsで書くとクライアントとサーバーで同じロジックを共有できていいよ!的な話をしていたんだけど、今日通信を圧縮するような部分を書いててその効果を実感した。

このコード

class Minifier
  constructor: (params_str) ->
    @protocol_mapped_array = 
      params_str
      .replace(/\s/g, '')
      .split(',')

  encode: (object) ->
    for key, index in @protocol_mapped_array
      object[key]

  decode: (object_array) ->
    retval = {}
    for val, index in object_array
      key = @protocol_mapped_array[index]
      retval[key] = val
    retval

chracter_minifier = new Minifier 'user_id,x,y,avatar,action,dir,HP,hp'

これをサーバーとクライアントで同じ物を読み込んでいる。
なにがしたいかというと、WebSocketで可読性が高いJSON送ると無駄が多いので、ハッシュを一度Arrayに変換している。それをクライアントでハッシュに復元するクラス。
本当に低レベルに圧縮したいんならたぶんSocket.IOのバイナリ通信がいいんだろうけど、適当にでっち上げる文には十分だった。

サーバーとクライアントで同様のロジックが必要だったので随分良い感じに動いてくれた。