<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>愚人呓语 &#187; actionscript</title>
	<atom:link href="http://eidiot.net/tag/actionscript/feed/" rel="self" type="application/rss+xml" />
	<link>http://eidiot.net</link>
	<description>eidiot&#039;s blog. My flapdoodles.</description>
	<lastBuildDate>Fri, 16 Dec 2011 15:53:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>一小段 signals 测试代码</title>
		<link>http://eidiot.net/2011/05/10/a-small-piece-of-signals-test-code/</link>
		<comments>http://eidiot.net/2011/05/10/a-small-piece-of-signals-test-code/#comments</comments>
		<pubDate>Tue, 10 May 2011 07:15:03 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[as3-signals]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=568</guid>
		<description><![CDATA[在自己的项目里进一步完善了 signals, 目前已全面替代了自定义事件并整合进 Robotlegs，写起代码来更舒服了。 assertEquals&#40;575, instance.getCount&#40;&#34;foo&#34;&#41;&#41;; handleSignal&#40;this, instance.countChanged, function&#40;signal:ValueChangedSignal&#41;:void &#123; assertEquals&#40;&#34;foo&#34;, signal.key&#41;; assertEquals&#40;500, signal.value&#41;; assertEquals&#40;575, signal.old&#41;; assertEquals&#40;500, signal.target.getCount&#40;&#34;foo&#34;&#41;&#41;; &#125;&#41;; instance.setCount&#40;&#34;foo&#34;, 500&#41;;]]></description>
			<content:encoded><![CDATA[<p>在自己的项目里进一步完善了 signals, 目前已全面替代了自定义事件并整合进 Robotlegs，写起代码来更舒服了。</p>

<div class="wp_codebox"><table><tr id="p5682"><td class="code" id="p568code2"><pre class="actionscript" style="font-family:monospace;">assertEquals<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">575</span>, instance.<span style="color: #0066CC;">getCount</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;foo&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; 
handleSignal<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, instance.<span style="color: #006600;">countChanged</span>, <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>signal:ValueChangedSignal<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
  assertEquals<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;foo&quot;</span>, signal.<span style="color: #0066CC;">key</span><span style="color: #66cc66;">&#41;</span>; 
  assertEquals<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">500</span>, signal.<span style="color: #006600;">value</span><span style="color: #66cc66;">&#41;</span>; 
  assertEquals<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">575</span>, signal.<span style="color: #006600;">old</span><span style="color: #66cc66;">&#41;</span>;
  assertEquals<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">500</span>, signal.<span style="color: #0066CC;">target</span>.<span style="color: #0066CC;">getCount</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;foo&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; 
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>; 
instance.<span style="color: #006600;">setCount</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;foo&quot;</span>, <span style="color: #cc66cc;">500</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2011/05/10/a-small-piece-of-signals-test-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AS3]下雪系统类SnowSystem</title>
		<link>http://eidiot.net/2008/01/28/as3-snow-class-snowsystem/</link>
		<comments>http://eidiot.net/2008/01/28/as3-snow-class-snowsystem/#comments</comments>
		<pubDate>Mon, 28 Jan 2008 12:54:56 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[雪]]></category>

		<guid isPermaLink="false">http://eidiot.net/2008/01/28/as3-snow-class-snowsystem/</guid>
		<description><![CDATA[Demo &#124; 效果演示 SnowSystem Class Code &#124; 类代码 Demo Code &#124; 演示代码 Source Download &#124; 源文件下载 API Documentation &#124; 编程接口文档 　　如果使用默认效果，只需要在构造时指定宽高： addChild(new SnowSystem(640, 480)); 　　如要使用自己的雪花，可以在 构造函数 里传入或使用 setSkin 方法： var ss:SnowSystem = new SnowSystem(640, 480, MySnowflake, false);ss.setSkin(MySnowflake); 　　如果需要更多定制，请使用 文档 中的其它 设置方法： var ss:SnowSystem = new SnowSystem(640, 480, null, false);ss.setSpawnRate(5);ss.setSize(5, 10);ss.setYV(2, 7);ss.start();]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://eidiot.net/2008/01/27/snow-and-flower/" target="_blank" class="liinternal">Demo | 效果演示</a></li>
<li><a href="http://eidiot.net/code/snow/code/source/net/eidiot/particles/SnowSystem.as.html" target="_blank" class="liinternal">SnowSystem Class Code | 类代码</a></li>
<li><a href="http://eidiot.net/code/snow/code/" target="_blank" class="liinternal">Demo Code | 演示代码</a></li>
<li><a href="http://eidiot.net/code/snow/code/SnowPic.zip" target="_blank" class="liinternal">Source Download | 源文件下载</a></li>
<li><a href="http://eidiot.net/code/snow/doc/net/eidiot/particles/SnowSystem.html" target="_blank" class="liinternal">API Documentation | 编程接口文档</a></li>
</ul>
<p>　　如果使用默认效果，只需要在构造时指定宽高：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">addChild</span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">SnowSystem</span><span style="color: Olive;">(</span><span style="color: Maroon;">640</span><span style="color: Gray;">, </span><span style="color: Maroon;">480</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></div></div>
<p>　　如要使用自己的雪花，可以在 <a href="http://eidiot.net/code/snow/doc/net/eidiot/particles/SnowSystem.html#SnowSystem()" target="_blank" class="liinternal">构造函数</a> 里传入或使用 <a href="http://eidiot.net/code/snow/doc/net/eidiot/particles/SnowSystem.html#setSkin()" target="_blank" class="liinternal">setSkin 方法</a>：<br />
<span id="more-475"></span>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">ss</span><span style="color: Gray;">:</span><span style="color: Blue;">SnowSystem</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">SnowSystem</span><span style="color: Olive;">(</span><span style="color: Maroon;">640</span><span style="color: Gray;">, </span><span style="color: Maroon;">480</span><span style="color: Gray;">, </span><span style="color: Blue;">MySnowflake</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">ss</span><span style="color: Gray;">.</span><span style="color: Blue;">setSkin</span><span style="color: Olive;">(</span><span style="color: Blue;">MySnowflake</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>　　如果需要更多定制，请使用 <a href="http://eidiot.net/code/snow/doc/net/eidiot/particles/SnowSystem.html" target="_blank" class="liinternal">文档</a> 中的其它 <a href="http://eidiot.net/code/snow/doc/net/eidiot/particles/SnowSystem.html#methodSummary" target="_blank" class="liinternal">设置方法</a>：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">ss</span><span style="color: Gray;">:</span><span style="color: Blue;">SnowSystem</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">SnowSystem</span><span style="color: Olive;">(</span><span style="color: Maroon;">640</span><span style="color: Gray;">, </span><span style="color: Maroon;">480</span><span style="color: Gray;">, </span><span style="color: Green;">null</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">ss</span><span style="color: Gray;">.</span><span style="color: Blue;">setSpawnRate</span><span style="color: Olive;">(</span><span style="color: Maroon;">5</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">ss</span><span style="color: Gray;">.</span><span style="color: Blue;">setSize</span><span style="color: Olive;">(</span><span style="color: Maroon;">5</span><span style="color: Gray;">, </span><span style="color: Maroon;">10</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">ss</span><span style="color: Gray;">.</span><span style="color: Blue;">setYV</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;">, </span><span style="color: Maroon;">7</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">ss</span><span style="color: Gray;">.</span><span style="color: Blue;">start</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2008/01/28/as3-snow-class-snowsystem/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>AS3制作SWF播放器</title>
		<link>http://eidiot.net/2007/06/16/swf-player/</link>
		<comments>http://eidiot.net/2007/06/16/swf-player/#comments</comments>
		<pubDate>Sat, 16 Jun 2007 13:32:31 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=450</guid>
		<description><![CDATA[　　AS3的 LoaderInfo 类为我们加载外部资源提供了更多的可控信息，以前制作SWF播放器的两大难题终于可以得到解决： 获得加载SWF的舞台大小以缩放到适合尺寸显示 LoaderInfo 的 width 和 height 属性便是舞台大小。 使加载的SWF按自己的帧频播放 LoaderInfo 的 frameRate 属性为加载SWF的帧频，可以修改Stage的 frameRate 属性适应播放。 　　做了一个 简单的例子 ，分别加载300×150帧频5和100×150帧频20的两个swf到200×200大小的区域播放，注释写的很详细，就不啰嗦了。 监听加载事件： var t_info : LoaderInfo = this.m_loader.contentLoaderInfo;t_info.addEventListener(Event.COMPLETE, this.onLoadDone);t_info.addEventListener(IOErrorEvent.IO_ERROR, this.onLoadError);t_info.addEventListener(ProgressEvent.PROGRESS, this.onLoadProgress); 显示加载进度： private function onLoadProgress(p_e : ProgressEvent) : void{&#160;&#160; &#160;this.m_loading.progress(p_e.bytesLoaded, p_e.bytesTotal);} 显示加载的SWF： // 隐藏loadingthis.m_loading.hide();// loaderInfovar t_info : LoaderInfo = this.m_loader.contentLoaderInfo;// 载入的MCthis.m_mc = t_info.content as MovieClip;// 载入MC的舞台宽度var [...]]]></description>
			<content:encoded><![CDATA[<p>　　AS3的 LoaderInfo 类为我们加载外部资源提供了更多的可控信息，以前制作SWF播放器的两大难题终于可以得到解决：</p>
<ul>
<li>
<strong>获得加载SWF的舞台大小以缩放到适合尺寸显示</strong><br />
LoaderInfo 的 width 和 height 属性便是舞台大小。
	</li>
<li>
<strong>使加载的SWF按自己的帧频播放</strong><br />
LoaderInfo 的 frameRate 属性为加载SWF的帧频，可以修改Stage的 frameRate 属性适应播放。
	</li>
</ul>
<p>　　做了一个 <a href="http://eidiot.net/lessons/swfplayer/demo/" target="_blank" class="liinternal">简单的例子</a> ，分别加载300×150帧频5和100×150帧频20的两个swf到200×200大小的区域播放，注释写的很详细，就不啰嗦了。<br />
<span id="more-450"></span>监听加载事件：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">t_info</span><span style="color: Gray;"> : </span><span style="color: Blue;">LoaderInfo</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_loader</span><span style="color: Gray;">.</span><span style="color: Blue;">contentLoaderInfo</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">t_info</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">Event</span><span style="color: Gray;">.</span><span style="color: Blue;">COMPLETE</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">onLoadDone</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">t_info</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">IOErrorEvent</span><span style="color: Gray;">.</span><span style="color: Blue;">IO_ERROR</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">onLoadError</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">t_info</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">ProgressEvent</span><span style="color: Gray;">.</span><span style="color: Blue;">PROGRESS</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">onLoadProgress</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>显示加载进度：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">onLoadProgress</span><span style="color: Olive;">(</span><span style="color: Blue;">p_e</span><span style="color: Gray;"> : </span><span style="color: Blue;">ProgressEvent</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_loading</span><span style="color: Gray;">.</span><span style="color: Blue;">progress</span><span style="color: Olive;">(</span><span style="color: Blue;">p_e</span><span style="color: Gray;">.</span><span style="color: Blue;">bytesLoaded</span><span style="color: Gray;">, </span><span style="color: Blue;">p_e</span><span style="color: Gray;">.</span><span style="color: Blue;">bytesTotal</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>显示加载的SWF：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">// 隐藏loading</span><span style="color: Gray;"><br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_loading</span><span style="color: Gray;">.</span><span style="color: Blue;">hide</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// loaderInfo</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">t_info</span><span style="color: Gray;"> : </span><span style="color: Blue;">LoaderInfo</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_loader</span><span style="color: Gray;">.</span><span style="color: Blue;">contentLoaderInfo</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 载入的MC</span><span style="color: Gray;"><br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;"> = </span><span style="color: Blue;">t_info</span><span style="color: Gray;">.</span><span style="color: Blue;">content</span><span style="color: Gray;"> </span><span style="color: Blue;">as</span><span style="color: Gray;"> </span><span style="color: Blue;">MovieClip</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 载入MC的舞台宽度</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">t_stageW</span><span style="color: Gray;"> : </span><span style="color: Blue;">Number</span><span style="color: Gray;"> = </span><span style="color: Blue;">t_info</span><span style="color: Gray;">.</span><span style="color: Blue;">width</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 载入MC的舞台高度</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">t_stageH</span><span style="color: Gray;"> : </span><span style="color: Blue;">Number</span><span style="color: Gray;"> = </span><span style="color: Blue;">t_info</span><span style="color: Gray;">.</span><span style="color: Blue;">height</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 载入MC的实际宽度</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">t_mcW</span><span style="color: Gray;"> : </span><span style="color: Blue;">Number</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">width</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 载入MC的实际高度</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">t_mcH</span><span style="color: Gray;"> : </span><span style="color: Blue;">Number</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">height</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 是否缩放MC适应显示宽度(载入MC舞台的宽高比是否大于显示区域宽高比)</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">t_scaleWidth</span><span style="color: Gray;"> : </span><span style="color: Blue;">Boolean</span><span style="color: Gray;"> = </span><span style="color: Blue;">t_stageW</span><span style="color: Gray;"> </span><span style="color: #8b0000;">/</span><span style="color: Red;"> t_stageH &gt; SHOW_W </span><span style="color: #8b0000;">/</span><span style="color: Gray;"> </span><span style="color: Blue;">SHOW_H</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 缩放比率</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">t_scaleRate</span><span style="color: Gray;"> : </span><span style="color: Blue;">Number</span><span style="color: Gray;"> = </span><span style="color: Blue;">t_scaleWidth</span><span style="color: Gray;"> ? </span><span style="color: Blue;">SHOW_W</span><span style="color: Gray;"> </span><span style="color: #8b0000;">/</span><span style="color: Red;"> t_stageW : SHOW_H </span><span style="color: #8b0000;">/</span><span style="color: Gray;"> </span><span style="color: Blue;">t_stageH</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 缩放MC</span><span style="color: Gray;"><br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">scaleX</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">scaleY</span><span style="color: Gray;"> = </span><span style="color: Blue;">t_scaleRate</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 显示载入MC的显示范围</span><span style="color: Gray;"><br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">scrollRect</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Rectangle</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">t_stageW</span><span style="color: Gray;">, </span><span style="color: Blue;">t_stageH</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 显示载入MC</span><span style="color: Gray;"><br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">addChild</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 调整显示位置</span><span style="color: Gray;"><br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">x</span><span style="color: Gray;"> = </span><span style="color: Blue;">SHOW_X</span><span style="color: Gray;">;<br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">y</span><span style="color: Gray;"> = </span><span style="color: Blue;">SHOW_Y</span><span style="color: Gray;">;<br /></span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">t_scaleWidth</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">y</span><span style="color: Gray;"> += </span><span style="color: Olive;">(</span><span style="color: Blue;">SHOW_H</span><span style="color: Gray;"> - </span><span style="color: Blue;">t_stageH</span><span style="color: Gray;"> * </span><span style="color: Blue;">t_scaleRate</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: #8b0000;">/</span><span style="color: Red;"> 2;<br />else this.m_mc.x += (SHOW_W - t_stageW * t_scaleRate) </span><span style="color: #8b0000;">/</span><span style="color: Gray;"> </span><span style="color: Maroon;">2</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 修改帧频</span><span style="color: Gray;"><br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">stage</span><span style="color: Gray;">.</span><span style="color: Blue;">frameRate</span><span style="color: Gray;"> = </span><span style="color: Blue;">t_info</span><span style="color: Gray;">.</span><span style="color: Blue;">frameRate</span><span style="color: Gray;">;<br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">fms</span><span style="color: Gray;">.</span><span style="color: Blue;">text</span><span style="color: Gray;"> = </span><span style="color: Blue;">String</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">stage</span><span style="color: Gray;">.</span><span style="color: Blue;">frameRate</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 设置组件</span><span style="color: Gray;"><br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">sdr</span><span style="color: Gray;">.</span><span style="color: Blue;">enabled</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">btn1</span><span style="color: Gray;">.</span><span style="color: Blue;">enabled</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">btn2</span><span style="color: Gray;">.</span><span style="color: Blue;">enabled</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;<br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">sdr</span><span style="color: Gray;">.</span><span style="color: Blue;">maximum</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">totalFrames</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 监听MC事件</span><span style="color: Gray;"><br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">Event</span><span style="color: Gray;">.</span><span style="color: Blue;">ENTER_FRAME</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">onEnterFrame</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>另外加了一个 Slider 组件来控制播放，前提是加载的swf必须发布为Player9,As3：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">sdr</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">SliderEvent</span><span style="color: Gray;">.</span><span style="color: Blue;">CHANGE</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">onChangeSdr</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">sdr</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">SliderEvent</span><span style="color: Gray;">.</span><span style="color: Blue;">THUMB_PRESS</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">onPressSdr</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">sdr</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">SliderEvent</span><span style="color: Gray;">.</span><span style="color: Blue;">THUMB_RELEASE</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">onReleaseSdr</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">onChangeSdr</span><span style="color: Olive;">(</span><span style="color: Blue;">p_e</span><span style="color: Gray;"> : </span><span style="color: Blue;">SliderEvent</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_isPressSdr</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">gotoAndStop</span><span style="color: Olive;">(</span><span style="color: Blue;">p_e</span><span style="color: Gray;">.</span><span style="color: Blue;">value</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">onPressSdr</span><span style="color: Olive;">(</span><span style="color: Blue;">p_e</span><span style="color: Gray;"> : </span><span style="color: Blue;">SliderEvent</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_isPressSdr</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">stop</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">onReleaseSdr</span><span style="color: Olive;">(</span><span style="color: Blue;">p_e</span><span style="color: Gray;"> : </span><span style="color: Blue;">SliderEvent</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_isPressSdr</span><span style="color: Gray;"> = </span><span style="color: Green;">false</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_mc</span><span style="color: Gray;">.</span><span style="color: Blue;">play</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<div class="download">
<a href="http://eidiot.net/lessons/swfplayer/demo/" target="_blank" class="liinternal">示例演示</a> | <a href="http://eidiot.net/lessons/swfplayer/code/" target="_blank" class="liinternal">源代码</a><br />
<a href="http://eidiot.net/lessons/swfplayer/swfplayer.zip" target="_blank" class="liinternal">下载源文件</a> zip 1267K
</div>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2007/06/16/swf-player/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>AS3应用程序模块化开发与ApplicationDomain</title>
		<link>http://eidiot.net/2007/06/03/applicationdomain/</link>
		<comments>http://eidiot.net/2007/06/03/applicationdomain/#comments</comments>
		<pubDate>Sun, 03 Jun 2007 14:03:15 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=445</guid>
		<description><![CDATA[　　当程序越来越大，我们需要把它拆分成多个swf，在需要的时候动态加载。拆分时应该尽量把不同的类编译进唯一的swf，避免因swf文件增多而使整个程序的文件尺寸增大。按此原则可以拆分出以下两种swf，借助 ApplicationDomain 共享其代码和资源。 模块(Module) 按照程序逻辑，可以拆分出多个“功能模块”，如“注册”、“管理”等等；按照游戏或社区类程序的关卡或场景，可以拆分出不同的“场景模块”。这些模块不是主程序运行必须的，只在需要的时候加载。 运行时共享库(RSL) 主场景或者多个模块通用的资源，比如位图、声音、设计好的页面元素等，可作为“库”在主程序运行前加载。可以整套更换的皮肤(skin)只需先加载一套。 　　ApplicationDomain 是存放AS3定义(包括类、方法、接口等)的容器。使用Loader类加载swf时可以通过指定 ApplicationDomain 参数将swf加载到不同的域(Domain)： var loader : Loader = new Loader();var context : LoaderContext = new LoaderContext();/* 加载到子域(模块) */context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);/* 加载到同域(共享库) */context.applicationDomain = ApplicationDomain.currentDomain;/* 加载到新域(独立运行的程序或模块) */context.applicationDomain = new ApplicationDomain();loader.load(new URLRequest(&#34;loaded.swf&#34;), context); 　　ApplicationDomain使用类似于显示列表(DisplayList)的树形结构。 相对于舞台(Stage) ，可以认为 ApplicationDomain 最根部的是系统域(system domain)，包含 Flash Player 核心类定义。主程序所在的域(以下简称主域)就是它唯一的子域，类似于Stage下的文档类(Document Class)。 　　一个fla文档类里代码： this.stage.addChild(mySprite);this.addChild(myMC);this.addChild(myShape); 　　运行后的显示列表： 　　ApplicationDomain 的类似结构： [...]]]></description>
			<content:encoded><![CDATA[<p>　　当程序越来越大，我们需要把它拆分成多个swf，在需要的时候动态加载。拆分时应该尽量把不同的类编译进唯一的swf，避免因swf文件增多而使整个程序的文件尺寸增大。按此原则可以拆分出以下两种swf，借助 ApplicationDomain 共享其代码和资源。</p>
<ul>
<li><strong>模块(Module)</strong><br />
按照程序逻辑，可以拆分出多个“功能模块”，如“注册”、“管理”等等；按照游戏或社区类程序的关卡或场景，可以拆分出不同的“场景模块”。这些模块不是主程序运行必须的，只在需要的时候加载。
	</li>
<li><strong>运行时共享库(RSL)</strong><br />
主场景或者多个模块通用的资源，比如位图、声音、设计好的页面元素等，可作为“库”在主程序运行前加载。可以整套更换的皮肤(skin)只需先加载一套。
	</li>
</ul>
<p><span id="more-445"></span>　　ApplicationDomain 是存放AS3定义(包括类、方法、接口等)的容器。使用Loader类加载swf时可以通过指定 ApplicationDomain 参数将swf加载到不同的域(Domain)：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">loader</span><span style="color: Gray;"> : </span><span style="color: Blue;">Loader</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Loader</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">context</span><span style="color: Gray;"> : </span><span style="color: Blue;">LoaderContext</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">LoaderContext</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/* 加载到子域(模块) */</span><span style="color: Gray;"><br /></span><span style="color: Blue;">context</span><span style="color: Gray;">.</span><span style="color: Blue;">applicationDomain</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">ApplicationDomain</span><span style="color: Olive;">(</span><span style="color: Blue;">ApplicationDomain</span><span style="color: Gray;">.</span><span style="color: Blue;">currentDomain</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/* 加载到同域(共享库) */</span><span style="color: Gray;"><br /></span><span style="color: Blue;">context</span><span style="color: Gray;">.</span><span style="color: Blue;">applicationDomain</span><span style="color: Gray;"> = </span><span style="color: Blue;">ApplicationDomain</span><span style="color: Gray;">.</span><span style="color: Blue;">currentDomain</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/* 加载到新域(独立运行的程序或模块) */</span><span style="color: Gray;"><br /></span><span style="color: Blue;">context</span><span style="color: Gray;">.</span><span style="color: Blue;">applicationDomain</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">ApplicationDomain</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">loader</span><span style="color: Gray;">.</span><span style="color: Blue;">load</span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">URLRequest</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">loaded.swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Blue;">context</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>　　ApplicationDomain使用类似于显示列表(DisplayList)的树形结构。 相对于舞台(Stage) ，可以认为 ApplicationDomain 最根部的是系统域(system domain)，包含 Flash Player 核心类定义。主程序所在的域(以下简称主域)就是它唯一的子域，类似于Stage下的文档类(Document Class)。<br />
　　一个fla文档类里代码：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">stage</span><span style="color: Gray;">.</span><span style="color: Blue;">addChild</span><span style="color: Olive;">(</span><span style="color: Blue;">mySprite</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">addChild</span><span style="color: Olive;">(</span><span style="color: Blue;">myMC</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">addChild</span><span style="color: Olive;">(</span><span style="color: Blue;">myShape</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>　　运行后的显示列表：<br />
<img src='http://eidiot.net/wp-content/uploads/2007/06/01.gif' alt='01.gif' /><br />
　　ApplicationDomain 的类似结构：<br />
<img src='http://eidiot.net/wp-content/uploads/2007/06/02.gif' alt='02.gif' /></p>
<ul>
<li><strong>加载到子域(模块)</strong><br />
类似于“继承”，子域可以直接获得父域所有的类定义，反之父域得不到子域的。和继承关系不同的是，如果子域中有和父域同名的类，子域定义会被忽略而使用父域的定义。
	</li>
<li><strong>加载到同域(运行时共享库)</strong><br />
类似集合里的合并关系。被加载swf里的所有类定义被合并到当前域中可以直接使用。和加载到子域相同，和当前域同名的定义也会被忽略。
	</li>
<li><strong>加载到新域(独立运行的程序或模块)</strong><br />
swf载入指定域之前，先要检查该域及其父域中是否存在同名类，重复定义一概忽略。如果加载别人写的程序，或者使用旧版本的主程序加载新版本的模块，为避免类名冲突就要加载到新域独立运行以使用自己的类。
	</li>
</ul>
<p>　　模块加载到同域不是一样可以吗？为何要加载到子域呢？好处就在于，卸载一个加载到子域的模块时，只要确保清除所有到该模块的引用，模块的所有类定义将被垃圾回收(Garbage Collection)。<br />
　　有两种方式可以访问 ApplicationDomain :</p>
<ul>
<li><strong>ApplicationDomain.currentDomain</strong><br />
currentDomain是ApplicationDomain的静态变量，表示<strong>当前代码</strong>所在的域。该变量很奇特，在主程序里指向主域，在加载到子域的模块里则指向该模块所在的子域。虽然 ApplicationDomain 有个 parentDomain 属性，但子域已经自动获得了父域的类定义，所以通过 ApplicationDomain.currentDomain 就可以获取父域定义了——包括主程序和加载到主域的共享库。(注：系统域不可直接访问，主域和所有新域即系统域子域的parentDomain属性为null)
	</li>
<li><strong>LoaderInfo类的applicationDomain属性</strong><br />
此方式可以访问任何方式加载的swf的 ApplicationDomain。对于主程序来说，加载到同域的库定义已经存在于 ApplicationDomain.currentDomain ，而模块的类主程序一般用不到。所以这种方式个人不推荐使用。
	</li>
</ul>
<p>　　ApplicationDomain 的 hasDefinition() 方法判断某定义是否存在，getDefinition() 方法获取指定的定义。下面以一个 <a href="http://eidiot.net/lessons/appdomain/demo/" target="_blank" class="liinternal">例子</a> 来介绍 ApplicationDomain 的具体用法和应用程序的拆分。<br />
　　<a href="http://eidiot.net/lessons/appdomain/demo/" target="_blank" class="liinternal">本例</a> 有四个swf，shell.swf是主程序，lib.swf是共享库，login.swf和result.swf分别是“登录”和“结果”模块，所有的视图元件都在共享库中。实际开发时可能有很多库，比如“位图库”、“音效库”、“模型通用库”等。“通用库”里存放多个模块共用的资源，比如此例中的背景元素。而各个模块独有的资源还是放在各自的swf中。<br />
　　主程序首先将共享库加载到同域，完成后将“登录模块”加载到子域。主程序可以像操作普通的视觉对象(DisplayObject)一样操作加载的模块：监听事件、调用方法。因为编译器不会识别未定义的类，为使用强类型，建议为主类和模型定义相应的接口，使用少量的重复代码协助编程。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">showModule</span><span style="color: Olive;">(</span><span style="color: Blue;">p_module</span><span style="color: Gray;"> : </span><span style="color: Blue;">IModule</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_moduleList</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">login.swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">p_module</span><span style="color: Gray;">.</span><span style="color: Blue;">show</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">p_module</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">login</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">onLogin</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"> </span><span style="color: Green;">else</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">p_module</span><span style="color: Gray;">.</span><span style="color: Blue;">show</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_userName</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span></div></div>
<p>　　模块“继承”了主程序和共享库的所有类和资源，可以通过 ApplicationDomain.currentDomain.getDefinition() 来获取相应的类。注意获取不存在的类会抛出一个 ReferenceError。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">protected</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">getClass</span><span style="color: Olive;">(</span><span style="color: Blue;">p_name</span><span style="color: Gray;"> : </span><span style="color: Blue;">String</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Blue;">Class</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">try</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">ApplicationDomain</span><span style="color: Gray;">.</span><span style="color: Blue;">currentDomain</span><span style="color: Gray;">.</span><span style="color: Blue;">getDefinition</span><span style="color: Olive;">(</span><span style="color: Blue;">p_name</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">as</span><span style="color: Gray;"> </span><span style="color: Blue;">Class</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"> </span><span style="color: Green;">catch</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">p_e</span><span style="color: Gray;"> : </span><span style="color: Blue;">ReferenceError</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">定义 </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">p_name</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> 不存在</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>　　登录模块获取库中的界面元素，并在点击按钮后抛出事件。Event类不允许带参数，必须使用继承Event的自定义事件抛出参数。主程序可以把模块的自定义事件也编译进去(这样就增大了整个程序的文件尺寸)，或者让监听模块事件的函数接受一个Objcet参数，以获取其动态属性。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">onLogin</span><span style="color: Olive;">(</span><span style="color: Blue;">p_e</span><span style="color: Gray;"> : </span><span style="color: Blue;">Object</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_userName</span><span style="color: Gray;"> = </span><span style="color: Blue;">p_e</span><span style="color: Gray;">.</span><span style="color: Blue;">userName</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">login</span><span style="color: Gray;"> : </span><span style="color: Blue;">IModule</span><span style="color: Gray;"> = </span><span style="color: Blue;">p_e</span><span style="color: Gray;">.</span><span style="color: Blue;">currentTarget</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">login</span><span style="color: Gray;">.</span><span style="color: Blue;">removeEventListener</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">login</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">onLogin</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">login</span><span style="color: Gray;">.</span><span style="color: Blue;">dispose</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">loadSwf</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>　　主程序收到事件之后卸载注册模块，加载“结果模块”到子域，并将登录模块传出的"userName"参数传给结果模块。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">show</span><span style="color: Olive;">(</span><span style="color: Blue;">p_parent</span><span style="color: Gray;"> : </span><span style="color: Blue;">DisplayObjectContainer</span><span style="color: Gray;">, ... </span><span style="color: Blue;">rest</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">libClass</span><span style="color: Gray;"> : </span><span style="color: Blue;">Class</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getClass</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">net.eidiot.appDomainDemo.Libaray</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">libClass</span><span style="color: Gray;"> != </span><span style="color: Green;">null</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">initUi</span><span style="color: Olive;">(</span><span style="color: Blue;">libClass</span><span style="color: Gray;">, </span><span style="color: Blue;">rest</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">override</span><span style="color: Gray;"> </span><span style="color: Blue;">protected</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">initUi</span><span style="color: Olive;">(</span><span style="color: Blue;">p_libClass</span><span style="color: Gray;"> : </span><span style="color: Blue;">Class</span><span style="color: Gray;">, </span><span style="color: Blue;">p_rest</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;"> = </span><span style="color: Green;">null</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">addUi</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getClass</span><span style="color: Olive;">(</span><span style="color: Blue;">p_libClass</span><span style="color: Gray;">.</span><span style="color: Blue;">BG_NAME</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">结果</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">resultFunc</span><span style="color: Gray;"> : </span><span style="color: Blue;">Function</span><span style="color: Gray;"> = </span><span style="color: Blue;">p_libClass</span><span style="color: Gray;">.</span><span style="color: Blue;">getResult</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">userName</span><span style="color: Gray;"> : </span><span style="color: Blue;">String</span><span style="color: Gray;"> = </span><span style="color: Blue;">p_rest</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">addChild</span><span style="color: Olive;">(</span><span style="color: Blue;">resultFunc</span><span style="color: Olive;">(</span><span style="color: Blue;">userName</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>　　注意initUi()方法分别使用了共享库中Libaray类的静态属性BG_NAME和静态方法getResult()。但是直接调用此静态方法会报错，可以先用 resultFunc 变量取出此方法。详细内容请参考 <a href="http://eidiot.net/lessons/appdomain/AppDomainDemo.rar" target="_blank" class="liinternal">源代码</a>。</p>
<div class="download">
<a href="http://eidiot.net/lessons/appdomain/demo" target="_blank" class="liinternal">实例效果演示</a><br />
<a href="http://eidiot.net/lessons/appdomain/AppDomainDemo.rar" target="_blank" class="liinternal">下载源文件</a> (rar 278K)
</div>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2007/06/03/applicationdomain/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>[AS3]数据存取方式效率比较</title>
		<link>http://eidiot.net/2007/06/01/data-access/</link>
		<comments>http://eidiot.net/2007/06/01/data-access/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 03:12:55 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=443</guid>
		<description><![CDATA[　　通常我们存取数据有如下几种方式：Array, Object, 自定义类, 比较特殊的还有 Point, Rectangle 等。效率依次为(后面的数字是100万次存取运算平均所需时间)： 自定义类public属性135 &#124; Point140 &#124; Rectangle(x等属性)140 Array270 Object500 &#124; 自定义动态类动态属性550 Rectangle(left等属性)700 自定义类getter/setter1000 &#124; 自定义类Function1000 　　出乎意料，最快的是自定类的public属性，速度是Array的两倍Object的四倍getter/setter的八倍——很整的倍数关系。另外存取坐标要用Point和Rectangle，比Array快的多。Object还是少用吧，多用自定义类。 　　另外自定义密封类(sealed,默认)和自定义动态类(dynamic)的public属性、getter/setter速度几乎一样，而动态类动态添加的属性和Object相若。]]></description>
			<content:encoded><![CDATA[<p>　　通常我们存取数据有如下几种方式：Array, Object, 自定义类, 比较特殊的还有 Point, Rectangle 等。效率依次为(后面的数字是100万次存取运算平均所需时间)：</p>
<ul>
<li>
自定义类public属性135 | Point140 | Rectangle(x等属性)140
	</li>
<li>
Array270
	</li>
<li>
Object500 | 自定义动态类动态属性550
	</li>
<li>
Rectangle(left等属性)700
	</li>
<li>
自定义类getter/setter1000 | 自定义类Function1000
	</li>
</li>
</ul>
<p>　　出乎意料，最快的是自定类的public属性，速度是Array的两倍Object的四倍getter/setter的八倍——很整的倍数关系。另外存取坐标要用Point和Rectangle，比Array快的多。Object还是少用吧，多用自定义类。<br />
　　另外自定义密封类(sealed,默认)和自定义动态类(dynamic)的public属性、getter/setter速度几乎一样，而动态类动态添加的属性和Object相若。</p>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2007/06/01/data-access/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[AS3]声明舞台元素为类变量</title>
		<link>http://eidiot.net/2007/06/01/declare-stage-instances/</link>
		<comments>http://eidiot.net/2007/06/01/declare-stage-instances/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 02:44:10 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=442</guid>
		<description><![CDATA[　　AS2时，可以直接声明舞台元素为自定义类的变量 private var myMc : MovieClip; 　　Flash CS3 再这样声明会报错：“A conflict exists with definition a in namespace internal.” 解决方法： 取消文档属性 Publish: Settings... -> ActionScrpt -> ActionScript3 中的 Automatically declare stage instances 将同名属性声明为 public]]></description>
			<content:encoded><![CDATA[<p>　　AS2时，可以直接声明舞台元素为自定义类的变量</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">myMc</span><span style="color: Gray;"> : </span><span style="color: Blue;">MovieClip</span><span style="color: Gray;">;</span></div></div>
<p>　　Flash CS3 再这样声明会报错：“A conflict exists with definition a in namespace internal.” 解决方法：</p>
<ul>
<li>
取消文档属性<br />
Publish: Settings... -> ActionScrpt -> ActionScript3 中的 Automatically declare stage instances
	</li>
<li>
将同名属性声明为 public
	</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2007/06/01/declare-stage-instances/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A*寻路,二叉堆优化及AS3实现</title>
		<link>http://eidiot.net/2007/04/17/a-star-pathfinding/</link>
		<comments>http://eidiot.net/2007/04/17/a-star-pathfinding/#comments</comments>
		<pubDate>Tue, 17 Apr 2007 13:15:45 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=409</guid>
		<description><![CDATA[　　游戏时代群雄并起，寻路乃中原逐鹿第一步，重要性不言而喻。今习得寻路战术之首A*算法，为大家操演一番，不足之处还望不吝赐教。可以选择阅读下面的内容，或者先看看 寻路示例 、AS3类代码 及其 API文档。 牛刀小试 - A*寻路算法简介 如虎添翼 - 使用二叉堆优化 锋芒毕露 - AS3代码和示例 牛刀小试 - A*寻路算法简介 　　eidiot挂帅出征，携令牌一枚，率人马若干，编制如下： 寻路元帅 　　寻路总指挥，执“行动令牌”一枚和“开启士兵名录”、“关闭将军名录”各一册。凭“行动令牌”调兵遣将。 预备士兵 　　由元帅或预备将军派往未探索区域，完成探索任务后授“开启”军衔，晋为“开启士兵”。发令派其出者为其“父将”。 开启士兵 　　前线待命。接到“行动令牌”后晋为“预备将军”执行探索任务。 预备将军 　　凭“行动令牌”派出预备士兵至周围未探索区域，并考察周围“开启士兵”状态，以“父将”之名节制所派士兵。归还“行动令牌”后授“关闭”军衔，晋为“关闭将军”。 关闭将军 　　后方待命。到达终点后依次报告“父将”直至元帅，寻路任务完成。 　　为协调行动，特颁军令如下： “预备士兵”只能由起点或“父将”所在格横、竖或斜向移动一格，直向（横、竖）移动一格走10步，斜向一格14步（斜向是直向1.414倍，取整数），抵达后不得再移动。 所有人员需记下派出自己的“父将”、从起点到所在位置所走步数（G）、预计到达终点共需步数（F）。 其中 F = G + H ，F 是从起点经过该点到终点的总路程，G 为起点到该点的“已走路程”，H 为该点到终点的“预计路程”。G 的计算是“父将”的 G 值加上“父将”位置到该位置所走步数，H 的计算是该点到终点“只走直路”所需路程。 　　看看战图更容易理解，从红色方格出发越过黄色障碍到达蓝色方格： 图例： 　　由图可形象看出何谓“开启士兵”、“关闭将军”：外围的绿色方格为“开启士兵”，“前线待命”，随时可向外继续探索。内围的紫色方格是“关闭将军”，从终点开始沿箭头寻其“父将”直至起点即得最终路径。 　　战前会议结束，拔营出征。 首先派出编号为0的“预备士兵”侦查起点，然后升其为“开启士兵”，列入“开启士兵名录”。 检查“开启士兵名录”，找出F值最低的“开启士兵”（只有一名人员，当然是0号），发出“行动令牌”派其执行探索任务。 0号“开启士兵”接到“行动令牌”，晋为“预备将军”，探索周围格子。 向周围8个格子分别派出编号为1到8的“预备士兵”，成为这八名“预备士兵”的“父将”。 八名“预备士兵”到达方格后计算G值和F值，报告0号“父将”，晋为“开启士兵”。 0号“预备将军”收到八名“开启士兵”的报告，归还“行动令牌”，晋为“关闭将军”。 [...]]]></description>
			<content:encoded><![CDATA[<p>　　游戏时代群雄并起，寻路乃中原逐鹿第一步，重要性不言而喻。今习得寻路战术之首A*算法，为大家操演一番，不足之处还望不吝赐教。可以选择阅读下面的内容，或者先看看 <a href="http://eidiot.net/code/astar/test.swf" target="_blank" class="liinternal">寻路示例</a> 、<a href="http://eidiot.net/code/astar/code/" target="_blank" class="liinternal">AS3类代码</a> 及其 <a href="http://eidiot.net/code/astar/doc/" target="_blank" class="liinternal">API文档</a>。<br />
<span id="more-409"></span>
<ul>
<li><a href="#part1" class="liinternal">牛刀小试 - A*寻路算法简介</a></li>
<li><a href="#part2" class="liinternal">如虎添翼 - 使用二叉堆优化</a></li>
<li><a href="#part3" class="liinternal">锋芒毕露 - AS3代码和示例</a></li>
</ul>
<p><a name="part1"></a><br />
<h3>牛刀小试 - A*寻路算法简介</h3>
<p>　　eidiot挂帅出征，携令牌一枚，率人马若干，编制如下：</p>
<ul>
<li><strong>寻路元帅</strong><br />
　　寻路总指挥，执“行动令牌”一枚和“开启士兵名录”、“关闭将军名录”各一册。凭“行动令牌”调兵遣将。</li>
<li><strong>预备士兵</strong><br />
　　由元帅或预备将军派往未探索区域，完成探索任务后授“开启”军衔，晋为“开启士兵”。发令派其出者为其“父将”。</li>
<li><strong>开启士兵</strong><br />
　　前线待命。接到“行动令牌”后晋为“预备将军”执行探索任务。</li>
<li><strong>预备将军</strong><br />
　　凭“行动令牌”派出预备士兵至周围未探索区域，并考察周围“开启士兵”状态，以“父将”之名节制所派士兵。归还“行动令牌”后授“关闭”军衔，晋为“关闭将军”。</li>
<li><strong>关闭将军</strong><br />
　　后方待命。到达终点后依次报告“父将”直至元帅，寻路任务完成。</li>
</ul>
<p>　　为协调行动，特颁军令如下：</p>
<ul>
<li>“预备士兵”只能由起点或“父将”所在格横、竖或斜向移动一格，直向（横、竖）移动一格走10步，斜向一格14步（斜向是直向1.414倍，取整数），抵达后不得再移动。</li>
<li>所有人员需记下派出自己的“父将”、从起点到所在位置所走步数（G）、预计到达终点共需步数（F）。<br />
<a name="fgh"></a>其中 <strong>F = G + H</strong> ，F 是从起点经过该点到终点的总路程，G 为起点到该点的“已走路程”，H 为该点到终点的“预计路程”。G 的计算是“父将”的 G 值加上“父将”位置到该位置所走步数，H 的计算是该点到终点“只走直路”所需路程。</li>
</ul>
<p>　　看看战图更容易理解，从红色方格出发越过黄色障碍到达蓝色方格：<br />
<img src='http://eidiot.net/wp-content/uploads/2007/04/0.gif' alt='0.gif' /><br />
图例：<br />
<img src='http://eidiot.net/wp-content/uploads/2007/04/00.gif' alt='00.gif' /><br />
　　由图可形象看出何谓“开启士兵”、“关闭将军”：外围的绿色方格为“开启士兵”，“前线待命”，随时可向外继续探索。内围的紫色方格是“关闭将军”，从终点开始沿箭头寻其“父将”直至起点即得最终路径。<br />
　　战前会议结束，拔营出征。</p>
<ul>
<li>首先派出编号为0的“预备士兵”侦查起点，然后升其为“开启士兵”，列入“开启士兵名录”。</li>
<li>检查“开启士兵名录”，找出F值最低的“开启士兵”（只有一名人员，当然是0号），发出“行动令牌”派其执行探索任务。</li>
<li>0号“开启士兵”接到“行动令牌”，晋为“预备将军”，探索周围格子。</li>
<li>向周围8个格子分别派出编号为1到8的“预备士兵”，成为这八名“预备士兵”的“父将”。</li>
<li>八名“预备士兵”到达方格后<a href="#fgh" class="liinternal">计算G值和F值</a>，报告0号“父将”，晋为“开启士兵”。</li>
<li>0号“预备将军”收到八名“开启士兵”的报告，归还“行动令牌”，晋为“关闭将军”。</li>
<li>元帅收回“行动令牌”，将0号加入“关闭将军名录”，1到8号加入“开启士兵名录”。</li>
</ul>
<p>　　此过程结果如下（方格右上角数字是人员编号，左下角是G，右下角是H，左上角是F）：<br />
<img src='http://eidiot.net/wp-content/uploads/2007/04/1.gif' alt='1.gif' /><br />
　　第一轮探索任务完成，元帅开始检查“开启士兵名录”。此时名录中有8名人员，其中1号F值最低为40（起点右移一格，G值为10，到终点平移3格，H值为30，F = G + H = 40），向其发出“行动令牌”。</p>
<ul>
<li>1号“开启士兵”接到“行动令牌”，晋为“预备将军”，探索周围格子。</li>
<li>周围8个格子中有3格障碍，跳过。一格是“关闭将军”，跳过。其余四格是“开启士兵”，检查如果从该位置过去G值是否更低。以2号为例，如果从1号过去G值为 10 + 14 = 24 （1号的G值加上1号到2号的步数）,而2号原来的G值是10，不做处理（如果此时发现新的G值更低，则更新2号的G值，并改2号的“父将”为1号）。其他类推。</li>
<li>1号检测完周围的方格，不需做任何处理，归还“行动令牌”，晋为“关闭将军”。</li>
<li>元帅收回“行动令牌”，将1号加入“关闭将军名录”。</li>
</ul>
<p>　　此过程结果如下：<br />
<img src='http://eidiot.net/wp-content/uploads/2007/04/2.gif' alt='2.gif' /><br />
　　第二轮结束，元帅再次检查“开启士兵名录”。此时还有7名“开启士兵”，5号和8号的F值都为最低的54，选择不同寻路的结果也将不同。元帅选择了最后加入的8号“开启士兵”发出“行动令牌”，过程同上，不赘述，结果如下：<br />
<img src='http://eidiot.net/wp-content/uploads/2007/04/3.gif' alt='3.gif' /><br />
　　重复这个过程直到某位“关闭将军”站到了终点上（或者“开启士兵”探测到了终点，这样更快捷，但某些情况找到的路径不够短），亦即找到了路径；或是“开启士兵名录”已空，无法到达终点。<br />
　　下面整理一下全过程并翻译成“标准语言”，首先是各名词：</p>
<ul>
<li>“开启士兵名录” - 开启列表 - open list</li>
<li>“关闭将军名录” - 关闭列表 - closed list</li>
<li>“父将” - 父节点 - parent square</li>
<li>F - 路径评分</li>
<li>G - 起点到该点移动损耗</li>
<li>H - 该点到终点（启发式）预计移动损耗</li>
</ul>
<p>　　寻路过程：</p>
<ul>
<li>1, 将起点放入开启列表</li>
<li>2, 寻找开放列表中F值最低的节点作为当前节点</li>
<li>3, 将当前节节点切换到关闭列表</li>
<li>4, 如果当前节点是终点则路径被找到，寻路结束</li>
<li>5, 对于其周围8个节点:
<ul>
<li>如果不可通过或已在关闭列表，跳过，否则：</li>
<li>如果已在开放列表中，检查新路径是否更好。如果新G值更低则更新其G值并改当前节点为其父节点，否则跳过</li>
<li>如果是可通过区域则放入开启列表，计算这一点的F、G、H值，并记当前节点为其父节点</li>
</ul>
</li>
<li>6, 如果开启列表空了，则无法到达目标，路径不存在。否则回到2</li>
</ul>
<p>　　再翻译成“编程语言”？请看第三部分，<a href="#part3" class="liinternal">锋芒毕露 - AS3代码和示例</a>。<br />
<a name="part2"></a><br />
<h3>如虎添翼 - 使用二叉堆优化</h3>
<p>　　如何让A*寻路更快？元帅三顾茅庐，请来南阳二叉堆先生帮忙优化寻找“开启士兵名录”中最低F值的过程，将寻路速度提高了2到3倍，而且越大的地图效果越明显。下面隆重介绍二叉堆先生：<br />
　　下图是一个二叉堆的例子，形式上看，它从顶点开始，每个节点有两个子节点，每个子节点又各自有自己的两个子节点；数值上看，每个节点的两个子节点都比它大或和它相等。<br />
<img src='http://eidiot.net/wp-content/uploads/2007/04/binary1.gif' alt='binary1.gif' /><br />
　　在二叉堆里我们要求：</p>
<ul>
<li>最小的元素在顶端</li>
<li>每个元素都比它的父节点大，或者和父节点相等。</li>
</ul>
<p>　　只要满足这两个条件，其他的元素怎么排都行。如上面的例子，最小的元素10在最顶端，第二小的元素20在10的下面，但是第三小的元素24在20的下面，也就是第三层，更大的30反而在第二层。<br />
　　这样一“堆”东西我们在程序中怎么用呢？幸运的是，二叉堆可以用一个简单的一维数组来存储，如下图所示。<br />
<img src='http://eidiot.net/wp-content/uploads/2007/04/binary2.jpg' alt='binary2.jpg' /><br />
　　假设一个元素的位置是n（第一个元素的位置为1，而不是通常数组的第一个索引0），那么它两个子节点分别是 n × 2 和 n × 2 + 1 ，父节点是n除以2取整。比如第3个元素（例中是20）的两个子节点位置是6和7，父节点位置是1。<br />
　　对于二叉堆我们通常有三种操作：添加、删除和修改元素：</p>
<ul>
<li>添加元素<br />
首先把要添加的元素加到数组的末尾，然后和它的父节点（位置为当前位置除以2取整，比如第4个元素的父节点位置是2，第7个元素的父节点位置是3）比较，如果新元素比父节点元素小则交换这两个元素，然后再和新位置的父节点比较，直到它的父节点不再比它大，或者已经到达顶端，及第1的位置。</li>
<li>删除元素<br />
删除元素的过程类似，只不过添加元素是“向上冒”，而删除元素是“向下沉”：删除位置1的元素，把最后一个元素移到最前面，然后和它的两个子节点比较，如果较小的子节点比它小就将它们交换，直到两个子节点都比它大。</li>
<li>修改元素<br />
和添加元素完全一样的“向上冒”过程，只是要注意被修改的元素在二叉堆中的位置。</li>
</ul>
<p>　　可以看出，使用二叉堆只需很少的几步就可以完成排序，很大程度上提高了寻路速度。<br />
　　关于二叉堆先生需要了解的就是这么多了，下面来看看他怎么帮助元帅工作：</p>
<ul>
<li>每次派出的“预备士兵”都会获得一个唯一的编号（ID），一直到寻路结束，它所有的数据包括位置、F值、G值、“父将”编号都将按这个ID存储。</li>
<li>每次有新的“开启士兵”加入，二叉堆先生将它的编号加入“开启士兵名录”并重新排序，使F值最低的ID始终排在最前面</li>
<li>当有“开启士兵”晋为“关闭将军”，删除“开启士兵名录”的第一个元素并重新排序</li>
<li>当某个“开启士兵”的F值被修改，更新其数据并重新排序</li>
</ul>
<p>　　注意，“开启士兵名录”里存的只是人员的编号，数据全都另外存储。不太明白？没关系，元帅将在 <a href="#part3" class="liinternal">第三部分</a> 来次真刀实枪的大演兵。<br />
<a name="part3"></a><br />
<h3>锋芒毕露 - AS3代码和示例</h3>
<p>　　地形数据不属于A*寻路的范围，这里定义一个 IMapTileModel 接口，由其它（模型）类来实现地图通路的判断。其它比如寻路超时的判断这里也不介绍，具体参考 <a href="http://eidiot.net/code/astar/code/" target="_blank" class="liinternal">AStar类及其测试代码</a>。这里只介绍三部分主要内容：</p>
<ul>
<li><a href="#data" class="liinternal">数据存储</a></li>
<li><a href="#find" class="liinternal">寻路过程</a></li>
<li><a href="#sort" class="liinternal">列表排序</a></li>
</ul>
<p><a name="data"></a><strong>数据存储</strong><br />
　　首先看看三个关键变量：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m_openList</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//开放列表，存放节点ID</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m_openCount</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//当前开放列表中节点数量</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m_openId</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//节点加入开放列表时分配的唯一ID(从0开始)</span></div></div>
<p>　　开放列表 m_openList 是个二叉堆（一维数组），F值最小的节点始终排在最前。为加快排序，开放列表中只存放节点ID ，其它数据放在各自的一维数组中：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m_xList</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//节点x坐标</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m_yList</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//节点y坐标</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m_pathScoreList</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//节点路径评分F值</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m_movementCostList</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//(从起点移动到)节点的移动耗费G值</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m_fatherList</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//节点的父节点(ID)</span></div></div>
<p>　　这些数据列表都以节点ID为索引顺序存储。看看代码如何工作：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">//每次取出开放列表最前面的ID</span><span style="color: Gray;"><br /></span><span style="color: Blue;">currId</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">//读取当前节点坐标</span><span style="color: Gray;"><br /></span><span style="color: Blue;">currNoteX</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_xList</span><span style="color: Olive;">[</span><span style="color: Blue;">currId</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">currNoteY</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_yList</span><span style="color: Olive;">[</span><span style="color: Blue;">currId</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></div></div>
<p>　　还有一个很关键的变量：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m_noteMap</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//节点(数组)地图,根据节点坐标记录节点开启关闭状态和ID</span></div></div>
<p>　　使用 m_noteMap 可以方便的存取任何位置节点的开启关闭状态，并可取其ID进而存取其它数据。m_noteMap 是个三维数组，第一维y坐标（第几行），第二维x坐标（第几列），第三维节点状态和ID。判断点(p_x, p_y)是否在开启列表中：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_noteMap</span><span style="color: Olive;">[</span><span style="color: Blue;">p_y</span><span style="color: Olive;">][</span><span style="color: Blue;">p_x</span><span style="color: Olive;">][</span><span style="color: Blue;">NOTE_OPEN</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></div></div>
<p><a name="find"></a><strong>寻路过程</strong><br />
　　<a href="http://eidiot.net/code/astar/code/source/net/eidiot/map/AStar.as.html" target="_blank" class="liinternal">AStar类</a> 寻路的方法是 find() :</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">/**<br />* 开始寻路<br />* @param p_startX&nbsp; &nbsp; &nbsp; &nbsp; 起点X坐标<br />* @param p_startY&nbsp; &nbsp; &nbsp; &nbsp; 起点Y坐标<br />* @param p_endX&nbsp; &nbsp; &nbsp; &nbsp; 终点X坐标<br />* @param p_endY&nbsp; &nbsp; &nbsp; &nbsp; 终点Y坐标<br />* @return&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;找到的路径(二维数组 : [p_startX, p_startY], ... , [p_endX, p_endY])<br />*/</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; <br /></span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">find</span><span style="color: Olive;">(</span><span style="color: Blue;">p_startX</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_startY</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_endX</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_endY</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Olive;">{</span><span style="color: #ffa500;">/* 寻路 */</span><span style="color: Olive;">}</span></div></div>
<p>　　注意这里返回数据的形式：从起点到终点的节点数组，其中每个节点为一维数组[x, y]的形式。为了加快速度，类里没有使用Object或是Point，节点坐标全部以数组形式存储。如节点note的x坐标为note[0],y坐标为note[1]。<br />
　　下面开始寻路，第一步将起点添加到开启列表：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">openNote</span><span style="color: Olive;">(</span><span style="color: Blue;">p_startX</span><span style="color: Gray;">, </span><span style="color: Blue;">p_startY</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>　　openNote() 方法将节点加入开放列表的同时分配一个唯一的ID、<a href="#data" class="liinternal">按此ID存储数据</a>、<a href="#sort" class="liinternal">对开启列表排序</a>。接下来是寻路过程：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">while</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openCount</span><span style="color: Gray;"> &gt; </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//每次取出开放列表最前面的ID</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">currId</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//将编码为此ID的元素列入关闭列表</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">closeNote</span><span style="color: Olive;">(</span><span style="color: Blue;">currId</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//如果终点被放入关闭列表寻路结束，返回路径</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">currNoteX</span><span style="color: Gray;"> == </span><span style="color: Blue;">p_endX</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">currNoteY</span><span style="color: Gray;"> == </span><span style="color: Blue;">p_endY</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getPath</span><span style="color: Olive;">(</span><span style="color: Blue;">p_startX</span><span style="color: Gray;">, </span><span style="color: Blue;">p_startY</span><span style="color: Gray;">, </span><span style="color: Blue;">currId</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//...每轮寻路过程</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//开放列表已空，找不到路径</span><span style="color: Gray;"><br /></span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;">;</span></div></div>
<p>　　每轮的寻路：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">//获取周围节点，排除不可通过和已在关闭列表中的</span><span style="color: Gray;"><br /></span><span style="color: Blue;">aroundNotes</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getArounds</span><span style="color: Olive;">(</span><span style="color: Blue;">currNoteX</span><span style="color: Gray;">, </span><span style="color: Blue;">currNoteY</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">//对于周围每个节点</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Blue;">each</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">note</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">aroundNotes</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//计算F和G值</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">cost</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_movementCostList</span><span style="color: Olive;">[</span><span style="color: Blue;">currId</span><span style="color: Olive;">]</span><span style="color: Gray;"> + </span><span style="color: Olive;">((</span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: Blue;">currNoteX</span><span style="color: Gray;"> || </span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: Blue;">currNoteY</span><span style="color: Olive;">)</span><span style="color: Gray;"> ? </span><span style="color: Blue;">COST_STRAIGHT</span><span style="color: Gray;"> : </span><span style="color: Blue;">COST_DIAGONAL</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">score</span><span style="color: Gray;"> = </span><span style="color: Blue;">cost</span><span style="color: Gray;"> + </span><span style="color: Olive;">(</span><span style="color: Blue;">Math</span><span style="color: Gray;">.</span><span style="color: Blue;">abs</span><span style="color: Olive;">(</span><span style="color: Blue;">p_endX</span><span style="color: Gray;"> - </span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">])</span><span style="color: Gray;"> + </span><span style="color: Blue;">Math</span><span style="color: Gray;">.</span><span style="color: Blue;">abs</span><span style="color: Olive;">(</span><span style="color: Blue;">p_endY</span><span style="color: Gray;"> - </span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]))</span><span style="color: Gray;"> * </span><span style="color: Blue;">COST_STRAIGHT</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">isOpen</span><span style="color: Olive;">(</span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]))</span><span style="color: Gray;"> </span><span style="color: #ffa500;">//如果节点已在开启列表中</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//测试节点的ID</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">checkingId</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_noteMap</span><span style="color: Olive;">[</span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]][</span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]][</span><span style="color: Blue;">NOTE_ID</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//如果新的G值比节点原来的G值小,修改F,G值，换父节点</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">cost</span><span style="color: Gray;"> &lt; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_movementCostList</span><span style="color: Olive;">[</span><span style="color: Blue;">checkingId</span><span style="color: Olive;">])</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_movementCostList</span><span style="color: Olive;">[</span><span style="color: Blue;">checkingId</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">cost</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_pathScoreList</span><span style="color: Olive;">[</span><span style="color: Blue;">checkingId</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">score</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_fatherList</span><span style="color: Olive;">[</span><span style="color: Blue;">checkingId</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">currId</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//对开启列表重新排序</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">aheadNote</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getIndex</span><span style="color: Olive;">(</span><span style="color: Blue;">checkingId</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"> </span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: #ffa500;">//如果节点不在开放列表中</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//将节点放入开放列表</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">openNote</span><span style="color: Olive;">(</span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: Blue;">note</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: Blue;">score</span><span style="color: Gray;">, </span><span style="color: Blue;">cost</span><span style="color: Gray;">, </span><span style="color: Blue;">currId</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span></div></div>
<p>　　从终点开始依次沿父节点回到到起点，返回找到的路径：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">/**<br />&nbsp;* 获取路径<br />&nbsp;* @param p_startX&nbsp; &nbsp; 起始点X坐标<br />&nbsp;* @param p_startY&nbsp; &nbsp; 起始点Y坐标<br />&nbsp;* @param p_id&nbsp; &nbsp; &nbsp; &nbsp; 终点的ID<br />&nbsp;* @return&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;路径坐标数组<br />&nbsp;*/</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; <br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">getPath</span><span style="color: Olive;">(</span><span style="color: Blue;">p_startX</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_startY</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_id</span><span style="color: Gray;">: </span><span style="color: Blue;">int</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">arr</span><span style="color: Gray;"> : </span><span style="color: Blue;">Array</span><span style="color: Gray;"> = </span><span style="color: Olive;">[]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">noteX</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_xList</span><span style="color: Olive;">[</span><span style="color: Blue;">p_id</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">noteY</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_yList</span><span style="color: Olive;">[</span><span style="color: Blue;">p_id</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">while</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">noteX</span><span style="color: Gray;"> != </span><span style="color: Blue;">p_startX</span><span style="color: Gray;"> || </span><span style="color: Blue;">noteY</span><span style="color: Gray;"> != </span><span style="color: Blue;">p_startY</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">arr</span><span style="color: Gray;">.</span><span style="color: Blue;">unshift</span><span style="color: Olive;">([</span><span style="color: Blue;">noteX</span><span style="color: Gray;">, </span><span style="color: Blue;">noteY</span><span style="color: Olive;">])</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">p_id</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_fatherList</span><span style="color: Olive;">[</span><span style="color: Blue;">p_id</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">noteX</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_xList</span><span style="color: Olive;">[</span><span style="color: Blue;">p_id</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">noteY</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_yList</span><span style="color: Olive;">[</span><span style="color: Blue;">p_id</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">arr</span><span style="color: Gray;">.</span><span style="color: Blue;">unshift</span><span style="color: Olive;">([</span><span style="color: Blue;">p_startX</span><span style="color: Gray;">, </span><span style="color: Blue;">p_startY</span><span style="color: Olive;">])</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">destroyLists</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">arr</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p><a name="sort"></a><strong>列表排序</strong><br />
　　这部分看代码和注释就可以了，不多说：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">/** 将(新加入开放别表或修改了路径评分的)节点向前移动 */</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">aheadNote</span><span style="color: Olive;">(</span><span style="color: Blue;">p_index</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">father</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">change</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//如果节点不在列表最前</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">while</span><span style="color: Olive;">(</span><span style="color: Blue;">p_index</span><span style="color: Gray;"> &gt; </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//父节点的位置</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">father</span><span style="color: Gray;"> = </span><span style="color: Blue;">Math</span><span style="color: Gray;">.</span><span style="color: Blue;">floor</span><span style="color: Olive;">(</span><span style="color: Blue;">p_index</span><span style="color: Gray;"> ／ </span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//如果该节点的F值小于父节点的F值则和父节点交换</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getScore</span><span style="color: Olive;">(</span><span style="color: Blue;">p_index</span><span style="color: Olive;">)</span><span style="color: Gray;"> &lt; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getScore</span><span style="color: Olive;">(</span><span style="color: Blue;">father</span><span style="color: Olive;">))</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">change</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Blue;">p_index</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Blue;">p_index</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Blue;">father</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Blue;">father</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">change</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">p_index</span><span style="color: Gray;"> = </span><span style="color: Blue;">father</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"> </span><span style="color: Green;">else</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">/** 将(取出开启列表中路径评分最低的节点后从队尾移到最前的)节点向后移动 */</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">backNote</span><span style="color: Olive;">()</span><span style="color: Gray;"> : </span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//尾部的节点被移到最前面</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">checkIndex</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">tmp</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">change</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">while</span><span style="color: Olive;">(</span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">tmp</span><span style="color: Gray;"> = </span><span style="color: Blue;">checkIndex</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//如果有子节点</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;"> * </span><span style="color: Blue;">tmp</span><span style="color: Gray;"> &lt;= </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openCount</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//如果子节点的F值更小</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getScore</span><span style="color: Olive;">(</span><span style="color: Blue;">checkIndex</span><span style="color: Olive;">)</span><span style="color: Gray;"> &gt; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getScore</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;"> * </span><span style="color: Blue;">tmp</span><span style="color: Olive;">))</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//记节点的新位置为子节点位置</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">checkIndex</span><span style="color: Gray;"> = </span><span style="color: Maroon;">2</span><span style="color: Gray;"> * </span><span style="color: Blue;">tmp</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//如果有两个子节点</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;"> * </span><span style="color: Blue;">tmp</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Gray;"> &lt;= </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openCount</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//如果第二个子节点F值更小</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getScore</span><span style="color: Olive;">(</span><span style="color: Blue;">checkIndex</span><span style="color: Olive;">)</span><span style="color: Gray;"> &gt; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">getScore</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;"> * </span><span style="color: Blue;">tmp</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Olive;">))</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//更新节点新位置为第二个子节点位置</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">checkIndex</span><span style="color: Gray;"> = </span><span style="color: Maroon;">2</span><span style="color: Gray;"> * </span><span style="color: Blue;">tmp</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//如果节点位置没有更新结束排序</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">tmp</span><span style="color: Gray;"> == </span><span style="color: Blue;">checkIndex</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//反之和新位置交换，继续和新位置的子节点比较F值</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">else</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">change</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Blue;">tmp</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Blue;">tmp</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Blue;">checkIndex</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Blue;">checkIndex</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">change</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span></div></div>
<p>　　其中 getScore() 方法：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">/**<br />&nbsp;* 获取某节点的路径评分F值<br />&nbsp;* @param p_index&nbsp; &nbsp; 节点在开启列表中的索引(从1开始)<br />&nbsp;*/</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; <br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">getScore</span><span style="color: Olive;">(</span><span style="color: Blue;">p_index</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Blue;">int</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//开启列表索引从1开始，ID从0开始，数组索引从0开始</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_pathScoreList</span><span style="color: Olive;">[</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">m_openList</span><span style="color: Olive;">[</span><span style="color: Blue;">p_index</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">]]</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<div class="download">
<a href="http://eidiot.net/code/astar/test.swf" target="_blank" class="liinternal">查看寻路示例</a><br />
<a href="http://eidiot.net/code/astar/code/TestAStar.zip" target="_blank" class="liinternal">下载示例源文件</a> (zip 6.44)
</div>
<p>参考文章：<br />
<a href="http://www.policyalmanac.org/games/aStarTutorial.htm" target="_blank" class="liexternal">A* Pathfinding for Beginners</a> (<a href="http://blog.vckbase.com/panic/archive/2005/03/20/3778.html" target="_blank" class="liexternal">中文</a>)<br />
<a href="http://www.policyalmanac.org/games/binaryHeaps.htm" target="_blank" class="liexternal">Using Binary Heaps in A* Pathfinding</a> (<a href="http://blog.vckbase.com/panic/archive/2005/03/28/4144.html" target="_blank" class="liexternal">中文</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2007/04/17/a-star-pathfinding/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>AS3笔记－ContextMenu</title>
		<link>http://eidiot.net/2006/11/02/as3-note-contextmenu/</link>
		<comments>http://eidiot.net/2006/11/02/as3-note-contextmenu/#comments</comments>
		<pubDate>Thu, 02 Nov 2006 13:15:29 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=346</guid>
		<description><![CDATA[　　写了一个 ContextMenuPlus 类来自定义右键菜单。一行代码可以搞定禁用系统内置菜单(target为设置自定义菜单的目标，如果为自己可以省略): target.contextMenu = new ContextMenuPlus().contextMenu; 　　当然它能做的事情不止于此。看看示例： 
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_cm_1176831267"
			class="flashmovie"
			width="500"
			height="30">
	<param name="movie" value="http://eidiot.net/wp-content/uploads/learn_as_3/cm/cm.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://eidiot.net/wp-content/uploads/learn_as_3/cm/cm.swf"
			name="fm_cm_1176831267"
			width="500"
			height="30">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object> 　　自定义文本区域的右键菜单同样是一行代码： txt.contextMenu = new ContextMenuPlus(true, &#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;onSetTxtColor, &#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#34;红色文字&#34;, &#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#34;蓝色文字&#34;, &#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#34;黑色文字&#34;).contextMenu; 　　这里通过构造函数做了三件事情： 禁用内置菜单 添加自定义菜单项 [...]]]></description>
			<content:encoded><![CDATA[<p>　　写了一个 ContextMenuPlus 类来自定义右键菜单。一行代码可以搞定禁用系统内置菜单(target为设置自定义菜单的目标，如果为自己可以省略):</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">target</span><span style="color: Gray;">.</span><span style="color: Blue;">contextMenu</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">ContextMenuPlus</span><span style="color: Olive;">()</span><span style="color: Gray;">.</span><span style="color: Blue;">contextMenu</span><span style="color: Gray;">;</span></div></div>
<p>　　当然它能做的事情不止于此。看看示例：<br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_cm_315937279"
			class="flashmovie"
			width="500"
			height="30">
	<param name="movie" value="http://eidiot.net/wp-content/uploads/learn_as_3/cm/cm.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://eidiot.net/wp-content/uploads/learn_as_3/cm/cm.swf"
			name="fm_cm_315937279"
			width="500"
			height="30">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object><br />
　　自定义文本区域的右键菜单同样是一行代码：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">txt</span><span style="color: Gray;">.</span><span style="color: Blue;">contextMenu</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">ContextMenuPlus</span><span style="color: Olive;">(</span><span style="color: Green;">true</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">onSetTxtColor</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">红色文字</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">蓝色文字</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">黑色文字</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">contextMenu</span><span style="color: Gray;">;</span></div></div>
<p><span id="more-346"></span><br />
　　这里通过构造函数做了三件事情：</p>
<ol>
<li>禁用内置菜单</li>
<li>添加自定义菜单项</li>
<li>监听menuItemSelect事件</li>
</ol>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">/**<br />&nbsp;* @param removeAll&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 是否禁用所有默认菜单<br />&nbsp;* @param listener&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 自定义菜单事件句柄<br />&nbsp;* @param ...customItems&nbsp; &nbsp; 自定义标签，可以是一个数组<br />&nbsp;*/</span><span style="color: Gray;"><br /></span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">ContextMenuPlus</span><span style="color: Olive;">(</span><span style="color: Blue;">removeAll</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">listener</span><span style="color: Gray;">:</span><span style="color: Blue;">Function</span><span style="color: Gray;"> = </span><span style="color: Green;">null</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;...</span><span style="color: Blue;">customItems</span><span style="color: Olive;">){</span><span style="color: Gray;">...</span><span style="color: Olive;">}</span></div></div>
<p>　　就这些了？当然不，看看示例的系统菜单：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">cm</span><span style="color: Gray;">:</span><span style="color: Blue;">ContextMenuPlus</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">ContextMenuPlus</span><span style="color: Olive;">(</span><span style="color: Green;">true</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">onShowAnswer</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">母亲节是哪天？</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">父亲节是哪天？</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">contextMenu</span><span style="color: Gray;"> = </span><span style="color: Blue;">cm</span><span style="color: Gray;">.</span><span style="color: Blue;">contextMenu</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">cm</span><span style="color: Gray;">.</span><span style="color: Blue;">addCustom</span><span style="color: Olive;">(</span><span style="color: Blue;">onGetUrl</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">eidiot's blog</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">cm</span><span style="color: Gray;">.</span><span style="color: Blue;">addGroup</span><span style="color: Olive;">(</span><span style="color: Blue;">onSetBorderColor</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">true</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">绿色边框</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">紫色边框</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">黑色边框</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>　　首先"绑定"自定义菜单到舞台：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">cm</span><span style="color: Gray;">:</span><span style="color: Blue;">ContextMenuPlus</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">ContextMenuPlus</span><span style="color: Olive;">(</span><span style="color: Gray;">...</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">contextMenu</span><span style="color: Gray;"> = </span><span style="color: Blue;">cm</span><span style="color: Gray;">.</span><span style="color: Blue;">contextMenu</span><span style="color: Gray;">;</span></div></div>
<p>　　然后想怎么玩就怎么玩。先加个链接到我的blog吧：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">cm</span><span style="color: Gray;">.</span><span style="color: Blue;">addCustom</span><span style="color: Olive;">(</span><span style="color: Blue;">onGetUrl</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">eidiot's blog</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>　　这里用到了添加菜单单项的 addCustom 方法：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">/**<br />&nbsp;* 添加自定义菜单项<br />&nbsp;* @param caption&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 菜单项标题<br />&nbsp;* @param listener&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 事件句柄<br />&nbsp;* @param separatorBefore&nbsp; &nbsp; 是否在菜单上方添加分割线<br />&nbsp;* @param enabled&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 是否可用<br />&nbsp;* @param visible&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 是否可见<br />&nbsp;*/</span><span style="color: Gray;"><br /></span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">addCustom</span><span style="color: Olive;">(</span><span style="color: Blue;">listener</span><span style="color: Gray;">:</span><span style="color: Blue;">Function</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">caption</span><span style="color: Gray;">:</span><span style="color: Blue;">String</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">separatorBefore</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span><span style="color: Gray;"> = </span><span style="color: Green;">false</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">enabled</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">visible</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Olive;">{</span><span style="color: Gray;">...</span><span style="color: Olive;">}</span></div></div>
<p>　　这里要注意一下，原来的 getUrl() 已被 remove ，需要用新的 navigateToURL 方法：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">onGetUrl</span><span style="color: Olive;">(</span><span style="color: Blue;">e</span><span style="color: Gray;">:</span><span style="color: Blue;">ContextMenuEvent</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">navigateToURL</span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">URLRequest</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://eidiot.net</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">_blank</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;">　</span></div></div>
<p>　　再来加个菜单组，改变一下文本边框颜色：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">cm</span><span style="color: Gray;">.</span><span style="color: Blue;">addGroup</span><span style="color: Olive;">(</span><span style="color: Blue;">onSetBorderColor</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">true</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">绿色边框</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">紫色边框</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">黑色边框</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>　　因为他们“同组”，亦即功能统一，只需设置一个事件句柄：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">/**<br />&nbsp;* 添加自定义菜单组，所有菜单项共用同一个事件句柄<br />&nbsp;* 通过 event.currentTarget.caption 区分不同的菜单项<br />&nbsp;* private function onSelect(event:ContextMenuEvent):void{<br />&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var item:ContextMenuItem = event.currentTarget;<br />&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;switch(item.caption)...}<br />&nbsp;* @param listener&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 事件句柄<br />&nbsp;* @param separatorBefore&nbsp; &nbsp; 是否在菜单组上方添加分隔线<br />&nbsp;* @param ...customItems&nbsp; &nbsp; 菜单项标题，可以是一个数组<br />&nbsp;*/</span><span style="color: Gray;"><br /></span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">addGroup</span><span style="color: Olive;">(</span><span style="color: Blue;">listener</span><span style="color: Gray;">:</span><span style="color: Blue;">Function</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">separatorBefore</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span><span style="color: Gray;"> = </span><span style="color: Green;">false</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;...</span><span style="color: Blue;">customItems</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Olive;">{</span><span style="color: Gray;">...</span><span style="color: Olive;">}</span></div></div>
<p>　　不想禁用所有的菜单项，还想保留几个？removeDefault可以实现：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">/**<br />&nbsp;* 禁用默认菜单<br />&nbsp;* @param ...leave&nbsp; &nbsp; 保留的菜单项(字符串，逗号隔开)<br />&nbsp;*/</span><span style="color: Gray;"><br /></span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">removeDefault</span><span style="color: Olive;">(</span><span style="color: Gray;">...</span><span style="color: Blue;">leave</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Olive;">{</span><span style="color: Gray;">...</span><span style="color: Olive;">}</span></div></div>
<p>　　为了避免在事件里 switch ，我在 <a href="http://eidiot.net/wp-content/uploads/learn_as_3/cm/TestContextMenu.swf" target="_blank" class="liinternal">测试代码</a> 里使用对象来对应选项：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">//设置对照列表</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">initObj</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">txtColorObj</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">红色文字</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Blue;">xFF0000</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">txtColorObj</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">蓝色文字</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Blue;">x0000FF</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">txtColorObj</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">黑色文字</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Blue;">x000000</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//读取列表值</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">onSetTxtColor</span><span style="color: Olive;">(</span><span style="color: Blue;">e</span><span style="color: Gray;">:</span><span style="color: Blue;">ContextMenuEvent</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">txt</span><span style="color: Gray;">.</span><span style="color: Blue;">textColor</span><span style="color: Gray;"> = </span><span style="color: Blue;">txtColorObj</span><span style="color: Olive;">[</span><span style="color: Blue;">e</span><span style="color: Gray;">.</span><span style="color: Blue;">currentTarget</span><span style="color: Gray;">.</span><span style="color: Blue;">caption</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>　　具体的实现就不罗唆了，看看 <a href="http://eidiot.net/wp-content/uploads/learn_as_3/cm/TestContextMenu.swf" target="_blank" class="liinternal">测试代码</a> 和 <a href="http://eidiot.net/wp-content/uploads/learn_as_3/cm/ContextMenuPlus.swf" target="_blank" class="liinternal">类代码</a> 。</p>
<div class="download"><a href="http://eidiot.net/wp-content/uploads/learn_as_3/cm.rar" target="_blank" class="liinternal">下载本例源文件</a><br />rar 10 K</div>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2006/11/02/as3-note-contextmenu/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>AS3笔记－for each &#8230; in</title>
		<link>http://eidiot.net/2006/11/02/as3-note-for-each-in/</link>
		<comments>http://eidiot.net/2006/11/02/as3-note-for-each-in/#comments</comments>
		<pubDate>Thu, 02 Nov 2006 12:41:58 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=345</guid>
		<description><![CDATA[　　新的 for each ... in 除了遍历XML，同样可以用来遍历数组和对象。创建“百万雄兵”： var testArr:Array = new Array();for(var i:Number = 0; i &#60; 1000000; i++){&#160;&#160; &#160;testArr.push(i);} 　　以前的 for 和 for ... in 以及新的 for each ... in 循环： //for&#160; &#160; 260毫秒var len:Number = testArr.length;for(var j:Number = 0; j &#60; len; j++){&#160;&#160; &#160;testArr[j]++;}//for ... in&#160; &#160; 8000毫秒for(var k:String in testArr){&#160;&#160; &#160;testArr[k]++;}//for each ... [...]]]></description>
			<content:encoded><![CDATA[<p>　　新的 for each ... in 除了遍历XML，同样可以用来遍历数组和对象。创建“百万雄兵”：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">testArr</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Array</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Gray;">:</span><span style="color: Blue;">Number</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;"> &lt; </span><span style="color: Maroon;">1000000</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">testArr</span><span style="color: Gray;">.</span><span style="color: Blue;">push</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>　　以前的 for 和 for ... in 以及新的 for each ... in 循环：<span id="more-345"></span></p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">//for&nbsp; &nbsp; 260毫秒</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">len</span><span style="color: Gray;">:</span><span style="color: Blue;">Number</span><span style="color: Gray;"> = </span><span style="color: Blue;">testArr</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;">;<br /></span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">j</span><span style="color: Gray;">:</span><span style="color: Blue;">Number</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">j</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">len</span><span style="color: Gray;">; </span><span style="color: Blue;">j</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">testArr</span><span style="color: Olive;">[</span><span style="color: Blue;">j</span><span style="color: Olive;">]</span><span style="color: Gray;">++;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//for ... in&nbsp; &nbsp; 8000毫秒</span><span style="color: Gray;"><br /></span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">k</span><span style="color: Gray;">:</span><span style="color: Blue;">String</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">testArr</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">testArr</span><span style="color: Olive;">[</span><span style="color: Blue;">k</span><span style="color: Olive;">]</span><span style="color: Gray;">++;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//for each ... in&nbsp; &nbsp; 58毫秒</span><span style="color: Gray;"><br /></span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Blue;">each</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">m</span><span style="color: Gray;">:</span><span style="color: Blue;">Number</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">testArr</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">m</span><span style="color: Gray;">++；<br /></span><span style="color: Olive;">}</span></div></div>
<p>　　效率如何呢？经过多次测试，for 循环平均260毫秒(不预存数组长度平均400毫秒)，for ... in 循环平均8000毫秒，for each ... in 循环58毫秒！！所以应该尽量避免 for ... in ，多用 for each ... in ，用for循环的话最好预存数组长度（var len:Number = testArr.length;）。<br />
　　Object的情况，for ... in 平均560毫秒，for each ... in 平均8毫秒。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">testObj</span><span style="color: Gray;">:</span><span style="color: Blue;">Object</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Object</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Gray;">:</span><span style="color: Blue;">Number</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;"> &lt; </span><span style="color: Maroon;">100000</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">testObj</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">i</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//for ... in&nbsp; &nbsp; 读取标签&nbsp; &nbsp; 560毫秒</span><span style="color: Gray;"><br /></span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">j</span><span style="color: Gray;">:</span><span style="color: Blue;">String</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">testObj</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">testObj</span><span style="color: Olive;">[</span><span style="color: Blue;">j</span><span style="color: Olive;">]</span><span style="color: Gray;">++;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//for each ... in&nbsp; &nbsp; 直接读值&nbsp; &nbsp; 8毫秒</span><span style="color: Gray;"><br /></span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Blue;">each</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">k</span><span style="color: Gray;">:</span><span style="color: Blue;">Number</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">testObj</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">k</span><span style="color: Gray;">++;<br /></span><span style="color: Olive;">}</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2006/11/02/as3-note-for-each-in/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AS3笔记(9)－Array</title>
		<link>http://eidiot.net/2006/08/27/as3-note-array/</link>
		<comments>http://eidiot.net/2006/08/27/as3-note-array/#comments</comments>
		<pubDate>Sun, 27 Aug 2006 14:41:07 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
				<category><![CDATA[学海沉舟 · [技术]]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=312</guid>
		<description><![CDATA[　　首先值得一提的是AS3的 Array 有了像 String 一样的 indexOf() 和 lastIndexOf() 。另外增加了几个很有用的 Method。 every(callback:Function, thisObject:* = null):Boolean 检测是否数组所有元素都满足 callback 方法指定的条件。 some(callback:Function, thisObject:* = null):Boolean 检测数组中是否有元素满足 callback 方法指定的条件。 filter(callback:Function, thisObject:* = null):Array 根据 callback 方法指定的条件过滤数组，返回由符合条件的元素组成的新数组 map(callback:Function, thisObject:* = null):Array 数组的每一个元素执行 callback 方法，返回由对应的结果组成的新数组 forEach(callback:Function, thisObject:* = null):void 数组的每一个元素执行 callback 方法，不返回任何值 　　第二个参数 thisObject 是第一个参数 callback 的执行范围，即方法内部的 this ，一般不需指定。callback 的参数也都是一样的 function callback(item:*, [...]]]></description>
			<content:encoded><![CDATA[<p>　　首先值得一提的是AS3的 Array 有了像 String 一样的 indexOf() 和 lastIndexOf() 。另外增加了几个很有用的 Method。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">every</span><span style="color: Olive;">(</span><span style="color: Blue;">callback</span><span style="color: Gray;">:</span><span style="color: Blue;">Function</span><span style="color: Gray;">, </span><span style="color: Blue;">thisObject</span><span style="color: Gray;">:* = </span><span style="color: Green;">null</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span></div></div>
<p>检测是否数组所有元素都满足 callback 方法指定的条件。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">some</span><span style="color: Olive;">(</span><span style="color: Blue;">callback</span><span style="color: Gray;">:</span><span style="color: Blue;">Function</span><span style="color: Gray;">, </span><span style="color: Blue;">thisObject</span><span style="color: Gray;">:* = </span><span style="color: Green;">null</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span></div></div>
<p>检测数组中是否有元素满足 callback 方法指定的条件。<span id="more-312"></span></p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">filter</span><span style="color: Olive;">(</span><span style="color: Blue;">callback</span><span style="color: Gray;">:</span><span style="color: Blue;">Function</span><span style="color: Gray;">, </span><span style="color: Blue;">thisObject</span><span style="color: Gray;">:* = </span><span style="color: Green;">null</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span></div></div>
<p>根据 callback 方法指定的条件过滤数组，返回由符合条件的元素组成的新数组</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">map</span><span style="color: Olive;">(</span><span style="color: Blue;">callback</span><span style="color: Gray;">:</span><span style="color: Blue;">Function</span><span style="color: Gray;">, </span><span style="color: Blue;">thisObject</span><span style="color: Gray;">:* = </span><span style="color: Green;">null</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span></div></div>
<p>数组的每一个元素执行 callback 方法，返回由对应的结果组成的新数组</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">forEach</span><span style="color: Olive;">(</span><span style="color: Blue;">callback</span><span style="color: Gray;">:</span><span style="color: Blue;">Function</span><span style="color: Gray;">, </span><span style="color: Blue;">thisObject</span><span style="color: Gray;">:* = </span><span style="color: Green;">null</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span></div></div>
<p>数组的每一个元素执行 callback 方法，不返回任何值<br />
　　第二个参数 thisObject 是第一个参数 callback 的执行范围，即方法内部的 this ，一般不需指定。callback 的参数也都是一样的</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">callback</span><span style="color: Olive;">(</span><span style="color: Blue;">item</span><span style="color: Gray;">:*, </span><span style="color: Blue;">index</span><span style="color: Gray;">:</span><span style="color: Blue;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">array</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Olive;">)</span></div></div>
<p>　　item 就是数组的每一个元素，如果数组元素类型统一就指明该类型，否则用 * 。index是数组当前元素的索引，array是操作的数组。参数名称可以任意起。如果只使用第一个参数这些方法都不改变原数组，使用后两个参数则可对原数组进行操作。不推荐这样做。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">TestArray</span><span style="color: Olive;">(){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">arr1</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Gray;"> = </span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Gray;">,</span><span style="color: Maroon;">3</span><span style="color: Gray;">,</span><span style="color: Maroon;">5</span><span style="color: Gray;">,</span><span style="color: Maroon;">7</span><span style="color: Gray;">,</span><span style="color: Maroon;">9</span><span style="color: Gray;">,</span><span style="color: Maroon;">11</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//是否所有元素是两位数(false)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: Blue;">arr1</span><span style="color: Gray;">.</span><span style="color: Blue;">every</span><span style="color: Olive;">(</span><span style="color: Blue;">isDoubleDigit</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//是否有两位数的元素(true)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: Blue;">arr1</span><span style="color: Gray;">.</span><span style="color: Blue;">some</span><span style="color: Olive;">(</span><span style="color: Blue;">isDoubleDigit</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//arr1数组元素执行doubleObject方法的返回值组成新的arr2数组</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">arr2</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Gray;"> = </span><span style="color: Blue;">arr1</span><span style="color: Gray;">.</span><span style="color: Blue;">map</span><span style="color: Olive;">(</span><span style="color: Blue;">doubleObject</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//arr3是arr2中满足 bigDouble 条件的元素组成的新数组</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">arr3</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Gray;"> = </span><span style="color: Blue;">arr2</span><span style="color: Gray;">.</span><span style="color: Blue;">filter</span><span style="color: Olive;">(</span><span style="color: Blue;">bigDouble</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">arr1:</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Blue;">arr1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">arr2 double :</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">arr2</span><span style="color: Gray;">.</span><span style="color: Blue;">forEach</span><span style="color: Olive;">(</span><span style="color: Blue;">traceDouble</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">arr3 double :</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">arr3</span><span style="color: Gray;">.</span><span style="color: Blue;">forEach</span><span style="color: Olive;">(</span><span style="color: Blue;">traceDouble</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//double方法使用了后两个参数，直接修改了原数组</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">arr1</span><span style="color: Gray;">.</span><span style="color: Blue;">forEach</span><span style="color: Olive;">(</span><span style="color: Blue;">double</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">arr1:</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Blue;">arr1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">isDoubleDigit</span><span style="color: Olive;">(</span><span style="color: Blue;">n</span><span style="color: Gray;">:</span><span style="color: Blue;">int</span><span style="color: Gray;">,</span><span style="color: Blue;">i</span><span style="color: Gray;">:</span><span style="color: Blue;">int</span><span style="color: Gray;">,</span><span style="color: Blue;">a</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">n</span><span style="color: Gray;"> &gt; </span><span style="color: Maroon;">10</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">doubleObject</span><span style="color: Olive;">(</span><span style="color: Blue;">n</span><span style="color: Gray;">:</span><span style="color: Blue;">int</span><span style="color: Gray;">,</span><span style="color: Blue;">i</span><span style="color: Gray;">:</span><span style="color: Blue;">int</span><span style="color: Gray;">,</span><span style="color: Blue;">a</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Blue;">Object</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Blue;">double</span><span style="color: Gray;">:</span><span style="color: Blue;">n</span><span style="color: Gray;"> * </span><span style="color: Maroon;">2</span><span style="color: Olive;">}</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">bigDouble</span><span style="color: Olive;">(</span><span style="color: Blue;">o</span><span style="color: Gray;">:</span><span style="color: Blue;">Object</span><span style="color: Gray;">,</span><span style="color: Blue;">i</span><span style="color: Gray;">:</span><span style="color: Blue;">int</span><span style="color: Gray;">,</span><span style="color: Blue;">a</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">o</span><span style="color: Gray;">.</span><span style="color: Blue;">double</span><span style="color: Gray;"> &gt; </span><span style="color: Maroon;">10</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">traceDouble</span><span style="color: Olive;">(</span><span style="color: Blue;">o</span><span style="color: Gray;">:</span><span style="color: Blue;">Object</span><span style="color: Gray;">,</span><span style="color: Blue;">i</span><span style="color: Gray;">:</span><span style="color: Blue;">int</span><span style="color: Gray;">,</span><span style="color: Blue;">a</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: Blue;">o</span><span style="color: Gray;">.</span><span style="color: Blue;">double</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">double</span><span style="color: Olive;">(</span><span style="color: Blue;">n</span><span style="color: Gray;">:</span><span style="color: Blue;">int</span><span style="color: Gray;">,</span><span style="color: Blue;">i</span><span style="color: Gray;">:</span><span style="color: Blue;">int</span><span style="color: Gray;">,</span><span style="color: Blue;">a</span><span style="color: Gray;">:</span><span style="color: Blue;">Array</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Blue;">Object</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">a</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> *= </span><span style="color: Maroon;">2</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>输出：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">false</span><span style="color: Gray;"><br /></span><span style="color: Green;">true</span><span style="color: Gray;"><br /></span><span style="color: Blue;">arr1</span><span style="color: Gray;">: </span><span style="color: Maroon;">1</span><span style="color: Gray;">,</span><span style="color: Maroon;">3</span><span style="color: Gray;">,</span><span style="color: Maroon;">5</span><span style="color: Gray;">,</span><span style="color: Maroon;">7</span><span style="color: Gray;">,</span><span style="color: Maroon;">9</span><span style="color: Gray;">,</span><span style="color: Maroon;">11</span><span style="color: Gray;"><br /></span><span style="color: Blue;">arr2</span><span style="color: Gray;"> </span><span style="color: Blue;">double</span><span style="color: Gray;"> :<br /></span><span style="color: Maroon;">2</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">6</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">10</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">14</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">18</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">22</span><span style="color: Gray;"><br /></span><span style="color: Blue;">arr3</span><span style="color: Gray;"> </span><span style="color: Blue;">double</span><span style="color: Gray;"> :<br /></span><span style="color: Maroon;">14</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">18</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">22</span><span style="color: Gray;"><br /></span><span style="color: Blue;">arr1</span><span style="color: Gray;">: </span><span style="color: Maroon;">2</span><span style="color: Gray;">,</span><span style="color: Maroon;">6</span><span style="color: Gray;">,</span><span style="color: Maroon;">10</span><span style="color: Gray;">,</span><span style="color: Maroon;">14</span><span style="color: Gray;">,</span><span style="color: Maroon;">18</span><span style="color: Gray;">,</span><span style="color: Maroon;">22</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2006/08/27/as3-note-array/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

