D&B Part1『脱出』技術的なメモ

制作ノートでは軽く触れただけのデータ送受信について、忘れないように記録を残しておく。

制作ノート 

データ送受信

今までの作品はJavascriptのみで作られていた。つまりクライアント側のみで動作するプログラムであり、サーバーにデータを送信したり、サーバーからデータを受信したりする処理は無かった。

今回、タイムアタックをゲーム性のメインに持ってきたかったので、タイムスコアをサーバーに送信して蓄積し、ランキングを受信して表示する事が必要になった。

真面目にサーバー環境を構築するという選択肢もあったのだが、試しにGoogleスプレッドシートにデータを送信して蓄積し、Googleスプレッドシート側でランキング集計用シートを作成し、受診時はシートの内容を取得するだけというシンプルな構成を作ってみた。

GoogleスプレッドシートにはQUERY関数というデータベースを操作するSQLのSELECT文のような関数が存在するので、集計用のシートを作成してランキングデータを表示するのは実に簡単だった。

データ蓄積用のシートをQUERY関数で参照するだけでランキング集計済みのシートが出来上がるのでApps Scriptでシートを取得して戻せばJavascript側で簡単に表示できる。

しかし、実は実装に苦労した。

Javascriptはブラウザのコンソールを見ていればエラーの原因がわかるのだけど、Apps Scirpt側でのエラーはコンソール上ではわからないのでブラックボックスのようになってしまう。

まぁこれはPostmanを利用することでAPI(Apps Scirpt)側のエラーがわかるようになって解決したのだけど、気づくまではけっこう大変だった。

(ブラウザのコンソールではApps Scirpt側のエラーは全てCORSエラーとして表示される。しかし、実際は返答がないだけでCORSエラーではない。ChatGPTやGeminiにエラーを分析させてもてんで見当違いな改善策が提示されるが、それはCORSエラーを改善しようとする内容だからであり、実際にはCORSエラーではないのだから解決しないのは当然であった)

それと、今回タイムスコアの送信とランキングの受信のみなので大きな問題は発生していないけども、Apps Scirptからスプレッドシートへのアクセスにはタイムラグが結構ある。

これはデータ量が極わずかでも必ず2,3秒待たされるので、リアルタイム性が必要な情報のやり取りには向かない。

このタイムラグが気になって、スプレッドシートではなく、Googleドライブにcsvを出力したり、csvを読み取って配列に取り込む処理に作り変えようかと検証も行ったが、csvの操作に切り替えても同様にタイムラグは発生した。むしろcsvの方が動作が遅いように思えたのでスプレッドシートに記録する仕様のままとした。

応答の遅さやデータ量の制限があるのでスプレッドシートとApps Scirptでのサーバー環境構築を利用するべき状況は限られるだろう。

一方、メリットとしては

  • サーバー環境の構築が不要
  • Apps ScirptはJavascriptなので学習コストがほぼ無い
  • スプレッドシートには便利なQUERY関数があり集計が容易
  • スプレッドシートは誰でも簡単に操作でき、視覚的に確認が出来る
  • 無料

60分の1秒で描画

多分全然ピンとこない話で、60分の1秒で画面を描画させるために一つの工夫が必要だった。
それは通路とキャラの大きさを48ピクセルに統一する事。
Canvasのサイズがデバイスに対して100%(モバイル)なので実際のピクセルと一致するわけではないのだけど、Canvas上のピクセルサイズとしては48に統一している。
ちなみにドット絵は倍の96ピクセルで作成している。

例えば50ピクセルを10ピクセルずつ動かすとあまりスムーズに動かない。
もっと細かく割って動かす必要がある。
だが、50という数字は1,2,5,10,25,50で割れるが、それ以外の数字では割れない。
16ミリ秒(60分の1秒)毎に動かす場合、3ピクセル動かすのが丁度よい感じだと気がついていたのだけど、50は3で割れないので3ピクセル毎に動かすと余りの2ピクセル分がカクっとして動きがみっともなくなる。
それで48ピクセルに統一すると3ピクセル毎に16ミリ秒で動かして丁度よい感じになる。
48ピクセルなら33ミリ秒(30分の1秒)毎に動かすのも簡単で、実に使い勝手が良い。



コメント

このブログの人気の投稿

Googleスプレッドシートの正規表現置換で改行文字

名作と定評のあるスーパーファミコンの『ザ・モノポリーゲーム2』を今更ながら遊んでみた

Googleスプレッドシートのimportxml関数をhtmlに使う