WebSocketでネトゲ作るよ〜 キーイベントの同期

今現在のサーバー側コード(の一部)

クライアント側(zappaを通した記述)

  @client '/index.js': ->
    window.soc = @connect()
    window.onkeydown = (e)->
      console.log "keydown"+e.keyCode
      soc.emit "keydown",code:e.keyCode

    window.onkeyup = (e)->
      console.log "keyup"+e.keyCode
      soc.emit "keyup", code:e.keyCode

キーコードを送ってる。正直ブラウザ依存あるのでfromCharCodeから変換したほうがいい気がしてるし、する。

サーバー(zappa)

  # 新しいユーザーのログイン
  @on connection: ->
    d "Connected: #{@id}"
    players[@id] = id:@id,keys:{}
    @emit 'connection',map:game.stage._map
    d "players:"+(k for k,v of players).join()

  # ログアウト処理
  @on disconnect: ->
    delete players[@id]
    d "Disconnected: #{@id}"
    d "players:"+(k for k,v of players).join()

  # キーコード受取り
  @on keydown: ->
    players[@id].keys[@data.code] = 1
    console.log @id+" push "+@data.code
    console.log players[@id].keys

  @on keyup: ->
    players[@id].keys[@data.code] = 0
    console.log @id+" left "+@data.code
    console.log players[@id].keys

d = console.log


サーバー側のロガー

Connected: 10335976501119295222
players:10335976501119295222
10335976501119295222 push 37
{ '37': 1 }
10335976501119295222 push 38
{ '37': 1, '38': 1 }
10335976501119295222 left 37
{ '37': 0, '38': 1 }
10335976501119295222 push 39
{ '37': 0, '38': 1, '39': 1 }
10335976501119295222 left 38
{ '37': 0, '38': 0, '39': 1 }
10335976501119295222 left 39
{ '37': 0, '38': 0, '39': 0 }
10335976501119295222 push 37
{ '37': 1, '38': 0, '39': 0 }


TODO: ユーザー名とセッションIDのヒモ付、まともなロガー