せっかく最近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でアクションゲームはあんまりお勧めしません!