読者です 読者をやめる 読者になる 読者になる

RPGツクールMVのセーブデータを端末間で共有した話

RPGツクールMVのセーブデータをスマホやPC間で共有した話

(「百聞は一見に如かず」というし,説明書く気力ないので,とりあえず試してみて欲しい)

HerokuとDockerfileを用意しました.

RPGツクールMV

セーブデータ問題

  • ゲームはクライアントのみで動く
    • Socket.ioも使えるが今は置いとく
  • Webサーバにあげておけば,どの端末でも動く
    • そいえば,iOS SafariってユーザイベントからでないとAudio再生できなかったような....
    • (頑張ったんだろうな...)
  • どの端末でも動くが,セーブデータは別
    • 端末ごと別のセーブデータになる
    • クライアント完結なので同期する手段がない
    • 保存先は定番のlocalStorageだった

今回の話

仕組み

  • 自分だけのセーブ保管サーバをつくる
    • Heroku + mongolab で無料(!)
  • セーブ保管するJavaScriptを埋め込みたい
    • 作る側ではなく,あくまでプレイする側として
  • mongodbAPI + セーブ保管JS埋め込み用Proxy
    • localStorageを読めるのは,配信サーバのみ
    • ならば配信サーバになってやればいい

イメージ図

詳しい話

  • Express(Node.js)の勉強をかねて作った
  • mongodbのAPIexpress-restify-mongooseがものすごく楽
    • 何でもできるAPIなので,passportで認証をかける
    • 自分だけしか使わないならこれで十分
  • Herokuでmongolab使うと無料
    • ただし,本人認証のためクレジットカード登録必要
  • digest認証ではAndroid ChromeでAudio再生できない
    • これがわからなくて1日溶かした
  • Proxyの方法はcrossorigin.meの実装を真似した
    • 例)http://proxyserver.com/http://example.com
  • localStorageを自作関数に置き換えた
    • ブラウザ標準関数はthisが違うとエラー吐くので注意
    • Uncaught TypeError: Illegal invocation(…)
// Example
(function() {
  var _log = console.log;
  try {
    log.call(console, 'call');
    log.apply(console, ['apply']);
    log.bind(console)('bind')
    log('normal'); // Error
  } catch (_e) {
    console.error(_e);
  }
})();

まとめ

  • Herokuで建てるの楽しい
    • mongolab最高!
  • Express楽しい
    • passportが凄い
  • キャラクタ可愛い
  • セーブ共有できたのでやりまくれるね!