Google Maps APIでシューティング作ろうとして挫折

せっかく最近ECMAScript触っているので、前にヨタで言っていた、Google Maps APIスクランブルフォーメーション(id:ABA:20050711#p1)をやってみようと思って、挫折。やっぱきつい。まあもともとこんな使い方をするためのものじゃないから、当たり前といえば当たり前。

一応途中まであがいた跡がこれ。ビットマップはゲーム製作技術板/シューティングゲーム製作技術総合スレの素材を利用させてもらっている。

重すぎる。フレームレートもばたつきすぎ。やっぱりスプライトをマップ上のマーカーで代用するのに無理がありすぎた。

単に挫折だけだともったいないので、作っている最中に分かったことを適当に書いておこう。Google Maps APIでアクションゲームを作るときの参考にどうぞ。

  • 継続的な画面スクロール

GMapのcenterAtLatLngもしくはrecenterOrPanToLatLngを定期的に呼び出すことで実現できる。

ただこの両者、微妙に挙動が違って、centerAtLatLngはマーカーのリフレッシュを積極的に行うためか、若干重い。逆にrecenterOrPanToLatLngはマーカーをリフレッシュしないため、後で説明するマーカーのredrawを明示的に行う必要がある。あとrecenterOrPanToLatLngはそれ自体にスムーススクロール機能が付いているので、連続で呼び出すとスクロールが若干ぬるぬるする。

あとInfoWindowはスクロール制御を強引に持っていってしまうので使い勝手が悪い。

  • スプライト相当の機能

GMarkerを駆使することでなんとか実現可能。マーカーを移動させるには、

  marker.point.x += 0.00005;
  marker.redraw(true);

という風に、redrawを呼ぶ必要がある。ただし上にも書いたように、継続的なスクロールをcenterAtLatLngで行っている場合はredraw不要。

  • マーカーのアニメーション

markerのiconを変更するだけでは、redrawしても反映されない。以下のようなコードが必要。

  marker.remove();
  marker.icon = newIcon;
  marker.initialize(map)
  marker.redraw(true);

mapはGMapインスタンス。非公開API使いまくりの上重いので、あまり多用すべきではない。

だいたいこんなところ。マーカーを駆使して無茶するよりも、スプライトは自力で別管理した方が多分正解だね。面白みに欠けるが。

結論。Google Maps APIでアクションゲームはあんまりお勧めしません!