<?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"
	>

<channel>
	<title>愚人呓语 &#187; 学海沉舟 · [技术]</title>
	<atom:link href="http://eidiot.net/category/learning/feed/" rel="self" type="application/rss+xml" />
	<link>http://eidiot.net</link>
	<description>eidiot's blog. My flapdoodles.</description>
	<pubDate>Thu, 30 Oct 2008 04:18:00 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>查看Flex生成的AS代码</title>
		<link>http://eidiot.net/2008/10/30/see-generated-as-code-from-flex-mxml/</link>
		<comments>http://eidiot.net/2008/10/30/see-generated-as-code-from-flex-mxml/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 04:15:32 +0000</pubDate>
		<dc:creator>eidiot</dc:creator>
		
		<category><![CDATA[学海沉舟 · [技术]]]></category>

		<category><![CDATA[Flex Builder]]></category>

		<guid isPermaLink="false">http://eidiot.net/?p=492</guid>
		<description><![CDATA[　　Flex的MXML先要编译成AS，然后再编译成SWF。通过 keep-generated-actionscript 编译参数可以保存这些代码。这对学习Flex的Framework很有帮助。

右击项目，选择 Properties，选择 Flex Compiler ，在 Additional compiler arguments: 下加上 -keep-generated-actionscript：


在项目的 src 目录下将生成一个 generated 文件夹：


除了项目对应的 -generated.as 和 -interface.as 外，还有一些 Style.as 和 _properties.as:


另外，Flex Framework 的源代码可以在这里找到：
[Flex Builder 安装路径]\sdks\[Flex 版本号]\frameworks\projects\framework\src
在我的机器上是：
D:\Program Files\Adobe\Flex Builder 3 Plug-in\sdks\3.1.0\frameworks\projects\framework\src
]]></description>
			<content:encoded><![CDATA[<p>　　Flex的MXML先要编译成AS，然后再编译成SWF。通过 <strong>keep-generated-actionscript</strong> 编译参数可以保存这些代码。这对学习Flex的Framework很有帮助。<br />
<br />
右击项目，选择 <strong>Properties</strong>，选择 <strong>Flex Compiler</strong> ，在 <strong>Additional compiler arguments:</strong> 下加上 <strong>-keep-generated-actionscript</strong>：<br />
<img src="http://eidiot.net/wp-content/uploads/2008/10/mxmltoas/compiler_argument.gif" alt="add compiler argument" /><br />
<span id="more-492"></span><br />
在项目的 src 目录下将生成一个 generated 文件夹：<br />
<img src="http://eidiot.net/wp-content/uploads/2008/10/mxmltoas/generated_folder.gif" alt="generated folder" /><br />
<br />
除了项目对应的 -generated.as 和 -interface.as 外，还有一些 Style.as 和 _properties.as:<br />
<img src="http://eidiot.net/wp-content/uploads/2008/10/mxmltoas/generated_files.gif" alt="generated files" /><br />
<br />
另外，Flex Framework 的源代码可以在这里找到：<br />
<strong>[Flex Builder 安装路径]</strong>\sdks\<strong>[Flex 版本号]</strong>\frameworks\projects\framework\src<br />
在我的机器上是：<br />
D:\Program Files\Adobe\Flex Builder 3 Plug-in\sdks\3.1.0\frameworks\projects\framework\src</p>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2008/10/30/see-generated-as-code-from-flex-mxml/feed/</wfw:commentRss>
		</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="lizip">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: Teal;">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>
		</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 t_stageW : Number = t_info.width;// 载入MC的舞台高度var t_stageH : Number = t_info.height;// [...]]]></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: Teal;">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: Teal;">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: Teal;">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: Teal;">bytesLoaded</span><span style="color: Gray;">, </span><span style="color: Blue;">p_e</span><span style="color: Gray;">.</span><span style="color: Teal;">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: Teal;">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: Teal;">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: Teal;">Number</span><span style="color: Gray;"> = </span><span style="color: Blue;">t_info</span><span style="color: Gray;">.</span><span style="color: Teal;">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: Teal;">Number</span><span style="color: Gray;"> = </span><span style="color: Blue;">t_info</span><span style="color: Gray;">.</span><span style="color: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">text</span><span style="color: Gray;"> = </span><span style="color: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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="lizip">下载源文件</a> zip 1267K
</div>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2007/06/16/swf-player/feed/</wfw:commentRss>
		</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 的类似结构：


加载到子域(模块)
类似于“继承”，子域可以直接获得父域所有的类定义，反之父域得不到子域的。和继承关系不同的是，如果子域中有和父域同名的类，子域定义会被忽略而使用父域的定义。
	
加载到同域(运行时共享库)
类似集合里的合并关系。被加载swf里的所有类定义被合并到当前域中可以直接使用。和加载到子域相同，和当前域同名的定义也会被忽略。
	
加载到新域(独立运行的程序或模块)
swf载入指定域之前，先要检查该域及其父域中是否存在同名类，重复定义一概忽略。如果加载别人写的程序，或者使用旧版本的主程序加载新版本的模块，为避免类名冲突就要加载到新域独立运行以使用自己的类。
	

　　模块加载到同域不是一样可以吗？为何要加载到子域呢？好处就在于，卸载一个加载到子域的模块时，只要确保清除所有到该模块的引用，模块的所有类定义将被垃圾回收(Garbage Collection)。
　　有两种方式可以访问 ApplicationDomain :

ApplicationDomain.currentDomain
currentDomain是ApplicationDomain的静态变量，表示当前代码所在的域。该变量很奇特，在主程序里指向主域，在加载到子域的模块里则指向该模块所在的子域。虽然 ApplicationDomain 有个 parentDomain 属性，但子域已经自动获得了父域的类定义，所以通过 ApplicationDomain.currentDomain 就可以获取父域定义了——包括主程序和加载到主域的共享库。(注：系统域不可直接访问，主域和所有新域即系统域子域的parentDomain属性为null)
	
LoaderInfo类的applicationDomain属性
此方式可以访问任何方式加载的swf的 ApplicationDomain。对于主程序来说，加载到同域的库定义已经存在于 ApplicationDomain.currentDomain [...]]]></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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">login</span><span style="color: Gray;">.</span><span style="color: Teal;">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>　　主程序收到事件之后卸载注册模块，加载“结果模块”到子域，并将登录模块传出的&#8221;userName&#8221;参数传给结果模块。</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: Teal;">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: Teal;">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: Teal;">Function</span><span style="color: Gray;"> = </span><span style="color: Blue;">p_libClass</span><span style="color: Gray;">.</span><span style="color: Teal;">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: Teal;">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="lirar">源代码</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="lirar">下载源文件</a> (rar 278K)
</div>
]]></content:encoded>
			<wfw:commentRss>http://eidiot.net/2007/06/03/applicationdomain/feed/</wfw:commentRss>
		</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>
		</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&#8230; -> 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: Teal;">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&#8230; -> 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>
		</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号“预备将军”收到八名“开启士兵”的报告，归还“行动令牌”，晋为“关闭将军”。
元帅收回“行动令牌”，将0号加入“关闭将军名录”，1到8号加入“开启士兵名录”。

　　此过程结果如下（方格右上角数字是人员编号，左下角是G，右下角是H，左上角是F）：

　　第一轮探索任务完成，元帅开始检查“开启士兵名录”。此时名录中有8名人员，其中1号F值最低为40（起点右移一格，G值为10，到终点平移3格，H值为30，F = G + H = 40），向其发出“行动令牌”。

1号“开启士兵”接到“行动令牌”，晋为“预备将军”，探索周围格子。
周围8个格子中有3格障碍，跳过。一格是“关闭将军”，跳过。其余四格是“开启士兵”，检查如果从该位置过去G值是否更低。以2号为例，如果从1号过去G值为 10 + 14 = 24 （1号的G值加上1号到2号的步数）,而2号原来的G值是10，不做处理（如果此时发现新的G值更低，则更新2号的G值，并改2号的“父将”为1号）。其他类推。
1号检测完周围的方格，不需做任何处理，归还“行动令牌”，晋为“关闭将军”。
元帅收回“行动令牌”，将1号加入“关闭将军名录”。

　　此过程结果如下：

　　第二轮结束，元帅再次检查“开启士兵名录”。此时还有7名“开启士兵”，5号和8号的F值都为最低的54，选择不同寻路的结果也将不同。元帅选择了最后加入的8号“开启士兵”发出“行动令牌”，过程同上，不赘述，结果如下：

　　重复这个过程直到某位“关闭将军”站到了终点上（或者“开启士兵”探测到了终点，这样更快捷，但某些情况找到的路径不够短），亦即找到了路径；或是“开启士兵名录”已空，无法到达终点。
　　下面整理一下全过程并翻译成“标准语言”，首先是各名词：

“开启士兵名录” - 开启列表 - open list
“关闭将军名录” - 关闭列表 - closed list
“父将” - 父节点 - parent square
F - 路径评分
G [...]]]></description>
			<content:encoded><![CDATA[<p>　　游戏时代群雄并起，寻路乃中原逐鹿第一步，重要性不言而喻。今习得寻路战术之首A*算法，为大家操演一番，不足之处还望不吝赐教。可以选择阅读下面的内容，或者先看看 <a href="http://eidiot.net/code/astar/test.swf" target="_blank" class="liswf">寻路示例</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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_startY</span><span style="color: Gray;"> : </span><span style="color: Teal;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_endX</span><span style="color: Gray;"> : </span><span style="color: Teal;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_endY</span><span style="color: Gray;"> : </span><span style="color: Teal;">int</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Teal;">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: Teal;">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: Teal;">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: Teal;">Math</span><span style="color: Gray;">.</span><span style="color: Teal;">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: Teal;">Math</span><span style="color: Gray;">.</span><span style="color: Teal;">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: Teal;">getPath</span><span style="color: Olive;">(</span><span style="color: Blue;">p_startX</span><span style="color: Gray;"> : </span><span style="color: Teal;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_startY</span><span style="color: Gray;"> : </span><span style="color: Teal;">int</span><span style="color: Gray;">, </span><span style="color: Blue;">p_id</span><span style="color: Gray;">: </span><span style="color: Teal;">int</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">Math</span><span style="color: Gray;">.</span><span style="color: Teal;">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: Teal;">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: Teal;">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: Teal;">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: Teal;">int</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Teal;">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="liswf">查看寻路示例</a><br />
<a href="http://eidiot.net/code/astar/code/TestAStar.zip" target="_blank" class="lizip">下载示例源文件</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:encod