Google Maps API for Flashで「ドラゴンクエスト 竜王の冒険」

カスタムマップ用クラス

カスタムマップ用に作ったクラスはこんな感じ。一応、256(==normalMapType.getTileSize())の倍数の画像なら何でもOKの予定。

ActionScript

  1. package org.tarotaro.flash.gmap
  2. {
  3.     import com.google.maps.Copyright;
  4.     import com.google.maps.CopyrightCollection;
  5.     import com.google.maps.LatLng;
  6.     import com.google.maps.LatLngBounds;
  7.     import flash.display.Bitmap;
  8.     import flash.display.BitmapData;
  9.     import flash.display.Sprite;
  10.     import flash.geom.Point;
  11.     import com.google.maps.TileLayerBase;
  12.     import flash.display.DisplayObject;
  13.     import flash.geom.Rectangle;
  14.  
  15.     /**
  16.     * BitmapDataを使用するTileLayer
  17.     * @author 太郎
  18.     */
  19.     public class BitmapTileLayer extends TileLayerBase
  20.     {
  21.         private var _bitmap:Bitmap;
  22.         private var _tileSize:Number;
  23.  
  24.         public function BitmapTileLayer(bitmap:Bitmap, tileSize:Number)
  25.         {
  26.             var copyrightCollection:CopyrightCollection = new CopyrightCollection();
  27.             super(copyrightCollection, 14, 20);
  28.  
  29.             //画像を設定
  30.             this.bitmap = bitmap;
  31.            
  32.             //タイル1枚のサイズを設定
  33.             this._tileSize = tileSize;
  34.  
  35.             //著作権表示
  36.             copyrightCollection.addCopyright(
  37.                 new Copyright("dq2map",
  38.                               new LatLngBounds(new LatLng(-180, 90),
  39.                                                new LatLng(180, -90)),
  40.                               0,
  41.                               "<a href='http://ff3.csidenet.com/'>XB-LIM @ Pledge of BAHAMUT</a>"));
  42.         }
  43.        
  44.         override public function loadTile(tilePos:Point, zoom:Number):DisplayObject
  45.         {
  46.             var tileBitmap:BitmapData = new BitmapData(this._tileSize, this._tileSize);
  47.             var tileRect:Rectangle = new Rectangle(
  48.                                         (tilePos.x % this.numberOfTiles) * this._tileSize,
  49.                                         (tilePos.y % this.numberOfTiles) * this._tileSize,
  50.                                         this._tileSize,
  51.                                         this._tileSize
  52.                                     );
  53.             tileBitmap.copyPixels(this._bitmap.bitmapData, tileRect, new Point(0, 0));
  54.             return new Bitmap(tileBitmap);
  55.         }
  56.        
  57.         /**
  58.          * 地図画像を設定
  59.          */
  60.         public function set bitmap(value:Bitmap):void
  61.         {
  62.             if (value.width != value.height) {
  63.                 throw new ArgumentError("画像の幅と高さは一致している必要があります。");
  64.             }
  65.             this._bitmap = value;
  66.         }
  67.        
  68.         /**
  69.          * 縦もしくは横のタイル枚数
  70.          */
  71.         private function get numberOfTiles():Number
  72.         {
  73.             return Math.ceil(this._bitmap.width / this._tileSize);
  74.         }
  75.        
  76.     }
  77.    
  78. }

カスタムマップ利用コード

で、以下をMapEvent.MAP_READYのイベントハンドラに埋め込んだら、上手いこと動いた。

ActionScript

  1. var normalMapType:IMapType = MapType.NORMAL_MAP_TYPE;
  2. var tileLayers:Array = new Array();
  3. var mapBitmap:Bitmap = new MapData() as Bitmap;
  4.  
  5. tileLayers.push(new BitmapTileLayer(mapBitmap,normalMapType.getTileSize()));
  6. var dqMapType:IMapType = new MapType(tileLayers,normalMapType.getProjection(),"Dragon Quest");
  7. addMapType(dqMapType);
  8. setMapType(dqMapType);

今後も、カスタムマップについては要調査。
まず、Bitmapを拡大縮小出来るようにならないと、ズームイン/ズームアウトが実装できない気がする。
例えば、BitmapTileLayer#loadTileのズームの値として、基準よりズームインする場合は画像を2倍にして返すとか出来ないと。
ちなみに、こんな感じで2倍に広げたSprite返しても真っ白になるだけだった。

ActionScript

  1. //loadTileのreturn new Bitmap(tileBitmap);の代わりに以下のコードを挿入
  2. var tile:Sprite = new Sprite();
  3. tile.graphics.beginBitmapFill(new Bitmap(tileBitmap).bitmapData, null, false, true);
  4. tile.graphics.drawRect(0, 0, tileBitmap.width, tileBitmap.height);
  5. tile.graphics.endFill();
  6. tile.scaleX *= 2;
  7. tile.scaleY *= 2;
  8.  
  9. return tile;

なので、直接Bitmapクラスを拡大縮小できないと話にならないと思われる。誰かやり方知りません?

タイトルとURLをコピーしました