root/lang/actionscript/metro-map/Viewer.as @ 7049

Revision 7049, 8.0 kB (checked in by gyuque, 5 years ago)

metro-map: show Google Maps tiles.

Line 
1package
2{
3        import flash.display.*;
4        import flash.text.*;
5        import flash.events.*;
6        import flash.net.URLRequest;
7        import flash.geom.*;
8        import mkmap.*;
9
10        public class Viewer extends MovieClip
11        {
12                private var mCanvas:MCanvas;
13                private var mTextInput:TextField;
14                private var romkan:RomkanMiniAS = new RomkanMiniAS();
15                private var mSearch:RomSearch;
16                private var mSelectedStation:StationData;
17                private var mShowingStation:StationData;
18                private var mStData:StationSampleData = new StationSampleData();
19               
20                private var mOut:TextField;
21                private var mLabelPool:Object;
22                private var mLineList:Array;
23               
24                private var mMapLayer:GMapLayer;
25               
26                private var mDarkScreen:Sprite;
27                private var mDarkCount:int;
28                private var mDarkDir:int;
29                private var mDarkTransform:ColorTransform = new ColorTransform(0.3, 0.3, 0.3, 1);
30                private var mNoTransform:ColorTransform = new ColorTransform();
31               
32                private const DARK_IN:int = 1;
33                private const DARK_OUT:int = -1;
34               
35                private var mCanvasZoom:ZoomController;
36                private var mClearDelayed:int = 0;
37                private var mPrevInputLength:int = 0;
38
39               
40                private var mArrowPool:SpritePool;
41                private var mMapFade:FadeController;
42                private var mMapArrowFade:FadeController;
43                               
44                function Viewer()
45                {
46                        mSelectedStation = null;
47               
48                        mDarkScreen = createDarkScreen();
49                        mDarkScreen.alpha = 0;
50                        mDarkCount = 0;
51                        mDarkDir = 0;
52                        addChild(mDarkScreen);
53
54                        stage.align = StageAlign.TOP_LEFT;
55                        stage.scaleMode = StageScaleMode.NO_SCALE;
56                       
57                        var fmt:TextFormat = new TextFormat();
58                        fmt.size = 16;
59                       
60                        mOut = new TextField();
61                        mOut.y = 100;
62                        mOut.width = 300;
63                        mOut.height = 300;
64                        addChild(mOut);
65                        setupData();
66                       
67                        var icon:Loader = new Loader();
68                        var url:String = "lens.png";
69                        var urlReq:URLRequest = new URLRequest(url);
70                        icon.load(urlReq);
71                       
72                       
73                        mTextInput = new TextField();
74                        mTextInput.defaultTextFormat = fmt;
75                        mTextInput.type = TextFieldType.INPUT;
76                        mTextInput.border = true;
77                        mTextInput.borderColor = 0xa0afcc;
78                        mTextInput.background = true;
79                        mTextInput.backgroundColor = 0xffffff;
80                        mTextInput.x = 36;
81                        mTextInput.y = 9;
82                        mTextInput.height = 24;
83                        mTextInput.width = 200;
84                        mTextInput.addEventListener(Event.CHANGE, onSearchBoxChanged);
85                        mTextInput.addEventListener(KeyboardEvent.KEY_DOWN, onSearchBoxKeyDown);
86                       
87                        mCanvas = new MCanvas(900, 500, false, false);
88                        mCanvas.x = 48;
89                        mCanvas.y = 24;
90                        mCanvas.cacheAsBitmap = true;
91                        addChild(mCanvas);
92                        mCanvas.objectAdded = onCanvasObjectAdded;
93                       
94                        mLabelPool = {};
95                        mLineList = [];
96                        mCanvas.deserializeXML(ViewerSampleData.data);
97                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
98
99                        mCanvasZoom = new ZoomController(mCanvas, 48, 24, 852/2, 476/2);
100
101                        mMapLayer = new GMapLayer(5, 3, 450, 250);
102                        mMapFade = new FadeController(mMapLayer, 6, false, -1, 9);
103                        addChild(mMapLayer);
104                        var map_arr:Sprite = makeArrowSprite();
105                        addChild(map_arr);
106                        map_arr.x = 450;
107                        map_arr.y = 250;
108                        map_arr.scaleX = 3;
109                        map_arr.scaleY = 3;
110                        mMapArrowFade = new FadeController(map_arr, 6, false, -1, 11);
111                       
112                        mArrowPool = new SpritePool();
113                        for (var i:int = 0;i < 10;i++)
114                        {
115                                var arr:Sprite = makeArrowSprite();
116                                arr.addEventListener(MouseEvent.CLICK, onArrowClick);
117                                arr.buttonMode = true;
118                                mCanvas.addChild(arr);
119                                mArrowPool.add(arr);
120                        }
121
122                        addChild(icon);                 
123                        addChild(mTextInput);
124                }
125               
126                private function onArrowClick(e:MouseEvent):void
127                {
128                       
129                }
130               
131                private function onEnterFrame(event:Event):void
132                {
133                        if (mSelectedStation == null)
134                        {
135                                        mMapFade.dir = -1;
136                                        mMapArrowFade.dir = -1;
137                        }
138                       
139                        if (mDarkDir != 0)
140                        {
141                                mDarkCount += mDarkDir;
142                                if (mDarkCount > 5)
143                                {
144                                        mDarkCount = 5;
145                                        mDarkDir = 0;
146                                        if (mSelectedStation != null)
147                                        {
148                                                mMapFade.dir = 1;
149                                                mMapArrowFade.dir = 1;
150                                        }
151                                }
152
153                                if (mDarkCount < 0)
154                                {
155                                        mDarkCount = 0;
156                                        mDarkDir = 0;
157                                }
158                               
159                                mDarkScreen.alpha = Number(mDarkCount) * 0.14;
160                        }
161                       
162                        if (mClearDelayed > 0)
163                        {
164                                if (--mClearDelayed < 1)
165                                {
166                                        highlightStationList(null);                                     
167                                }
168                        }
169                }
170                               
171                private function createDarkScreen():Sprite
172                {
173                        var s:Sprite = new Sprite();
174                        var g:Graphics = s.graphics;
175                        g.lineStyle();
176                        g.beginFill(0, 1);
177                        g.drawRect(0, 0, 900, 500);
178                        g.endFill();
179                       
180                        return s;                       
181                }
182               
183                private function onCanvasObjectAdded(obj:CanvasObject):void
184                {
185                        Sprite(obj).cacheAsBitmap = true;
186                        if (obj is MTitleBox)
187                        {
188                                var name:String = MTitleBox(obj).title;
189                                mLabelPool[name] = obj;
190                        }
191                        else if (obj is PolyLine)
192                        {
193                                var p:PolyLine = PolyLine(obj);
194                                if (p.title)
195                                {
196                                        mLineList.push({polyline: p, flag: StationData.lineSymbolToFlag(p.title)});
197                                }
198                        }
199                }
200               
201                private function setupData():void
202                {
203                        var len:int = mStData.data.length;
204                        var i:int;
205                        mSearch = new RomSearch();
206                        for (i = 0;i < len;i++)
207                        {
208                                var st:StationData = mStData.data[i];
209                                mSearch.push(st.name, st.kana, st);
210                        }
211                       
212
213                }
214               
215                private function onSearchBoxKeyDown(e:KeyboardEvent):void
216                {
217                        mSelectedStation = null;
218                        if (e.keyCode == 27)
219                        {
220                                if (mTextInput.text != "")
221                                {
222                                        mTextInput.text = "";
223                                        onSearchBoxChanged(null);
224                                }
225                        }
226                }
227               
228                private function onSearchBoxChanged(e:Event):void
229                {
230                        mOut.text = "";
231                        var res:Array = mSearch.search(romkan.to_kana(mTextInput.text));
232                       
233                       
234                        var curLen:int = mTextInput.text.length;
235                       
236                        if (res == null && curLen > mPrevInputLength)
237                                mClearDelayed = 6;
238                        else
239                                highlightStationList(res);
240                               
241                        mPrevInputLength = curLen;
242                }
243               
244                private function showMap():void
245                {
246                        if (mSelectedStation == null || mShowingStation == mSelectedStation)
247                                return;
248                       
249                        mShowingStation = mSelectedStation;
250                        mMapLayer.showAround(mSelectedStation.lat, mSelectedStation.lng);
251                }
252               
253                private function highlightStationList(stations:Array):void
254                {
255                        var poslist:Array = null;
256
257                        if (stations != null)
258                        {
259                                mDarkDir = DARK_IN;
260
261                                if (stations.length <= 10)
262                                        poslist = [];
263                        }
264                        else
265                                mDarkDir = DARK_OUT;
266               
267                       
268                        mClearDelayed = 0;
269                        var o:Object;
270                        var toHighlight:Object = {};
271                        var hit_lines:uint = 0;
272                        if (stations != null)
273                                for each(o in stations)
274                        {
275                                var st:StationData = StationData(o);
276                                toHighlight[st.name] = st;
277                                hit_lines |= st.line_flag;
278                        }
279
280                        for each(o in mLabelPool)
281                        {
282                                var label:MTitleBox = MTitleBox(o);
283                                if (toHighlight[label.title] || stations == null)
284                                {
285                                        if (poslist != null)
286                                        {
287                                                poslist.push(label.x);
288                                                poslist.push(label.y + label.top);
289                                        }
290                                        label.transform.colorTransform = mNoTransform;
291                                        label.showDotLabel(true);
292                                }
293                                else
294                                {
295                                        label.transform.colorTransform = mDarkTransform;
296                                        label.showDotLabel(false);
297                                }
298                        }
299                       
300                        if (stations == null)
301                                hit_lines = 0xffff;
302                       
303                        if (poslist != null && poslist.length == 2)
304                        {
305                                mSelectedStation = StationData(stations[0]);
306                                mCanvasZoom.pointZoom(poslist[0]+24, poslist[1]+12, 1);
307                                showMap();
308                        }
309                        else
310                                mCanvasZoom.center();
311                       
312                        for each(o in mLineList)
313                        {
314                                var p:PolyLine = PolyLine(o.polyline);
315                                var flg:uint = uint(o.flag);
316                                p.transform.colorTransform = ((flg & hit_lines) != 0) ? mNoTransform : mDarkTransform;
317                        }
318                       
319                        mArrowPool.show_bulk(poslist);
320                }
321               
322                private function makeArrowSprite():Sprite
323                {
324                        var s:Sprite = new Sprite();
325                        var g:Graphics = s.graphics;
326                       
327                        g.lineStyle(2, 0, 0.8);
328                        g.moveTo(0,0);
329                        g.lineTo(-10,-10);
330                        g.lineTo(-5,-10);
331                        g.lineTo(-5,-20);
332                        g.lineTo( 5,-20);
333                        g.lineTo( 5,-10);
334                        g.lineTo(10,-10);
335                        g.lineTo(0,0);
336                       
337                        g.lineStyle(1, 0xffdd66);
338                        g.beginFill(0xff8822);
339                        g.moveTo(0,0);
340                        g.lineTo(-10,-10);
341                        g.lineTo(-5,-10);
342                        g.lineTo(-5,-20);
343                        g.lineTo( 5,-20);
344                        g.lineTo( 5,-10);
345                        g.lineTo(10,-10);
346                        g.lineTo(0,0);
347                        g.endFill();
348                       
349                        return s;
350                }
351        }
352}
Note: See TracBrowser for help on using the browser.