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

<channel>
	<title>神の翩翩夏日 &#187; ActionScript</title>
	<atom:link href="http://www.glglife.com/category/as/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.glglife.com</link>
	<description>生命在于折腾</description>
	<lastBuildDate>Sun, 13 Nov 2011 11:15:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>moock的《Essential ActionScript 3.0》中文版似乎也要出了</title>
		<link>http://www.glglife.com/2008/02/03/moock-the-u0026quotessential-actionscript-30u0026quot-chinese-version-seems-to-have-a/</link>
		<comments>http://www.glglife.com/2008/02/03/moock-the-u0026quotessential-actionscript-30u0026quot-chinese-version-seems-to-have-a/#comments</comments>
		<pubDate>Sun, 03 Feb 2008 09:53:34 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Essential]]></category>
		<category><![CDATA[中文版]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/02/03/moock%e7%9a%84%e3%80%8aessential-actionscript-30%e3%80%8b%e4%b8%ad%e6%96%87%e7%89%88%e4%bc%bc%e4%b9%8e%e4%b9%9f%e8%a6%81%e5%87%ba%e4%ba%86/</guid>
		<description><![CDATA[由机械工业出版社出版，似乎还在找译者&#8230;&#8230;大概一年后可以看到第一版吧&#8230;&#8230;这本书...]]></description>
			<content:encoded><![CDATA[<p>由机械工业出版社出版，似乎还在找译者&hellip;&hellip;大概一年后可以看到第一版吧&hellip;&hellip;</p>
<p>这本书900多页，约莫有个1、2斤重吧，原版售价是55美刀，不知道翻译成中文多少钱&hellip;&hellip;不过有一点是可以肯定的，出来后，我肯定不会邮购的，太重了，邮费都可以差不多可以买<a href="http://goday.blogbus.com/logs/13952991.html" onclick="pageTracker._trackPageview('/outgoing/goday.blogbus.com/logs/13952991.html?referer=');">《ActionScript 3.0 making things move》</a>了，等也要等当地新华书店出&hellip;&hellip;</p>
<p>希望在那之前能将已入手的Cookbook用熟&hellip;&hellip;</p>
<p>附加：原文全本下载：</p>
<p><a href="http://www.nshen.net/blog/article.asp?id=507" onclick="pageTracker._trackPageview('/outgoing/www.nshen.net/blog/article.asp?id=507&amp;referer=');">http://www.nshen.net/blog/article.asp?id=507</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/02/03/moock-the-u0026quotessential-actionscript-30u0026quot-chinese-version-seems-to-have-a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让 Flash 广告具有记忆功能</title>
		<link>http://www.glglife.com/2008/02/03/let-flash-ads-with-memory-function/</link>
		<comments>http://www.glglife.com/2008/02/03/let-flash-ads-with-memory-function/#comments</comments>
		<pubDate>Sun, 03 Feb 2008 09:33:32 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[不循环]]></category>
		<category><![CDATA[刷新]]></category>
		<category><![CDATA[广告]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/02/03/%e8%ae%a9-flash-%e5%b9%bf%e5%91%8a%e5%85%b7%e6%9c%89%e8%ae%b0%e5%bf%86%e5%8a%9f%e8%83%bd/</guid>
		<description><![CDATA[当你常去的论坛上有个 Flash 广告,而你每次刷新页面的时候它都从头播放.会不会感觉很烦? 所以我们要改装一下这个Flash.给他植入记忆功能.

要实现的效果:刷新或关闭页面的时候记住上次的播放头位置.下一次打开页面动画接着上一次的位置继续播放.

应用:效果可以看经典论坛的 Banner 广告.http://bbs.blueidea.com

实现代码如下(发布成AS1/AS2):var deng = SharedObject.getLocal(&#8216;remember&#8217;);if (deng.data.pos != undefined) {gotoAndPlay(deng.data.pos);}this.onEnterFrame = function () {deng.data.pos = _currentframe;};deng.flush();

<span class="readmore"><a href="http://www.glglife.com/2008/02/03/let-flash-ads-with-memory-function/" title="让 Flash 广告具有记忆功能">阅读全文——共381字</a></span>]]></description>
			<content:encoded><![CDATA[<div class="post-content">
<p>当你常去的论坛上有个 Flash 广告,而你每次刷新页面的时候它都从头播放.<br />会不会感觉很烦? 所以我们要改装一下这个Flash.给他植入记忆功能.</p>
<p>要实现的效果:<br />刷新或关闭页面的时候记住上次的播放头位置.<br />下一次打开页面动画接着上一次的位置继续播放.</p>
<p>应用:效果可以看经典论坛的 Banner 广告.<br /><a href="http://bbs.blueidea.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/bbs.blueidea.com/?referer=');">http://bbs.blueidea.com</a></p>
<p>实现代码如下(发布成AS1/AS2):<br />var deng = SharedObject.getLocal(&#8216;remember&#8217;);<br />if (deng.data.pos != undefined) {<br />gotoAndPlay(deng.data.pos);<br />}<br />this.onEnterFrame = function () {<br />deng.data.pos = _currentframe;<br />};<br />deng.flush();</p>
<p>最后,感谢 <a href="http://www.macromedia.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.macromedia.com/?referer=');">MM</a> 实现的 <a href="http://www.google.cn/search?sourceid=navclient&amp;ie=UTF-8&amp;rlz=1T4GGLJ_en___CN216&amp;q=SharedObject" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.google.cn/search?sourceid=navclient_amp_ie=UTF-8_amp_rlz=1T4GGLJ_en_CN216_amp_q=SharedObject&amp;referer=');">SO</a><br />很好,很强大.<br />绿色而且环保.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/02/03/let-flash-ads-with-memory-function/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一些不太常见的代码写法</title>
		<link>http://www.glglife.com/2008/01/29/some-less-common-code-written/</link>
		<comments>http://www.glglife.com/2008/01/29/some-less-common-code-written/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 01:14:54 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[少见写法]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/29/%e4%b8%80%e4%ba%9b%e4%b8%8d%e5%a4%aa%e5%b8%b8%e8%a7%81%e7%9a%84%e4%bb%a3%e7%a0%81%e5%86%99%e6%b3%95/</guid>
		<description><![CDATA[先看一下下面的代码，看是否每个都知道是干什么的，稍后我再把每一个代码的作用帖上。首先声明一下，写下述代码的目的不是让大家模糊代码，只是看到这样的代码时心中有数，呵呵，另外也希望能有朋友补充一下（注意，以下代码仅为示例，但大部分代码对于高手来说是不成问题的）

&#160;1、mc.gotoAndPlay(Math.random()*10&#62;&#62;0);//Math.random()*10 取 10以内带小数的随机数。&#62;&#62; 是移位符号 &#62;&#62;0 的功能去除小数点后的数！！（这个方法的确高明）所以 Math.random()*10&#62;&#62;0 整句话的意思是 获取10以内的随机整数！

-------------------------------------------

推广的想 用在加载进度条中trace((已经加载的字节数/总字节数}*100&#62;&#62;0+&#34;%&#34;) 的确很方便啊！

<span class="readmore"><a href="http://www.glglife.com/2008/01/29/some-less-common-code-written/" title="一些不太常见的代码写法">阅读全文——共2874字</a></span>]]></description>
			<content:encoded><![CDATA[<p>先看一下下面的代码，看是否每个都知道是干什么的，稍后我再把每一个代码的作用帖上。首先声明一下，写下述代码的目的不是让大家模糊代码，只是看到这样的代码时心中有数，呵呵，另外也希望能有朋友补充一下（注意，以下代码仅为示例，但大部分代码对于高手来说是不成问题的）</p>
<p>&nbsp;<code>1、mc.gotoAndPlay(Math.random()*10&gt;&gt;0);<br />//Math.random()*10 取 10以内带小数的随机数。<br />&gt;&gt; 是移位符号 &gt;&gt;0 的功能去除小数点后的数！！（这个方法的确高明）<br />所以 Math.random()*10&gt;&gt;0 整句话的意思是 获取10以内的随机整数！</p>
<p>-------------------------------------------</p>
<p>推广的想 <br />用在加载进度条中<br />trace((已经加载的字节数/总字节数}*100&gt;&gt;0+&quot;%&quot;) <br />的确很方便啊！</p>
<p>2、if(i&amp;1){}<br />//i&amp;1 的意思就是判断 i是奇数还是偶数 <br />如果是奇数i的2进制表示最后一位是1,i&amp;1=1 真 <br />偶数i的2进制表示最后一位是0, i&amp;1=0 假。</p>
<p>3、for (var i:int=0; i&lt;10; a.push(i++));<br />//此循环执行后a数组的值为 0,1,2,3,4,5,6,7,8,9.<br />一个简化程序的方法<br />能用上的地方有很多。。具体地方具体分析。。</p>
<p>4、var temp:Number=mouseX;<br />stage.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler);<br />function moveHandler(e:MouseEvent):void {<br />var d:Number=(-temp+(temp=mouseX)); <br />}<br />//这段代码功能是 获取鼠标移动距离 d <br />用在鼠标拖拽窗体或者鼠标拖拽游戏上真是不要太爽！！！<br />代码完全可以改为<br />Mouse.hide();<br />var temp:Number=mouseX;<br />stage.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler);<br />function moveHandler(e:MouseEvent):void {<br />&nbsp; &nbsp; var d:Number=(-temp+(temp=mouseX)); <br />&nbsp; &nbsp; spriteMouse.x += d;<br />&nbsp; &nbsp; e.updateAfterEvent();<br />}<br />这样 spriteMouse 这个影片剪辑就成了一个鼠标</p>
<p>5、function fn1 () {<br />trace(&quot;1&quot;);<br />}<br />function fn2 () {<br />trace(&quot;2&quot;);<br />}<br />([fn1,fn2][Math.random()*2&gt;&gt;0])();</code></p>
<p><code>//这个是随机执行函数的命令 挺有意思的 </p>
<p>如 一个欢迎界面<br />function fn1 () {<br />trace(&quot;你来啦欢迎啊&quot;);<br />}<br />function fn2 () {<br />trace(&quot;来了你别走啊 &quot;);<br />}<br />function fn3 () {<br />trace(&quot;你这么才来啊&quot;);<br />}<br />function fn4 () {<br />trace(&quot;就猜到你要来&quot;);<br />}<br />([fn1,fn2,fn3,fn4][Math.random()*4&gt;&gt;0])();</p>
<p>6、var a:int=3;<br />if (a&gt;0&amp;&amp;(trace(&quot;a is positive number&quot;),a&amp;1))<br />&nbsp;&nbsp;trace(&quot;a is positive odd&nbsp;&nbsp;number&quot;); </code></p>
<p><code>&nbsp;//先执行a&gt;0 真<br />再执行 trace(&quot;a is positive number&quot;)<br />最后判断a是不是奇数<br />这里的逗号表达式是从左向右执行的。</p>
<p>此用法主要 用来判断有没有执行某处语句 吧</code><code></code><code>
<p>7、var a:int=13;<br />var b:int=-12;<br />if((a^b)&gt;0||(b*=-1,a&gt;10))<br />trace(b);<br />//又是一个逗号表达式<br />a^b = -7 <br />b*=-1 b=12<br />a&gt;10<br />输出 b=12<br />此用法看的莫名其妙 真不知道应该用在什么地方<br />哈哈～</p>
<p>------------我是分割线--------很华丽的分割一下---------------------</p>
<p>总结：</p>
<p><font face="Courier New">1、把：<br />//mc跳转到10以内的随机帧<br />mc.gotoAndPlay(Math.floor(Math.random()*10));<br />写成：<br />mc.gotoAndPlay(Math.random()*10&gt;&gt;0);</p>
<p>2、把：<br />if(i%2==1){}//判断如果i是奇数,执行大括号中的语句<br />写成：<br />if(i&amp;1){}</p>
<p>3、把：<br />//给一个数组压入10以内的整数<br />var a:Array=[];<br />for (var i:int=0; i&lt;10; i++) {<br />&nbsp; &nbsp; &nbsp; &nbsp; a.push(i);<br />}<br />写成：<br />//for语句后如果有一行代码要执行，可以省去大括号，这里只用分号相当于执行空语句<br />for (var i:int=0; i&lt;10; a.push(i++));</p>
<p>4、把：<br />//计算鼠标移动的水平速度<br />var temp:Number=mouseX;<br />stage.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler);<br />function moveHandler(e:MouseEvent):void {<br />&nbsp; &nbsp; &nbsp; &nbsp; var d:Number=mouseX-temp;<br />&nbsp; &nbsp; &nbsp; &nbsp; temp=mouseX;<br />}<br />写成：<br />var temp:Number=mouseX;<br />stage.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler);<br />function moveHandler(e:MouseEvent):void {<br />&nbsp; &nbsp; &nbsp; &nbsp; var d:Number=(-temp+(temp=mouseX));&nbsp; &nbsp; &nbsp; &nbsp; <br />}</p>
<p>5、把：<br />//随机运行几个函数中的一个<br />function fn1 () {<br />&nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;1&quot;);<br />}<br />function fn2 () {<br />&nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;2&quot;);<br />}<br />var a:Array=[fn1,fn2];<br />var b:int=Math.random()*2&gt;&gt;0;<br />a[b]();<br />写成：<br />function fn1 () {<br />&nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;1&quot;);<br />}<br />function fn2 () {<br />&nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;2&quot;);<br />}<br />([fn1,fn2][Math.random()*2&gt;&gt;0])();</p>
<p>6、把：<br />//多重条件语句<br />var a:int=6;<br />if (a&gt;0) {<br />&nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;a is positive number&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; if (a&amp;1) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;a is positive odd&nbsp;&nbsp;number&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />}<br />可以写成：<br />var a:int=3;<br />if (a&gt;0&amp;&amp;(trace(&quot;a is positive number&quot;),a&amp;1)) <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace(&quot;a is positive odd&nbsp;&nbsp;number&quot;);&nbsp; &nbsp; &nbsp; &nbsp; </p>
<p>7、把：<br />var a:int=13;<br />var b:int=-12;<br />if (!((a^b)&gt;0)) {<br />&nbsp; &nbsp; &nbsp; &nbsp; b*=-1;<br />}<br />if ((a^b)&gt;0||a&gt;10) {<br />&nbsp; &nbsp; &nbsp; &nbsp; trace(b);<br />}<br />写成：<br />var a:int=13;<br />var b:int=-12;<br />if((a^b)&gt;0||(b*=-1,a&gt;10))<br />trace(b);</p>
<p>6和7主要用到了&amp;&amp;和||是短路运算符。&amp;&amp;之左的语句返回true才执行右边的语句。<br />||之左的语句返回false才执行右边的语句。另外还用到了逗号表达式，返回值为最<br />后一个逗号右边的语句的返回值。</font></p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/29/some-less-common-code-written/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ActionScript3 CookBook</title>
		<link>http://www.glglife.com/2008/01/22/actionscript3-cookbook/</link>
		<comments>http://www.glglife.com/2008/01/22/actionscript3-cookbook/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 20:18:18 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[COOKBOOK]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/22/actionscript3-cookbook/</guid>
		<description><![CDATA[刚才打电话给电子工业，这书终于出版了&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;明天入库，然后发...]]></description>
			<content:encoded><![CDATA[<p>刚才打电话给电子工业，这书终于出版了&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;明天入库，然后发过来，呃&hellip;&hellip;11天&hellip;&hellip;11天啊&hellip;&hellip;继续等吧&hellip;&hellip;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/22/actionscript3-cookbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>测试AS代码的执行速度</title>
		<link>http://www.glglife.com/2008/01/21/as-code-to-test-the-implementation-of-speed/</link>
		<comments>http://www.glglife.com/2008/01/21/as-code-to-test-the-implementation-of-speed/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 04:12:24 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[速度]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/21/%e6%b5%8b%e8%af%95as%e4%bb%a3%e7%a0%81%e7%9a%84%e6%89%a7%e8%a1%8c%e9%80%9f%e5%ba%a6/</guid>
		<description><![CDATA[<a href="http://www.glglife.com/2008/01/21/as-code-to-test-the-implementation-of-speed/"><img align="right" hspace="5" width="50" src="http://photo1.bababian.com/upload6/20080120/8C3EAC5FDE4B17D23111773CDE200487.jpg" class="alignright wp-post-image tfe" alt="" title="" /></a>在帧标签的动作栏中,输入: var i = 0; var chongfucishu = 1000; t = getTimer(); while (i&#160;&#160;&#038;nb...]]></description>
			<content:encoded><![CDATA[<p><img src="http://photo1.bababian.com/upload6/20080120/8C3EAC5FDE4B17D23111773CDE200487.jpg" border="0" alt="" width="1" height="1" />在帧标签的动作栏中,输入: </p>
<p>var i = 0; <br />var chongfucishu = 1000; <br />t = getTimer(); <br />while (i&nbsp;&nbsp;&nbsp; //代码放在这里 <br />&nbsp;&nbsp;&nbsp; i++; <br />} <br />trace(getTimer()-t); </p>
<p>测试时间有什么意义呢?可以帮助我们优化代码,同一个程序可以用多种方式编出来,最优的方式能改善swf的下载速度和读取时间,就是把swf放置在网上播放时,载入会快些~ </p>
<p>代码变化万千,没有最快,只有更快;没有最好,只有更好! </p>
<p>图示：<br /><img src="http://photo1.bababian.com/upload6/20080120/8C3EAC5FDE4B17D23111773CDE200487.jpg" border="0" alt="" width="504" height="203" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/21/as-code-to-test-the-implementation-of-speed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《ActionScript殿堂之路》第一版勘误(随发现陆续更新)</title>
		<link>http://www.glglife.com/2008/01/21/actionscript-hall-the-first-edition-of-corrigenda-as-found-in-one-after-another-update/</link>
		<comments>http://www.glglife.com/2008/01/21/actionscript-hall-the-first-edition-of-corrigenda-as-found-in-one-after-another-update/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 01:58:34 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[ActionScript殿堂之路]]></category>
		<category><![CDATA[勘误]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/21/%e3%80%8aactionscript%e6%ae%bf%e5%a0%82%e4%b9%8b%e8%b7%af%e3%80%8b%e7%ac%ac%e4%b8%80%e7%89%88%e5%8b%98%e8%af%af%e9%9a%8f%e5%8f%91%e7%8e%b0%e9%99%86%e7%bb%ad%e6%9b%b4%e6%96%b0/</guid>
		<description><![CDATA[<a href="http://www.glglife.com/2008/01/21/actionscript-hall-the-first-edition-of-corrigenda-as-found-in-one-after-another-update/"><img align="right" hspace="5" width="50" src="http://bbs.actionscript3.cn/images/smilies/default/sweat.gif" class="alignright wp-post-image tfe" alt="" title="" /></a>买了第一版的人看看吧，嗯&#8230;&#8230;我在考虑第二版出来是否要再买一本&#8230;&#8230;比较重要的勘...]]></description>
			<content:encoded><![CDATA[<p>买了第一版的人看看吧，嗯&hellip;&hellip;我在考虑第二版出来是否要再买一本&hellip;&hellip;</p>
<h2><font color="#ff0000">比较重要的勘误</font></h2>
<div class="t_msgfont"><strong><font color="#ff0000">（2007.11.29整理）</font></strong></div>
<div class="t_msgfont">
<ul>
<li>Page 29<br />第三段&quot;非零整数为索引&quot; =&gt; &ldquo;非负整数为索引&rdquo;</p>
</li>
<li>Page82<br />5.4节第一段最后一行<br />&ldquo;除了基元数据类型以外，其余数据类型都是值类型&rdquo; 中的 &ldquo;值类型&rdquo; 应改为 &ldquo;引用类型&rdquo;。<br />&ldquo;也不例外，都属于值类型&rdquo;中的&ldquo;值类型&rdquo;应改为&ldquo;引用类型&rdquo;
</li>
<li>page 222<br />最后一段，&ldquo;如果字符串不是可变对象&rdquo;，应该是&ldquo;如果字符串不是<strong>不变对象</strong>&rdquo;
</li>
<li>page 308<br />倒数第二段第二行开头的<br />&ldquo;hasListener&rdquo;请改成&ldquo;dispatchEvent&rdquo;
</li>
<li>page 342页<br />21.3.2节最后一行：<br />&rdquo;见21.3.2小节&ldquo; 改成&rdquo;见21.8节&ldquo;
</li>
<li>page411<br />请将第411页最后三行代码和第412页第一行代码去掉。
</li>
<li>page 412<br />最后一行 <br />circle.graphics.beginFill(0&#215;669900);<br />后面漏印了四行代码：<br />circle.graphics.drawCircle(0,0,10);<br />circle.graphics.endFill();<br />circle.x = 150, circle.y = 150;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />var rectA:RectSprite = new RectSprite(&quot;A&quot;, 0xffcc00);</li>
</ul>
</div>
<p>&nbsp;</p>
<h2><font color="#ff0000">比较次要的勘误</font></h2>
<div class="t_msgfont"><font color="#ff0000"><strong>（2007.11.29更新）</strong><br /></font></div>
<div class="t_msgfont">
<ul>
<li>page 38<br />p38的标题2.5.7中&nbsp;&nbsp;&quot;!===&quot;改成&quot;!==&quot;。目录中也错了。</p>
</li>
<li>page 51<br />最后一行：<br />for(var a:int=2,var b:int=12;(a+b)&lt;50;a++,b++){&#8230;}&nbsp;&nbsp;<br />改为：<br />for(var a:int=2, b:int=12;(a+b)&lt;50;a++,b++){&#8230;}&nbsp;&nbsp;
<p></li>
<li>Page87 <br />&ldquo;//类定义&rdquo;下的&ldquo;dynamic public class ClassSample&rdquo;，这个&ldquo;ClassSample&rdquo;应该改成&ldquo;SampleClass&rdquo;。
</li>
<li>Page87<br />最后一行 foo.sampleMethod();<br />应该是foo.sampleAMethod();
</li>
<li>Page 93<br />5.8节第二段倒数第二行：<br />那么编译器会负责这个对象在创建时调用这个函数&nbsp;&nbsp;=&gt; 那么编译器会负责告知这个对象在创建时需要调用这个函数
</li>
<li>page 183<br />第一段代码<br />trace(&quot;My name is &quot; + obj.name);<br />应该是<br />trace(&quot;hi, this is &quot; + obj.name);
</li>
<li>page 240<br />表14-4<br />正则表达式&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;可匹配<br />/k{2}a/&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Kka<br />可匹配的例子中 第一个的K大写了,应改为小写
</li>
<li>page 241<br />表14-5<br />/wa+/ 有笔误， &ldquo;重复1或多次，匹配w, wa, waaa, waaaaa&rdquo; =&gt; &ldquo;重复1或多次，匹配wa, waaa, waaaaa&rdquo;<br />/wa?/ 有笔误， &ldquo;重复0或1次，匹配w, wa, waaa, waaaaa&rdquo; =&gt; &ldquo;重复0或1次，匹配w,wa
<p></li>
<li>page 252 <br />倒数第二段第二行<br />&ldquo;如果在这两个标记之前的文本&hellip;&hellip;&rdquo;，应该是&ldquo;之间的&rdquo;
</li>
<li>P307-P308中的代码例子<br />将 &ldquo;class KingdaClass extends EventDispatcher&rdquo;的&quot;extends EventDispatcher&quot;去掉。复合EventDispatcher不需要继承自EventDispatcher。关于这个例子的更详细的讨论见：<a href="http://www.actionscript3.cn/bbs/thread-160-1-1.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.actionscript3.cn/bbs/thread-160-1-1.html?referer=');">http://www.actionscript3.cn/bbs/thread-160-1-1.html</a>
</li>
<li>P339<br />21.1.2第一段第二行，<br />原文：9个不太常用的9个属性&nbsp;&nbsp;=&gt; 9个不太常用的属性</li>
</ul>
</div>
<h2><font color="#ff0000">小勘误</font></h2>
<div id="postmessage_377" class="t_msgfont"><strong><font color="#ff0000">(2007.12.30更新)</font></strong>
<ul>
<li>page 293<br />倒数第三段倒数第二行，原文为：&ldquo;如果希望事件得到相应，必须要先为你的事件注册好正确的侦听器&rdquo;；<br />应该为：&ldquo;如果希望事件得到相应处理，必须要先为你的事件注册好正确的侦听器&rdquo;。</li>
<li>page 359<br />倒数第一段倒数第四行，&ldquo;当我们将一个显示对象星形foo&rdquo;，应该是，&ldquo;当我们将一个显示对象圆角矩形foo&rdquo;。<br />示例22&#8211;2注释<br />&quot;//生成一个StarShape。由于处于同一包中，不需要再import &quot; 应该是<br />&quot;//生成一个RectSprite。由于处于同一包中，不需要再import&quot;</li>
<li>page 356<br />表22&#8211;1，子显示对象数目属性,&ldquo;numberChildren:int&rdquo;应该为&ldquo;numChildren:int&quot;</li>
<li>page 391<br />倒数第二行&ldquo;使用类的第三方人员不太可能指导具体剪辑子元件的命名&rdquo;应该为&ldquo;使用类的第三方人员不太可能知道具体剪辑子元件的命名&rdquo;</li>
<li>page 397<br />第一段第一行，&ldquo;本章将讲述事件流机制与显示列表之前的关系&rdquo;应该为&ldquo;本章将讲述事件流机制与显示列表之间的关系&rdquo;</li>
</ul>
<p><strong>（2007.11.29更新）以下勘误已在第二次重印时纠正</strong>
<ul>
<li>Page 7 <br />1.2.1节&nbsp;&nbsp;3.密封类 一段最后一行<br />动态关键词dyanmic&nbsp;&nbsp;=&gt;&nbsp; &nbsp;dynamic .</p>
</li>
<li>Page18页<br />一字错误<br />1、在《ActionScript3.0殿堂之路》P18页中，&rdquo;2.变量名采用骆驼命名法&ldquo;应为&rdquo;2.变量名采用骆驼式命名法&ldquo;。<br />2、在其下的表述部分中&rdquo;骆驼式命令法&ldquo;应为&rdquo;骆驼式命名法&ldquo;。
</li>
<li>page 20<br />第二个代码块中，第4行：<br />//声明变量b,把变量a引用赋值给a <br />改为<br />//声明变量b,把变量a引用赋值给b
</li>
<li>Page 27<br />中间一段代码<br />for(var i:int = 0; i++){<br />floatB += 0.1;<br />c++;<br />}<br />上面的c++; 是多余的~~
</li>
<li>page34<br />代码中&ldquo;//声明一个int型f和unint型h&rdquo;应为&ldquo;//声明一个int型f和uint型h&rdquo;，unint错了，要改成uint
</li>
<li>page35的注释16的注解排版在了36页
</li>
<li>page 36<br />2.5.4节第一段第二行中间：<br />ravlue 改成 rvalue
</li>
<li>page61<br />注解1中严格模式[stric mode]应为[strict mode]
</li>
<li>Page 79 <br />第五段&ldquo;新建一个Rectangel.as文件&rdquo;=&gt;Rectangle.as文件
</li>
<li>Page 80<br />类名RectangelSample.as与类中的RectangleSample不同<br />应该改为RectangleSample吧.同P79 一样.的错误
</li>
<li>page 92<br />示例5-5下面一段：<br />&rdquo;每个静态变量都分配了&ldquo; 改成&rdquo;每个静态常量都分配了&ldquo;
</li>
<li>page 99<br />书上内容无误，光盘上源码org.kingda.book.basicoop.SampleOverload类中多写了个<br />private function overload():void {}<br />请去掉
</li>
<li>page101页<br />&ldquo;示例5-9 含有多个类的类文件&rdquo;上面说<br />新建一个&ldquo;Car.as&rdquo;文件，写入示例5-9的内容，但在示例5-9中的package内的类叫&ldquo;ToyCar&rdquo;,并不是&ldquo;Car&rdquo;。<br />请将&quot;Car.as&quot;都改成&ldquo;ToyCar.as&rdquo;。呵呵。
</li>
<li>page 148<br />第 11 行代码中的&ldquo;Mouse speak&quot;应改成&quot; Mouth speak&quot;
</li>
<li>P152<br />示例8-2中<br />usemoeny(euro);中的usemoeny改成usemoney,拼错了。
</li>
<li>page182<br />最上面代码部分的注释,两个 &ldquo;//单接口&rdquo;&nbsp;&nbsp;的下面那个 &ldquo;//单接口&rdquo;改成 &ldquo;//多接口&rdquo;
</li>
<li>page 225<br />13.6节第5段第1行<br />slic() 应该是 slice()
</li>
<li>page 226<br />13.6.2节上面一行<br />&ldquo;而是想知道长字符串中有没有暴寒这个子字符串&rdquo; 中的&quot;暴寒&quot; 改成&ldquo;包含&rdquo;&nbsp;&nbsp;<img src="http://bbs.actionscript3.cn/images/smilies/default/sweat.gif" border="0" alt="" /> <br />13.6.2节下第三段后：<br />&nbsp; &nbsp; subtstring: 长字符串变量.substring(起点变量，终点变量)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br />&nbsp; &nbsp; slice&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;: 长字符串变量.substring(起点变量，终点变量)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#8212;&#8211;》 substring 应改为：slice<br />&nbsp; &nbsp; substr&nbsp; &nbsp;&nbsp;&nbsp;: 长字符串变量.substring(起点变量，要截取的字符串长度)&nbsp; &nbsp;&nbsp; &nbsp; &#8212;&#8211;》substring 应改为：substr
</li>
<li>page 239<br />第二段代码块，在页面中间<br />&quot;tce (targetStr.match(foo));<br />改成：<br />&quot;trace (targetStr.match(foo));
</li>
<li>page 240<br />倒数第1行中：&ldquo;如k{4,}表示匹配出现次数大于3的k字符&rdquo;请改成&ldquo;出现次数至少为4的k字符&rdquo;，这样更加贴切一些。
</li>
<li>page 253<br />实例15-3下面一段第二行<br />&ldquo;同一类的数据用了两种元素(rl和web)&rdquo;<br />应为<br />&ldquo;同一类的数据用了两种元素(url和web)&rdquo;
</li>
<li>page 338 <br />表最后一行<br />&quot;不管设成和值,&quot;改为&quot;不管设成何值,&quot;
</li>
<li>page355<br />倒第3段第二行&ldquo;&mdash;&mdash;Sprte，MovieClip&#8230;&ldquo;中Sprite少了个i，也是小疏忽
</li>
<li>page 413<br />24.4.2鼠标跟随 第二行<br />&ldquo;使用鼠标事件的updaetAfterEvnet()&rdquo; 手滑了 应为 updateAfterEvent()</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/21/actionscript-hall-the-first-edition-of-corrigenda-as-found-in-one-after-another-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我眼中的常量与变量</title>
		<link>http://www.glglife.com/2008/01/18/i-am-the-eyes-of-constant-and-variable/</link>
		<comments>http://www.glglife.com/2008/01/18/i-am-the-eyes-of-constant-and-variable/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 10:06:46 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[变量]]></category>
		<category><![CDATA[常量]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/18/%e6%88%91%e7%9c%bc%e4%b8%ad%e7%9a%84%e5%b8%b8%e9%87%8f%e4%b8%8e%e5%8f%98%e9%87%8f/</guid>
		<description><![CDATA[最重要的一点也是难点，你要想尽一切办法理解：值类型与引用类型的区别。&#160; &#160;&#160;&#160;在OOP(面...]]></description>
			<content:encoded><![CDATA[<div id="postmessage_717" class="t_msgfont"><strong>最重要的一点也是难点，你要想尽一切办法理解：值类型与引用类型的区别。</strong>&nbsp; &nbsp;&nbsp;&nbsp;<br />在OOP(面向<span class="t_tag">对象</span><span class="t_tag">程序</span>语言)<span class="t_tag">中</span>如果说&ldquo;一切都是<span class="t_tag">对象</span>&rdquo;(Everything is object),还不如说<strong>一切都是变量</strong>，在笔记一里我们说可以把对象的属性看成是变量。在这里我认为对象自身也可以看成是变量。&nbsp; &nbsp;&nbsp;&nbsp;<br />变量是编程所必需的。变量其实就是一个在程序运行时可以改变的量(从这个意义上说，常量其实是一种特殊的变量，一种规定了值，就不会改变的常量)，变量本质上是计算机机程序运行时所分配的内存，要引用或改变内存中的值，就要使用变量名，为了更有效地使用内存，就要为内存规定特定的<span class="t_tag">数据</span>类型。 <br /><strong>在AS中变量可以分为两大类，必须明确这两大类变量之间的区别和联系：&nbsp; &nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;第一种：值类型 不使用new关键字声明的变量 在AS中称为基元数据类型： Boolean int Number String uint&nbsp; &nbsp;&nbsp; &nbsp; <br />&nbsp;&nbsp;第二种：引用类型 需要使用new关键字 在AS中称为复杂数据类型：Array Date Error Function RegExp <span class="t_tag">XML</span> <span class="t_tag">XML</span>List&nbsp; &nbsp;&nbsp; &nbsp; <br /></strong>在AS中不管是值类型变量还是引用类型变量都是通过引用(指向变量存储单元)来使用变量，只不过值类型的引用是&ldquo;不变对象&rdquo;(黑羽的书中所说的)，那为什么使用&ldquo;不变对象&rdquo;了，变量在程序运行中还能改变呢，是因为&ldquo;不变对象&rdquo;对于<strong>固定的不变对象是不变的</strong>，但值类型变量自身每一次改变时，都会产生新的&ldquo;不变对象&rdquo;，即使用不同的&ldquo;不变对象&rdquo;对应变量。&nbsp; &nbsp;&nbsp;&nbsp;<br />所以在as中声音变量包括两个基本部分：&nbsp; &nbsp;&nbsp;&nbsp;<br /><strong>指定变量名：</strong>变量命名要遵守以下规则&nbsp; &nbsp;&nbsp;&nbsp;<br />1 尽量使用有含义的英文单词为变量名(汉语拼音行吗？如果代码不给别人看，自己能看明白，使用什么都可以)，不过还是建议你学习一点英语。&nbsp; &nbsp;&nbsp;&nbsp;<br />2 骆驼命名方法&nbsp; &nbsp;&nbsp;&nbsp;<br />3 最大信息量，最小长度原则&ldquo;min-length max-information&rdquo;&nbsp; &nbsp;&nbsp;&nbsp;<br />4 尽量不要出现数字编号&nbsp; &nbsp;&nbsp;&nbsp;<br /><strong>指定变量类型：&nbsp; &nbsp;&nbsp; &nbsp;<br />声明变量使用var关键字，声明常量使用const关键字，常量在声明的时候最好就规定好值，常量也分为值类型和引用类型，引用类型的常量只是引用不变，并不是指引用对象的不变。</strong></div>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/18/i-am-the-eyes-of-constant-and-variable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>as入门之恶补数学（四）-看到弧度你不必糊涂</title>
		<link>http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-d-to-see-you-do-not-have-confused-radian/</link>
		<comments>http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-d-to-see-you-do-not-have-confused-radian/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 10:01:08 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[弧度]]></category>
		<category><![CDATA[数学]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/18/as%e5%85%a5%e9%97%a8%e4%b9%8b%e6%81%b6%e8%a1%a5%e6%95%b0%e5%ad%a6%ef%bc%88%e5%9b%9b%ef%bc%89-%e7%9c%8b%e5%88%b0%e5%bc%a7%e5%ba%a6%e4%bd%a0%e4%b8%8d%e5%bf%85%e7%b3%8a%e6%b6%82/</guid>
		<description><![CDATA[<a href="http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-d-to-see-you-do-not-have-confused-radian/"><img align="right" hspace="5" width="50" src="http://photo1.bababian.com/upload6/20080118/158A9C8A5F670230665BEA973C144BBE.jpg" class="alignright wp-post-image tfe" alt="" title="" /></a>有些朋友说，看到弧度我就晕&#8212;&#8212;糊涂。其实这是因为我们对它，还不太熟悉、理解的缘故。以前我们也常说：看到AS我就晕。通过学习对AS比较熟悉、理解了，也就不那么晕了。为此我想谈谈有关弧度的问题。也许能对有些朋友有一点帮助。

&#160; &#160;&#160; &#160;一、角的两种单位&#8220; 弧度&#8221;和&#8220;度&#8221;是度量角大小的两种不同的单位。就像&#8220;米&#8221;和&#8220;市尺&#8221;是度量长度大小的两种不同的单位一样。&#160;&#160;在flash里规定:在旋转角度（rotation）里的角，以&#8220;度&#8221;为单位；而在三角函数里的角要以&#8220;弧度&#8221;为单位。这个规定是我们首先要记住的！！！例如：rotation2－－是旋转&#8220;2度&#8221;；sin（&#960;/2)－－是大小为&#8220;&#960;/2弧度&#8221;的角的正弦。&#160;&#160;&#160; &#160;&#160;&#160;二、弧度的定义&#160; &#160;&#160;&#160;所谓&#8220;弧度的定义&#8221;就是说，1弧度的角大小是怎样规定的？&#160; &#160;&#160;&#160;我们知道&#8220;度&#8221;的定义是，&#8220;两条射线从圆心向圆周射出，形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆周长的360分之一时，两条射线的夹角的大小为1度。（如图1）&#160; &#160;&#160; &#160;&#160;&#160;那么，弧度又是怎样定义的呢? 弧度的定义是：两条射线从圆心向圆周射出，形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时，两条射线的夹角大小为1弧度。（如图2）&#160; &#160;&#160; &#160; 比较一下，度和弧度的这两个定义非常相似。它们的区别，仅在于角所对的弧长大小不同。度的是等于圆周长的360分之一，而弧度的是等于半径。&#160; &#160;&#160; &#160; 简单的说，弧度的定义是，当角所对的弧长等于半径时，角的大小为1弧度。角所对的弧长是半径的几倍，那么角的大小就是几弧度。它们的关系可用下式表示和计算：&#160; &#160; 角（弧度）＝弧长/半径圆的周长是半径的 2&#960;倍，所以一个周角（360度）是 2&#960;弧度。半圆的长度是半径的 &#960;倍，所以一个平角（180度）是 &#960;弧度。

<span class="readmore"><a href="http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-d-to-see-you-do-not-have-confused-radian/" title="as入门之恶补数学（四）-看到弧度你不必糊涂">阅读全文——共1767字</a></span>]]></description>
			<content:encoded><![CDATA[<p><font size="2">有些朋友说，看到弧度我就晕&mdash;&mdash;糊涂。其实这是因为我们对它，还不太熟悉、理解的缘故。以前我们也常说：看到AS我就晕。通过学习对AS比较熟悉、理解了，也就不那么晕了。为此我想谈谈有关弧度的问题。也许能对有些朋友有一点帮助。</p>
<p>&nbsp; &nbsp;&nbsp; &nbsp;一、角的两种单位<br />&ldquo; 弧度&rdquo;和&ldquo;度&rdquo;是度量角大小的两种不同的单位。就像&ldquo;米&rdquo;和&ldquo;市尺&rdquo;是度量长度大小的两种不同的单位一样。<br />&nbsp;&nbsp;在flash里规定:在旋转角度（rotation）里的角，以&ldquo;度&rdquo;为单位；而在三角函数里的角要以&ldquo;弧度&rdquo;为单位。这个规定是我们首先要记住的！！！例如：rotation2－－是旋转&ldquo;2度&rdquo;；sin（&pi;/2)－－是大小为&ldquo;&pi;/2弧度&rdquo;的角的正弦。<br />&nbsp;&nbsp;<br />&nbsp; &nbsp;&nbsp;&nbsp;二、弧度的定义<br />&nbsp; &nbsp;&nbsp;&nbsp;所谓&ldquo;弧度的定义&rdquo;就是说，1弧度的角大小是怎样规定的？<br />&nbsp; &nbsp;&nbsp;&nbsp;我们知道&ldquo;度&rdquo;的定义是，&ldquo;两条射线从圆心向圆周射出，形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆周长的360分之一时，两条射线的夹角的大小为1度。（如图1）<br />&nbsp; &nbsp;<br />&nbsp; &nbsp;&nbsp;&nbsp;那么，弧度又是怎样定义的呢? 弧度的定义是：两条射线从圆心向圆周射出，形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时，两条射线的夹角大小为1弧度。（如图2）<br />&nbsp; &nbsp;&nbsp; &nbsp; 比较一下，度和弧度的这两个定义非常相似。它们的区别，仅在于角所对的弧长大小不同。度的是等于圆周长的360分之一，而弧度的是等于半径。<br />&nbsp; &nbsp;&nbsp; &nbsp; 简单的说，弧度的定义是，当角所对的弧长等于半径时，角的大小为1弧度。</font><br /><img src="http://photo1.bababian.com/upload6/20080118/158A9C8A5F670230665BEA973C144BBE.jpg" border="0" alt="" width="382" height="185" /><br /><font size="2">角所对的弧长是半径的几倍，那么角的大小就是几弧度。<br />它们的关系可用下式表示和计算：<br />&nbsp; &nbsp; 角（弧度）＝弧长/半径<br />圆的周长是半径的 2&pi;倍，所以一个周角（360度）是 2&pi;弧度。<br />半圆的长度是半径的 &pi;倍，所以一个平角（180度）是 &pi;弧度。</p>
<p>&nbsp; &nbsp; 三、度跟弧度之间的换算<br />&nbsp; &nbsp; 据上所述，一个平角是 &pi; 弧度。<br />即&nbsp; &nbsp; 180度＝&pi;弧度<br />由此可知：<br />&nbsp; &nbsp; 1度＝&pi;/180 弧度 ( &asymp;0.017453弧度 )<br />因此，得到 把度化成弧度的公式：<br />&nbsp; &nbsp; 弧度＝度&times;&pi;/180 <br />例如：<br />&nbsp; &nbsp;&nbsp; &nbsp;90&deg;＝90&times;&pi;/180 ＝&pi;/2 弧度<br />&nbsp; &nbsp;&nbsp; &nbsp;60&deg;＝60&times;&pi;/180 ＝&pi;/3 弧度<br />&nbsp; &nbsp;&nbsp; &nbsp;45&deg;＝45&times;&pi;/180 ＝&pi;/4 弧度<br />&nbsp; &nbsp;&nbsp; &nbsp;30&deg;＝30&times;&pi;/180 ＝&pi;/6 弧度<br />&nbsp; &nbsp;&nbsp; &nbsp;120&deg;＝120&times;&pi;/180 ＝2&pi;/3 弧度</font></p>
<p><font size="2">反过来，弧度化成度怎么算？<br />因为&nbsp; &nbsp; &pi;弧度＝180&deg;<br />所以&nbsp;&nbsp;1弧度＝180&deg;/&pi; （&asymp;57.3&deg;）<br />因此，可得到 把弧度化成度的公式：<br />&nbsp; &nbsp;&nbsp;&nbsp;度＝弧度&times;180&deg;/&pi;<br />例如：<br />&nbsp; &nbsp;&nbsp; &nbsp;4&pi;/3 弧度＝4&pi;/3 &times;180&deg;/&pi;<br />&nbsp; &nbsp;&nbsp;&nbsp;＝ 240&deg;</font></p>
<p><font size="2">也许有些朋友会说，究竟是乘以&ldquo;&pi;/180 &rdquo;，还是&ldquo;180&deg;/&pi;&rdquo;很容易搞错。其实你只要记住：&pi;是&pi;弧度，180是180度。我要化成什么单位，就要把有这个单位的放在分子上。也就是说我要化成弧度，就要把&pi;弧度放在分子上－－乘以&pi;/180 。另外，1度比1弧度要小得多，大约只有0.017453弧度（&pi;/180&asymp;0.017453）。所以把度化成弧度后，数字肯定要变小，那么化弧度时一定是乘以&pi;/180 了。能够这样想一想，就不会搞错了。</font></p>
<p><font size="2">在AS代码里把&ldquo;&pi;&rdquo;写成&ldquo;PI&rdquo;。又因为&ldquo;&pi;&rdquo;、&ldquo;sin&rdquo;都是&ldquo;数学函数&rdquo;，按规定要在前面加上&ldquo;Math.&rdquo;（Math是英语中&ldquo;数学&rdquo;Mathematics的缩写）,加上后写成&ldquo;Math.PI&rdquo;、&ldquo;Math.sin&rdquo;。<br />所以&nbsp; &nbsp; sin30&deg;就得写成 Math.sin（30*Math.PI/180）。其中小括弧内的部分是把30&deg;化为弧度，即30&times;&pi;/180 。</font></p>
<p><font size="2">如果把这些都弄明白了，你看到弧度，不会再糊涂了吧。</font></p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-d-to-see-you-do-not-have-confused-radian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>as入门之恶补数学（三）</title>
		<link>http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-c/</link>
		<comments>http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-c/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 10:00:08 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[弧度]]></category>
		<category><![CDATA[数学]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/18/as%e5%85%a5%e9%97%a8%e4%b9%8b%e6%81%b6%e8%a1%a5%e6%95%b0%e5%ad%a6%ef%bc%88%e4%b8%89%ef%bc%89/</guid>
		<description><![CDATA[我们都知道,横波是一种正弦波,那么我们就要模拟出来一个正弦的波的形状.下面说一下它的制作过程及原理.原理:使用正弦函数控制每个小球在竖直方向的运动,用复制函数来复制相同的小球在不同的水平位置.制作过程:1、先做一个小球，我们可以用线性渐变，做一个有一定立体感的小球。转换为mc2、新建一个mc，命名为ss，把刚才做好的小球mc拖入场景，调整它的位置到正中间。在小球mc上加上如下代码:onClipEvent(load){ //小球载入时PI=math.PI //定义数学PI为数学PI}onClipEvent(enterFrame){ //进入帧时_y=-50*math.sin(t*PI/20) //设定小球的y坐标随着角度的变化而变化,实际就是控制它的y坐标在-50到50之间变化t++//角度递增}//这样实现的效果是,小球在初始的位置开始,以这个点为平衡位置,上下不停的往复运动.3、回到主场景，建立一个坐标系，记下坐标系原点的位置，也就是两个轴交点的坐标。4、把mc ss拖入主场景，取实例名为ss，把ss放在坐标轴的原点，也就是那个交点上。如果无法调整好，可以通过坐标来设定。5、在第一帧上写下如下代码：i=1&#160; &#160;&#160; &#160; //定义复制的初始值onenterframe=function(){ //进入帧时if (i&#60;60){&#160; &#160;&#160; &#160; //复制小球的个数为60个duplicateMovieClip(&#34;ss&#34;,&#34;ss&#34;+i,i); //复制&#160; &#160;&#160; &#160;&#160; &#160;setProperty(&#34;ss&#34;+i,_x,ss._x+8*i); //设置每个小球的位置依次递增&#160; &#160;&#160; &#160;&#160; &#160;}i++; //递加}//关于复制函数,在这里我们不作讨论.好了，大功告成。还等什么，ctrl＋enter测试吧，看看做的怎么样～～～后记，当然，你也可以加上一些控制按钮，来控制它的播放，自己试一试吧～～

<span class="readmore"><a href="http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-c/" title="as入门之恶补数学（三）">阅读全文——共5505字</a></span>]]></description>
			<content:encoded><![CDATA[<p>我们都知道,横波是一种正弦波,那么我们就要模拟出来一个正弦的波的形状.<br />下面说一下它的制作过程及原理.<br />原理:使用正弦函数控制每个小球在竖直方向的运动,用复制函数来复制相同的小球在不同的水平位置.<br />制作过程:<br />1、先做一个小球，我们可以用线性渐变，做一个有一定立体感的小球。转换为mc<br />2、新建一个mc，命名为ss，把刚才做好的小球mc拖入场景，调整它的位置到正中间。在小球mc上加上如下代码:<br /><font size="3">onClipEvent(load){ //小球载入时<br />PI=math.PI //定义数学PI为数学PI<br />}<br />onClipEvent(enterFrame){ //进入帧时<br />_y=-50*math.sin(t*PI/20) //设定小球的y坐标随着角度的变化而变化,实际就是控制它的y坐标在-50到50之间变化<br />t++//角度递增<br />}<br />//这样实现的效果是,小球在初始的位置开始,以这个点为平衡位置,上下不停的往复运动.<br />3、回到主场景，建立一个坐标系，记下坐标系原点的位置，也就是两个轴交点的坐标。<br />4、把mc ss拖入主场景，取实例名为ss，把ss放在坐标轴的原点，也就是那个交点上。如果无法调整好，可以通过坐标来设定。<br />5、在第一帧上写下如下代码：<br />i=1&nbsp; &nbsp;&nbsp; &nbsp; //定义复制的初始值<br />onenterframe=function(){ //进入帧时<br />if (i&lt;60){&nbsp; &nbsp;&nbsp; &nbsp; //复制小球的个数为60个<br />duplicateMovieClip(&quot;ss&quot;,&quot;ss&quot;+i,i); //复制<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;setProperty(&quot;ss&quot;+i,_x,ss._x+8*i); //设置每个小球的位置依次递增<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br />i++; //递加<br />}<br />//关于复制函数,在这里我们不作讨论.好了，大功告成。还等什么，ctrl＋enter测试吧，看看做的怎么样～～～<br />后记，当然，你也可以加上一些控制按钮，来控制它的播放，自己试一试吧～～</font></p>
<p><font size="3">3、余弦函数<br />余弦函数和正弦函数差不多，我们来看一下：<br />余弦在数学中是这样来定义的，在直角三角形中，角&theta;的余弦等于它的邻边和斜边之比。<br />sin&theta;＝邻边/斜边<br />在我们的直角三角形中，公式可以修改为：<br />sin&theta;=a/c<br />在数学中，它和正弦一样，也有很多应用。<br />（1）、关于它的取值。<br />在数学中，&theta;是一个角度值，所以我们同样会遇到cos（30），cos（60）等等。而它的计算结果是一个数值，是一个-1&lt;=cos&theta;&lt;=1大于等于负一而小于等于正一的值。这个值在不同的角度范围有时为正，有时为负，取值如下：<br />0度&lt;=&theta;&lt;=90度 和 270度&lt;=&theta;&lt;=360度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;sin&theta;&gt;=0<br />90度&lt;=&theta;&lt;=270度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;sin&theta;&lt;=0<br />还是各占半个周期，半个周期为正，半个周期为负。<br />这样我们同样可以利用它来控制一个量在一定的范围内来回变化，而不会超出这个返回。这个在这个函数的图像中也会体现出来。<br />（2）、关于它的周期性。<br />三角函数都有周期性。正弦和余弦的周期都是360度，也就是2&pi;。以它为周期，循环变化。也就是经过360度，结果重复一次。<br />（3）、在这里我们提一下他们的变化趋势。<br />正弦函数和余弦函数是周期性的函数，在数学中他们的单调性（也就是变化规律），不是单调递增或者单调递减，而是在不同的范围内是不相同的。我们来具体看一下：<br />正弦函数：<br />0度&lt;=&theta;&lt;=90度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;递增 而且是增加的越来越慢<br />90度&lt;=&theta;&lt;=180度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;递减 而且是减少的越来越快<br />180度&lt;=&theta;&lt;=270度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;递增 而且是增加的越来越慢（注意这里指的是数值上的增加，因为在这个范围，结果是一个负值）<br />270度&lt;=&theta;&lt;=360度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;递减 而且是减少的越来越快（同样这里指的也是数值上的减少）<br />余弦函数：<br />0度&lt;=&theta;&lt;=90度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;递减 而且是减少的越来越快<br />90度&lt;=&theta;&lt;=180度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;递增 而且是增加的越来越慢（同样这里指的是数值上的增加）<br />180度&lt;=&theta;&lt;=270度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;递减 而且是减少的越来越快（同样这里指的是数值上的减少）<br />270度&lt;=&theta;&lt;=360度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;递增 而且是增加的越来越慢（同样这里指的是数值上的增加）<br />从上面我们可以看出，作为正弦和余弦函数，它们的单调区间（范围）是在一个确定的范围之内。而且他们的单调变化也是有一定的特点，利用这一点，我们可以来设置一些mc运动的缓动。</font><br /><font size="3">在as中关于余弦函数Math.cos()<br />在as中计算角度的正弦的语法很简单。<br />Math.cos(theta)<br />变量theta是用弧度表示的一个角。下面是一个简单的测试。</font><br /><font size="3">x=Math.cos(0)<br />trace(x)//输出1<br />x=Math.cos(Math.PI) <br />trace(x)//输出-1<br />x=90*Math.PI/180 //把90度转换为弧度值<br />x=Math.cos(x)<br />trace(x)//输出为6.12303176911189e-17这是因为浮点数是以二进制格式存储的，因此会有一定的误差。这是一个非常接近于0的值<br />x=Math.cos(90)//计算数字90的正弦值<br />trace(x)//输出-0.44807361612917</font><br /><font size="3">4、正切函数<br />前面介绍了三角形中的两种比例：决定&ldquo;高度&rdquo;的正弦和决定&quot;宽度&quot;的余弦。三角形中的第三个基础的比例是正切，它决定斜率。<br />（1）、斜率<br />当一个直线的倾斜角改变时，它的倾斜程度也随之改变。在数学中通过一个&ldquo;斜率&rdquo;的比例来描述他的倾斜程度。在数学中它这样定义：斜率等于高度除以宽度。高度是指垂直改变，宽度是指水平改变。于是垂直改变除以水平改变就得到斜率。<br />斜率＝高度/宽度＝垂直改变/水平改变<br />在直角三角形中，斜边c的斜率即b与a的比例：<br />c的斜率＝b/a<br />（2）给定倾斜角的直线的斜率<br />斜边c的斜率与夹角&theta;之间存在某种关系，这种关系可以用正切来表达。角的正切即倾斜角为该角度的直线的斜率。<br />&theta;的正切＝c的斜率。<br />（3）正切的正式定义：<br />角的正切的正式定义为&ldquo;对边与邻边的比&rdquo;。<br />tan&theta;＝对边/邻边<br />在直角三角形中：<br />tan&theta;＝b/a<br />（4）正切的取值：<br />正切的值有无穷大这样的值，因为我们可以看到tan&theta;表示的对边与邻边之比，那么如果它的邻边为0，也就是这条直线是一条竖直的直线的话，a的取值为0，那么我们在数学中说，比例式的分母不能为0，当它为0的时候，这个式子的计算结果是无穷大～～。<br />正切是一个单调增函数，从－90度到90度的范围内是单调递增的。从负无穷大增大到正无穷大。<br />（5)周期性:<br />正切函数同样是一个具有周期性的函数，它的周期是180度。每180度，变换一次。<br />（6）as中的Math.tan（）<br />它的语法为：<br />Math.tan(angel)<br />变量angel同样是用弧度表示的角。所以你在输入角度的时候，同样需要把它转换为角度。下面一段代码来测试一下：<br />x=45// 计算45度的正切值<br />x=Math.PI*x/180 //转换为弧度<br />x=Math.tan(x)//计算<br />trace(x)//输出1<br />x=Math.tan(45) //计算45弧度的正切值<br />trace(x)//输出1.61977519054386<br />//从这里可以看出它接受的是一个弧度而不是角度.</font></p>
<p><font size="3">//原理:利用三角函数,控制正多边形的节点位置,利用绘图函数绘制图像.</font><br /><font size="3">function drawd(n,long){ //自定义绘制函数,有两个参数,n为绘制的边数,long为绘制多边形的边长 </font><br /><font size="3">clear()//清屏</font><br /><font size="3">var xarray=new Array() //定义一个数组,用来存储接点的位置坐标</font><br /><font size="3">var yarray=new Array()</font><br /><font size="3">centerx=Stage.width/2 //定义绘制中心</font><br /><font size="3">centery=Stage.height/2 Pi=Math.PI step=360/n//计算每一边对应的角度</font><br /><font size="3">jiao=step*Pi/180 //转换为弧度</font><br /><font size="3">tempjiao=jiao/2 //除以2,用来计算所需的圆的半径</font><br /><font size="3">radius=0.5*long/Math.sin(tempjiao) //计算圆的半径(如果不知道怎么算,请提出,我再讲)</font><br /><font size="3">if(radius&gt;Stage.height/2){ //如果半径过大,超出了场景,让半径适合场景</font><br /><font size="3">radius=Stage.height/2</font><br /><font size="3">}</font><br /><font size="3">for(i=0;i&lt;n+1;i++){ //计算绘制接点 angel=step*i //每个接点对应的角度</font><br /><font size="3">hudu=angel*Pi/180 //转换为弧度</font><br /><font size="3">x=radius*Math.cos(hudu)+centerx //x坐标</font><br /><font size="3">y=radius*Math.sin(hudu)+centery//y坐标</font><br /><font size="3">xarray=x//存入数组</font><br /><font size="3">yarray=y</font><br /><font size="3">}</font><br /><font size="3">this.moveTo(xarray[0],yarray[0])//初始绘制点</font><br /><font size="3">this.lineStyle(1,0&#215;00ff00,100)//绘制线条样式,可以改变</font><br /><font size="3">for(i=0;i&lt;n+1;i++){ //绘制 this.lineTo(xarray,yarray)</font><br /><font size="3">}</font><br /><font size="3">}</font><br /><font size="3">这是主要的绘制函数,使用这个函数进行控制绘图,当然,也可以把他写为类. 场景中的大家可以这样来设置: 静态文本:边数 边长 开始绘制输入文本两个,一个放在边数的后面,设置变量为n,接受边数;一个放在边长的后面,用来接受边长,设置变量为l 随便做一个按钮,放在&quot;开始绘制&quot;几个字的上面,在按钮上加上如下代码:</font><br /><font size="3">on(release){//点击释放后</font><br /><font size="3">this.drawd(n,l)//开始绘制 n=&quot;&quot;//把输入清空 l=&quot;&quot; } </font></p>
<p><font size="3">好了,可以测试了~~! </font></p>
<p>5、反正切<br />我们可以使用正切操作将角度转变为斜率,那么怎样利用斜率来转换为角度呢?可以利用斜率的反正切函数将他转换为相应的角度.as中有两个函数可以计算反正切,我们来看一下.<br />1、as中Math.atan()<br />Math.atan()接受一个参数:用法如下:<br />angel=Math.atan(slope)&nbsp;&nbsp;<br />angel为一个角度的弧度值,slope为直线的斜率,是一个数字,这个数字可以是负的无穷大到正无穷大之间的任何一个值.<br />不过,利用他进行计算比较复杂.因为他的周期性,一个数字的反正切值不止一个.例如atan(-1)的值可能是45度,也可能是225度.这样就是他的周期性,对于正切函数来说,他的周期是180度,所以两个相差180度的角具有相同的正切和斜率:<br />tan&theta;=tan(&theta;+180)<br />然而,Math.atan()只能返回一个角度值,因此确定他的角度非常的复杂,而且,90度和270度的正切是无穷大,因为除数为零,我们也是比较难以处理的~!因此我们更多的会采用第二个函数.<br />2、Math.atan2()<br />Math.atan2()接受两个参数x和y,方法如下:<br />angel=Math.atan2(y,x)<br />x 指定点的 x 坐标的数字。<br />y 指定点的 y 坐标的数字。<br />计算出来的结果angel是一个弧度值,也可以表示相对直角三角形对角的角，其中 x 是临边边长，而 y 是对边边长。 <br />下面我们来测试一下这两个函数:<br />x=Math.atan(1)//计算正切值为1的数字对应的弧度值<br /><font size="3">trace(x) //输出一个弧度值0.785398163397448<br />x=180*x/Math.PI//转换为角度值<br />trace(x) //输出45<br />x=Math.atan2(7,7)<br />trace(x)//输出0.785398163397448<br />x=180*x/Math.PI//转换为角度值<br />trace(x)//输出45<br />x=Math.atan2(7,-7)<br />trace(x)2.35619449019234<br />x=180*x/Math.PI//转换为角度值<br />trace(x)135<br />x=Math.atan2(-7,7)<br />trace(x)//输出-0.785398163397448<br />x=180*x/Math.PI//转换为角度值<br />trace(x)//输出-45<br />x=Math.atan2(-7,-7)<br />trace(x)//输出-2.35619449019234<br />x=180*x/Math.PI//转换为角度值<br />trace(x)//输出-135<br />//从这些测试可以看出,通过坐标系的自动调整,我们可以很自由的计算出处于不同象限的位置相对应的角度.<br />3、计算两点间连线的倾斜角.<br />这种方法非常的有用.<br />Math.atan2()函数返回点(x,y)和原点(0,0)之间直线的倾斜角.那么如何计算任意两点间直线的倾斜角呢?只需要将两点x,y坐标分别相减得到一个新的点(x2-x1,y2-y1).然后利用他求出角度就可以了.使用下面的一个转换可以实现计算出两点间连线的夹角.<br />Math.atan2(y2-y1,x2-x1)<br />不过这样我们得到的是一个弧度值,在一般情况下我们需要把它转换为一个角度.<br />下面我们用一段代码来测试一下这样的转换.<br />//测试,计算点(3,3)和(5,5)构成的连线的夹角<br />x=Math.atan2(5-3,5-3)<br />trace(x)//输出0.785398163397448<br />x=x*180/Math.PI//转换为角度<br />trace(x)//输出45 </font></p>
<p><font size="3">6、反正弦和和反余弦</font><br /><font size="3">这两个函数并不常用，主要是在知道了某一个角度的正弦或者余弦的时候，计算他的角度值，不过，他返回的同样是一个弧度值，那么在使用的时候需要把他转为角度值。</font></p>
<p><font size="3">用法<br />Math.acos(x)<br />Math.asin(x)<br />参数<br />x 介于 -1.0 到 1.0 之间的数字。</font></p>
<p><font size="3">方法；以弧度为单位计算并返回参数 x 中指定的数字的反余弦值</font></p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>as入门之恶补数学（二）</title>
		<link>http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-b/</link>
		<comments>http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-b/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 09:56:08 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[弧度]]></category>
		<category><![CDATA[数学]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/18/as%e5%85%a5%e9%97%a8%e4%b9%8b%e6%81%b6%e8%a1%a5%e6%95%b0%e5%ad%a6%ef%bc%88%e4%ba%8c%ef%bc%89/</guid>
		<description><![CDATA[<a href="http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-b/"><img align="right" hspace="5" width="50" src="http://photo1.bababian.com/upload6/20080118/1C740234648EF8B7FA75A0A278FCB15E.jpg" class="alignright wp-post-image tfe" alt="" title="" /></a>在学习三角函数之前，我们先来了解一个概念－－－弧度在日常生活中我们使用的度量角度的单位是度。一个圆周是360度，但是这个数字是任意规定的。而弧度单位是数学家们定义的测量角度的标准公制单位。弧度是基于&#960;定义的，&#960;是圆的一种固有属性。计算机编程语言通常在处理角度时都以弧度为单位。flash as的内置Math类，它在计算时都是以弧度为单位。弧度的定义如下：两条射线从圆心向圆周射出，形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时，两条射线的夹角的弧度为1。从下面一个图示我们来看一下：

在这个图中，夹角&#952;的弧度可以使用这个公式来计算：弧长为s，半径为l，则夹角&#952;的弧度值就是&#952;＝s/l。&#960;是一个常量，在flash的as中，用Math.PI来定义，PI的值为3.1415&#8230;..我们可以测试一下：p=Math.PItrace(p)//输出为：3.14159265358979那么。如何将度转化为弧度呢？基本的关系是&#960;弧度等于180度比例为&#960;：180。因此2&#960;弧度就等于360度，也就是一个圆周。转换的关系式为：弧度＝度&#215;&#960;/180在flash as中，我们可以通过这样的函数来进行转换：function dzhd(angel){&#160; &#160;&#160; &#160; //angel为一个度表示的角度,自定义一个函数dzhdreturn angel*(Math.PI/180)}我们可以来测试一下这个函数：function dzhd(angel){return angel*(Math.PI/180)}x=dzhd(180)trace(x)//输出为3.14159265358979，也就是pi当然，我们在使用的过程中不一定非要用函数来进行转换，我们可以直接用一个表达式来进行转换，同样是可以的。比如把一个角度angel转换为一个弧度hudu值，可以用下面来表示hudu=angel*(Math.PI)/180测试一下：angel=180hudu=angel*(Math.PI/180)trace(hudu)//输出为3.14159265358979，也就是pi同样，我们也可以把弧度转换为度。弧度值乘以180/&#960;得到角度：自定义函数：function hdzd(hudu）{return hudu*(180/Math.PI)}测试：function hdzd(hudu){return hudu*(180/Math.PI)}x=hdzd(1)trace(x)//输出为57.2957795130823，实际上1弧度对应57.3度。同样，我们也可以直接用一个表达式来转换而不用函数。angel=hudu*(180/Math.PI)测试：hudu=1angel=hudu*(180/Math.PI)trace(angel)//同样输出为57.2957795130823，实际上1弧度对应57.3度。

<span class="readmore"><a href="http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-b/" title="as入门之恶补数学（二）">阅读全文——共2984字</a></span>]]></description>
			<content:encoded><![CDATA[<p><font size="2">在学习三角函数之前，我们先来了解一个概念－－－弧度<br />在日常生活中我们使用的度量角度的单位是度。一个圆周是360度，但是这个数字是任意规定的。而弧度单位是数学家们定义的测量角度的标准公制单位。弧度是基于&pi;定义的，&pi;是圆的一种固有属性。计算机编程语言通常在处理角度时都以弧度为单位。flash as的内置Math类，它在计算时都是以弧度为单位。</font><br /><font size="2">弧度的定义如下：两条射线从圆心向圆周射出，形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时，两条射线的夹角的弧度为1。从下面一个图示我们来看一下：</font><br /><img src="http://photo1.bababian.com/upload6/20080118/1C740234648EF8B7FA75A0A278FCB15E.jpg" border="0" alt="" width="152" height="117" /></p>
<p><font size="2">在这个图中，夹角&theta;的弧度可以使用这个公式来计算：弧长为s，半径为l，则夹角&theta;的弧度值就是&theta;＝s/l。<br />&pi;是一个常量，在flash的as中，用Math.PI来定义，PI的值为3.1415&#8230;..我们可以测试一下：<br />p=Math.PI<br />trace(p)//输出为：3.14159265358979</font><br /><font size="2">那么。如何将度转化为弧度呢？基本的关系是&pi;弧度等于180度比例为&pi;：180。因此2&pi;弧度就等于360度，也就是一个圆周。转换的关系式为：</font><br /><font size="2">弧度＝度&times;&pi;/180</font><br /><font size="2">在flash as中，我们可以通过这样的函数来进行转换：</font><br /><font size="2">function dzhd(angel){&nbsp; &nbsp;&nbsp; &nbsp; //angel为一个度表示的角度,自定义一个函数dzhd</font><br /><font size="2">return angel*(Math.PI/180)</font><br /><font size="2">}</font><br /><font size="2">我们可以来测试一下这个函数：</font><br /><font size="2">function dzhd(angel){<br />return angel*(Math.PI/180)<br />}<br />x=dzhd(180)<br />trace(x)//输出为3.14159265358979，也就是pi</font><br /><font size="2">当然，我们在使用的过程中不一定非要用函数来进行转换，我们可以直接用一个表达式来进行转换，同样是可以的。比如把一个角度angel转换为一个弧度hudu值，可以用下面来表示</font><br /><font size="2">hudu=angel*(Math.PI)/180</font><br /><font size="2">测试一下：</font><br /><font size="2">angel=180<br />hudu=angel*(Math.PI/180)<br />trace(hudu)//输出为3.14159265358979，也就是pi</font><br /><font size="2">同样，我们也可以把弧度转换为度。弧度值乘以180/&pi;得到角度：</font><br /><font size="2">自定义函数：</font><br /><font size="2">function hdzd(hudu）{</font><br /><font size="2">return hudu*(180/Math.PI)</font><br /><font size="2">}</font><br /><font size="2">测试：</font><br /><font size="2">function hdzd(hudu){<br />return hudu*(180/Math.PI)<br />}<br />x=hdzd(1)<br />trace(x)//输出为57.2957795130823，实际上1弧度对应57.3度。</font><br /><font size="2">同样，我们也可以直接用一个表达式来转换而不用函数。angel=hudu*(180/Math.PI)</font><br /><font size="2">测试：</font><br /><font size="2">hudu=1<br />angel=hudu*(180/Math.PI)<br />trace(angel)//同样输出为57.2957795130823，实际上1弧度对应57.3度。<br /></font>
<p>10、三角函数<br /><font size="3">既然说到三角函数，我们还是要从最基本的做起。我们的三角函数，最初是在直角三角形中形成的，来看一下这个三角形。</font><br /><img src="http://photo1.bababian.com/upload6/20080118/817F52C9FD06ED15D6C92223266C8B16.jpg" border="0" alt="" width="200" height="160" /><br />直角三角形实际上就是其中的一个角是90度的三角形，也就是有一个角是直角。它的直角处用一个小的正方形来标识。它的三条边，直角边用a、b标记，最长的一边c称为斜边。整个现代文明可以说都是建立在三角形的基础之上的。直角三角形中三条边和三个角之间的关系是as程序员必备的基础知识。<br /><font size="3">1、勾股定理</font><br /><font size="3">这是一个很远古的公式，可能我们很早就已经了解过了。<br />a的平方加上b的平方等于c的平方。那么，如果我们想计算c的值，对该方程的两边求平方根就可以了。</font><br /><font size="3">对于这个定理，大家先有一个基本的认识，等我们来介绍具体在flash场景中使用的时候，我们再具体的来说一个它的应用。</font><br /><font size="3">2、正弦函数：</font><br /><font size="3">正弦在数学中是这样来定义的，在直角三角形中，角&theta;的正弦等于它的对边和斜边之比。</font><br /><font size="3">sin&theta;＝对边/斜边</font><br /><font size="3">在我们的三角形中，公式可以修改为：</font><br /><font size="3">sin&theta;=b/c</font><br /><font size="3">在数学中，关于这个函数有很多计算的项目和应用。我们在这里给大家提两点需要大家注意：</font><br /><font size="3">（1）、关于它的取值。</font><br /><font size="3">在数学中，&theta;是一个角度值，所以我们会遇到sin（30），sin（60）等等。而它的计算结果是一个数值，是一个-1&lt;=sin&theta;&lt;=1大于等于负一而小于等于正一的值。这个值在不同的角度范围有时为正，有时为负，取值如下：</font><br /><font size="3">0度&lt;=&theta;&lt;=180度&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;sin&theta;&gt;=0</font><br /><font size="3">180度&lt;=&theta;&lt;=360度 sin&theta;&lt;=0</font><br /><font size="3">这样我们可以利用它来控制一个量在一定的范围内来回变化，而不会超出这个返回。这个在这个函数的图像中也会体现出来。</font><br /><font size="3">（2）、关于它的周期性。</font><br /><font size="3">三角函数都有周期性。正弦和余弦的周期都是360度，也就是2&pi;。以它为周期，循环变化。也就是经过360度，结果重复一次。</font><br /><font size="3">在as中关于正弦函数Math.sin()</font><br /><font size="3">在as中计算角度的正弦的语法很简单。</font><br /><font size="3">Math.sin(theta)</font><br /><font size="3">变量theta是用弧度表示的一个角。下面是一个简单的测试。</font><br /><font size="3">x=Math.sin(0)<br />trace(x)//输出0<br />x=Math.sin(Math.PI)<br />trace(x)//输出1.22460635382238e-16&nbsp; &nbsp;&nbsp; &nbsp; 这是因为浮点数是以二进制格式存储的，因此会有一定的误差。这是一个非常接近于0的值<br />x=90*Math.PI/180 //把90度转换为弧度值<br />x=Math.sin(x)<br />trace(x)//输出为1<br />x=Math.sin(90)//之间计算数字90的正弦值<br />trace(x)//输出0.893996663600558<br />//从这里可以看出，flash as接受的是一个弧度值，如果是一个数字，则as会认为它是一个弧度来进行计算</font><br /><font size="3">下面是使用flash的绘图函数,绘制一个正弦函数的图<br />代码如下,加到第一帧就可以了<br />//使用绘图函数，绘制一个正弦函数的图像。<br />x0=50 //定义开始绘制的位置。<br />y0=200<br />a=100//定义一个初始的振幅，也就是扩大一个，不然sin&theta;的值小于1，很难看出来。<br />//我们设计一个动态绘制的过程。<br />du=0//定义开始绘制的角度<br />_root.moveTo(x0,y0)&nbsp; &nbsp;&nbsp; &nbsp; //绘制的初始位置<br />x=x0 //定义开始绘制的水平位置<br />_root.onEnterFrame=function(){ //进入帧时，开始绘制<br />_root.lineStyle(3,0&#215;00ff00,100)&nbsp; &nbsp;&nbsp; &nbsp; //绘制格式<br />hudu=Math.PI*du/180 //把角度转换为弧度<br />x=x+0.5 //水平方向每隔0.5象素,绘制一次<br />du++ //角度递加,每次加一度<br />//trace(du),你可以测试一下角度的变化<br />y=y0-a*Math.sin(hudu)&nbsp; &nbsp;&nbsp; &nbsp; //绘制的y坐标.在这里为甚么用y0减去这个三角函数值呢?因为三角函数计算出来在小于180度时为一个正值而对于flash的场景来说,上边数值小,下面数值大,为了和数学上的函数图像适应,所以减去.<br />_root.lineTo(x,y) //绘制<br />if(du==720){ //如果角度增加到720度,也就是两个循环,重新开始绘制<br />&nbsp; &nbsp;&nbsp; &nbsp; clear() //清屏<br />&nbsp; &nbsp;&nbsp; &nbsp; x=x0&nbsp; &nbsp;&nbsp; &nbsp; //初始化位置<br />&nbsp; &nbsp;&nbsp; &nbsp; _root.moveTo(x0,y0)<br />&nbsp; &nbsp;&nbsp; &nbsp; du=0&nbsp; &nbsp;&nbsp; &nbsp; //角度变为0<br />}<br />}<br /></font></p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/18/as-induction-of-cramming-mathematics-b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>转一个__恶补数学了,要补的快来__as入门之数学函数(一)</title>
		<link>http://www.glglife.com/2008/01/18/a-wrong-turn-__-mathematics-it-is-necessary-to-fill-the-__as-come-entry-of-mathematical-functions-a/</link>
		<comments>http://www.glglife.com/2008/01/18/a-wrong-turn-__-mathematics-it-is-necessary-to-fill-the-__as-come-entry-of-mathematical-functions-a/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 09:55:17 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[弧度]]></category>
		<category><![CDATA[数学]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/18/%e8%bd%ac%e4%b8%80%e4%b8%aa__%e6%81%b6%e8%a1%a5%e6%95%b0%e5%ad%a6%e4%ba%86%e8%a6%81%e8%a1%a5%e7%9a%84%e5%bf%ab%e6%9d%a5__as%e5%85%a5%e9%97%a8%e4%b9%8b%e6%95%b0%e5%ad%a6%e5%87%bd%e6%95%b0%e4%b8%80/</guid>
		<description><![CDATA[最近总用一些朋友问起一些数学公式,说这些内容不会,所以在这里开一个基础教程,希望能够对大家的学习提供帮助.

在flash中,Math类是一个非常常用的类,通过数学计算,可以实现很多非常美妙的效果,我们在这里从最基础的学起,补一补数学知识.我们先来看看flash中提供的Math类吧:Math.abs()&#160; &#160;&#160; &#160;&#160; &#160; 计算绝对值。Math.acos()&#160; &#160;&#160; &#160;&#160;&#160;计算反余弦值。Math.asin()&#160; &#160;&#160; &#160;&#160;&#160;计算反正弦值。Math.atan() 计算反正切值。Math.atan2()&#160; &#160;&#160; &#160;&#160; &#160;计算从 x 坐标轴到点的角度。Math.ceil()&#160; &#160;&#160; &#160;&#160;&#160;将数字向上舍入为最接近的整数。Math.cos()&#160; &#160;&#160; &#160;&#160;&#160;计算余弦值。Math.exp() 计算指数值。Math.floor()&#160; &#160;&#160; &#160;&#160;&#160;将数字向下舍入为最接近的整数。Math.log()&#160; &#160;&#160; &#160;&#160;&#160;计算自然对数。Math.max() 返回两个整数中较大的一个。Math.min() 返回两个整数中较小的一个。Math.pow() 计算 x 的 y 次方。Math.random() 返回一个 0.0 与 1.0 之间的伪随机数。Math.round() 四舍五入为最接近的整数。Math.sin() 计算正弦值。Math.sqrt() 计算平方根。Math.tan() 计算正切值。下面我们就这18个基本的函数,进行具体的说明~!先说几个简单的,把简单的处理掉~!1、Math.abs()&#160; &#160;&#160; &#160;&#160;&#160;计算绝对值公式,那么什么是绝对值呢?这个应该问题不大,我们都知道数字有正数和负数,那么我们计算的结果也就有正有负,通过这个函数,把负数值转换为正数值,而正数值不变.我们可以通过下面语句来验证一下:x=5y=-5x=Math.abs(x)trace(x)//输出 5y=Math.abs(y)trace(y)//输出 52、Math.ceil() 取得指定的数字或表达式的上限的整数值，也就是比指定的数字大的那个整数值。通过下面一段代码可以验证：x=5.45x=Math.ceil(x)trace(x)&#160; &#160;&#160; &#160;&#160; &#160;//输出6注意，对于负数，是绝对值越大，数值越小，所以用Math.ceil()取得的整数值是那一个比数字绝对值小的那个负整数。下面代码可以说明：x=-5.45x=Math.ceil(x)trace(x)//输出-53、Math.floor()这个函数和Math.ceil()恰好相反，获得一个数字或表达式的一个下限的整数值，也就获取的整数值是比指定的数字小的那一个整数。注意：负数的取法和Math.ceil()的取法一样，只是取得一个绝对值大的一个整数。下面可以验证：x=5.45x=Math.floor(x)trace(x)//输出5x=-5.45x=Math.floor(x)trace(x)//输出-64、Math.round()这个函数所用的方法应该是我们最熟悉的了，四舍五入，取得和一个表达式或者数字最接近的一个整数。我们用一下代码验证一下～！x=5.45x=Math.round(x)trace(x)//输出5x=-5.45x=Math.round(x)trace(x)//输出-5x=-5.55x=Math.round(x)trace(x)//输出-6但是在这里发现一个要大家注意的问题，如果x=5.50x=Math.round(x)trace(x)//输出6但是如果x=-5.50x=-5.50x=Math.round(x)trace(x)//输出-5&#160; &#160;&#160; &#160;&#160; &#160; 需要注意一下～！5、Math.random()&#160; &#160;&#160; &#160;&#160; &#160;随机函数，获取一个介于0和1之间的一个数字 0&#60;=x&#60;1这样的一个小数位数为14位的一个小数。使用他，可以获取一些不同位数的一些数字。下面我们使用他和上面我们已经研究过的函数，获取一个随机的四位数。x=Math.random()x=10000*xx=Math.round(x)trace(x)&#160; &#160;&#160; &#160;&#160;&#160;//输出为4478当然，flash还提供了随机函数random(value),他也可以获取一个随机的整数，这个整数介于0和value-1之间的一个整数，关于它的用法，网上有很多很详细的说明，在这里就不再多说了，下面用一段代码来验证一下～！x=random(5)trace(x) //输出为，0,1,2,3,4之中的任意一个值～！6、Math.max()计算两个数字或者表达式中的最大值，并返回这个值。x=Math.max(5,4)trace(x)&#160; &#160;&#160; &#160; //输出为5x=10y=20x=Math.max(x,y)trace(x) //输出为207、Math.min()返回两个数字或者表达式中最小的一个值x=Math.min(5,4)trace(x)&#160; &#160;&#160; &#160; //输出为4x=10y=20x=Math.min(x,y)trace(x) //输出为108、Math.pow()参数为x，y使用Math.pow(x,y)计算x的y次方，返回计算的结果。x=Math.pow(2,3)//计算2的3次方trace(x) //输出为8x=3y=4z=Math.pow(x,y)//计算x的y次方trace(z)//输出819、Math.sqrt()计算一个数字或者一个表达式的平方根，注意这里的表达式应该是一个大于或者等于0的数字。x=Math.sqrt(2)//计算2的开方trace(x) //输出为1.4142135623731x=3x=Math.sqrt(x)//计算x的开方trace(x)//输出1.73205080756888

]]></description>
			<content:encoded><![CDATA[<h2><font size="3"><strong>最近总用一些朋友问起一些数学公式,说这些内容不会,所以在这里开一个基础教程,希望能够对大家的学习提供帮助.</strong></font></h2>
<h2><font size="3"><strong><br />在<span class="t_tag">flash</span><span class="t_tag">中</span>,<span class="t_tag">Math</span>类是一个非常常用的类,通过数学计算,可以实现很多非常美妙的效果,我们在这里从最基础的学起,补一补数学知识.<br />我们先来看看flash中提供的Math类吧:<br />Math.abs()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 计算绝对值。<br />Math.acos()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;计算反余弦值。<br />Math.asin()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;计算反正弦值。<br />Math.atan() 计算反正切值。<br />Math.atan2()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;计算从 x 坐标轴到点的角度。<br />Math.ceil()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;将数字向上舍入为最接近的整数。<br />Math.cos()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;计算余弦值。<br />Math.exp() 计算指数值。<br />Math.floor()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;将数字向下舍入为最接近的整数。<br />Math.log()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;计算自然对数。<br />Math.max() 返回两个整数中较大的一个。<br />Math.min() 返回两个整数中较小的一个。<br />Math.pow() 计算 x 的 y 次方。<br />Math.<span class="t_tag">random</span>() 返回一个 0.0 与 1.0 之间的伪<span class="t_tag">随机数</span>。<br />Math.round() 四舍五入为最接近的整数。<br />Math.sin() 计算正弦值。<br />Math.sqrt() 计算平方根。<br />Math.tan() 计算正切值。<br />下面我们就这18个基本的函数,进行具体的说明~!<br />先说几个简单的,把简单的处理掉~!<br />1、Math.abs()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;计算绝对值公式,那么什么是绝对值呢?这个应该问题不大,我们都知道数字有正数和负数,那么我们计算的结果也就有正有负,通过这个函数,把负数值转换为正数值,而正数值不变.我们可以通过下面语句来验证一下:<br />x=5<br />y=-5<br />x=Math.abs(x)<br /><span class="t_tag">trace</span>(x)<br />//输出 5<br />y=Math.abs(y)<br />trace(y)<br />//输出 5<br />2、Math.ceil() 取得指定的数字或表达式的上限的整数值，也就是比指定的数字大的那个整数值。通过下面一段代码可以验证：<br />x=5.45<br />x=Math.ceil(x)<br />trace(x)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//输出6<br />注意，对于负数，是绝对值越大，数值越小，所以用Math.ceil()取得的整数值是那一个比数字绝对值小的那个负整数。下面代码可以说明：<br />x=-5.45<br />x=Math.ceil(x)<br />trace(x)//输出-5<br />3、Math.floor()这个函数和Math.ceil()恰好相反，获得一个数字或表达式的一个下限的整数值，也就获取的整数值是比指定的数字小的那一个整数。注意：负数的取法和Math.ceil()的取法一样，只是取得一个绝对值大的一个整数。下面可以验证：<br />x=5.45<br />x=Math.floor(x)<br />trace(x)//输出5<br />x=-5.45<br />x=Math.floor(x)<br />trace(x)//输出-6<br />4、Math.round()这个函数所用的方法应该是我们最熟悉的了，四舍五入，取得和一个表达式或者数字最接近的一个整数。我们用一下代码验证一下～！<br />x=5.45<br />x=Math.round(x)<br />trace(x)//输出5<br />x=-5.45<br />x=Math.round(x)<br />trace(x)//输出-5<br />x=-5.55<br />x=Math.round(x)<br />trace(x)//输出-6<br />但是在这里发现一个要大家注意的问题，如果<br />x=5.50<br />x=Math.round(x)<br />trace(x)//输出6<br />但是如果x=-5.50<br />x=-5.50<br />x=Math.round(x)<br />trace(x)//输出-5&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 需要注意一下～！<br />5、Math.random()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;随机函数，获取一个介于0和1之间的一个数字 0&lt;=x&lt;1这样的一个小数位数为14位的一个小数。使用他，可以获取一些不同位数的一些数字。下面我们使用他和上面我们已经研究过的函数，获取一个随机的四位数。<br />x=Math.random()<br />x=10000*x<br />x=Math.round(x)<br />trace(x)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//输出为4478<br />当然，flash还提供了随机函数random(value),他也可以获取一个随机的整数，这个整数介于0和value-1之间的一个整数，关于它的用法，网上有很多很详细的说明，在这里就不再多说了，下面用一段代码来验证一下～！<br />x=random(5)<br />trace(x) <br />//输出为，0,1,2,3,4之中的任意一个值～！<br />6、Math.max()计算两个数字或者表达式中的最大值，并返回这个值。<br />x=Math.max(5,4)<br />trace(x)&nbsp; &nbsp;&nbsp; &nbsp; //输出为5<br />x=10<br />y=20<br />x=Math.max(x,y)<br />trace(x) //输出为20<br />7、Math.min()返回两个数字或者表达式中最小的一个值<br />x=Math.min(5,4)<br />trace(x)&nbsp; &nbsp;&nbsp; &nbsp; //输出为4<br />x=10<br />y=20<br />x=Math.min(x,y)<br />trace(x) //输出为10<br />8、Math.pow()参数为x，y使用Math.pow(x,y)计算x的y次方，返回计算的结果。<br />x=Math.pow(2,3)//计算2的3次方<br />trace(x) //输出为8<br />x=3<br />y=4<br />z=Math.pow(x,y)//计算x的y次方<br />trace(z)//输出81<br />9、Math.sqrt()计算一个数字或者一个表达式的平方根，注意这里的表达式应该是一个大于或者等于0的数字。<br />x=Math.sqrt(2)//计算2的开方<br />trace(x) //输出为1.4142135623731<br />x=3<br />x=Math.sqrt(x)//计算x的开方<br />trace(x)//输出1.73205080756888</strong></font></h2>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/18/a-wrong-turn-__-mathematics-it-is-necessary-to-fill-the-__as-come-entry-of-mathematical-functions-a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>美妙的Timer类——Timer与时钟</title>
		<link>http://www.glglife.com/2008/01/18/timer-category-wonderful-timer-with-clock/</link>
		<comments>http://www.glglife.com/2008/01/18/timer-category-wonderful-timer-with-clock/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 09:50:22 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[timer]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/18/%e7%be%8e%e5%a6%99%e7%9a%84timer%e7%b1%bb%e2%80%94%e2%80%94timer%e4%b8%8e%e6%97%b6%e9%92%9f/</guid>
		<description><![CDATA[<a href="http://www.glglife.com/2008/01/18/timer-category-wonderful-timer-with-clock/"><img align="right" hspace="5" width="50" src="http://photo1.bababian.com/upload6/20080118/8E69A0AD2BB152D613082B9CB993520C.jpg" class="alignright wp-post-image tfe" alt="" title="" /></a>Timer绝对是as3改进的亮点之一。它的使用技巧和美妙之处不是一下能说完的。这里先对它进行个完整的说明，再举几个具有启发的例子。为初学者处理计时器打下牢固的基础。

Timer类：Timer类继承EventDispatcher。是FlashPlayer计时器接口。计时器可以用来间隔调用和延时调用。在其过程中可以访问其状态甚至进行干预。以此塑造出来的灵活性足以替代as2中的setInterval和getTimer。Timer类不是顶级类，它在flash.utils包中，要用import flash.utils.Timer声明。构造函数为new Timer(间隔，次数)。间隔时间为毫秒。次数为0表示无限循环。

属性：



<span class="readmore"><a href="http://www.glglife.com/2008/01/18/timer-category-wonderful-timer-with-clock/" title="美妙的Timer类——Timer与时钟">阅读全文——共2101字</a></span>]]></description>
			<content:encoded><![CDATA[<div id="postmessage_11037" class="t_msgfont">Timer绝对是as3改进的亮点之一。它的使用技巧和美妙之处不是一下能说完的。这里先对它进行个完整的说明，再举几个具有启发的例子。为初学者处理计时器打下牢固的基础。</p>
<p>Timer类：<br />Timer类继承EventDispatcher。是FlashPlayer计时器接口。计时器可以用来间隔调用和延时调用。在其过程<span class="t_tag">中</span>可以访问其状态甚至进行干预。以此塑造出来的灵活性足以替代as2<span class="t_tag">中</span>的setInterval和getTimer。Timer类不是顶级类，它在<span class="t_tag">flash</span>.utils包<span class="t_tag">中</span>，要用import <span class="t_tag">flash</span>.utils.Timer声明。构造函数为new Timer(间隔，次数)。间隔时间为毫秒。次数为0表示无限循环。</p>
<p>属性：
<div class="blockcode">
<h5>代码:</h5>
<p><code><br /><font face="Courier New">currentCount:<br />当前次数。只读。</font></code></div>
<div class="blockcode">
<h5>代码:</h5>
<p><code><br /><font face="Courier New">repeatCount:<br />总次数。可以设置。</font></code></div>
<div class="blockcode">
<h5>代码:</h5>
<p><code><font face="Courier New">delay:<br />运行间隔，单位为毫秒。可以设置。</font></code></div>
<div class="blockcode">
<h5>代码:</h5>
<p><code><br /><font face="Courier New">running:<br />是否在运行中。这个属性很重要，它为是否开始进行第二次计时提供了保障。</font></code></div>
<p>上面总次数和间隔可以设置。也就是说可以动态的改变循环次数和间隔时间。并且不会影响当前次数。</p>
<p>方法：
<div class="blockcode">
<h5>代码:</h5>
<p><code><font face="Courier New">start():<br />如果没有开始则开始运行。如果停止则继续运行。注意：第一趟计时完毕后也并不重置计数器。需要使用reset方法重置。</font></code></div>
<div class="blockcode">
<h5>代码:</h5>
<p><code><br /><font face="Courier New">stop():<br />暂停计时。</font></code></div>
<div class="blockcode">
<h5>代码:</h5>
<p><code><br /><font face="Courier New">reset():<br />停止并且重新开始计时。</font></code></div>
<p><span class="t_tag">事件</span>：
<div class="blockcode">
<h5>代码:</h5>
<p><code><br /><font face="Courier New">time:<br />类型为：flash.<span class="t_tag">event</span>s.TimerEvent.TIMER。每次间隔到达调用timer事件。[code]complete:</font></code></div>
<p>类型为：flash.events.TimerEvent.TIMER_COMPLETE。完成调用complete事件。<br />[/code]</p>
<p>看到了Timer类的整体后，as2的<span class="t_tag">程序</span>员一定兴奋不已，想摩拳擦掌开始实验。新手可能会思索半天，觉得不好记忆又想到底应该如何使用呢？</p>
<p>关于记忆我的总结是：<strong>4个属性，3个方法，2个事件。</strong></p>
<p>下面举几个典型的例子。</p>
<p>范例1：<br />没有哪个例子比一个时钟更加适合描述Timer类的基本应用。<br />步骤一：<br />在flash舞台上放置一个钟面，再新建层画出时针、分针、秒针和轴心。3个指针分别命名为hourPoint,minutePoint,secondPoint。这些指针的注册点在底部中央。如图：<br />&nbsp;<img src="http://photo1.bababian.com/upload6/20080118/8E69A0AD2BB152D613082B9CB993520C.jpg" border="0" alt="" width="400" height="400" /><img src="http://photo1.bababian.com/upload6/20080118/C13AA5E7AD408247AE4B1F6B53D4A7FC.jpg" border="0" alt="" width="188" height="94" /></p>
<p>下面我们来让它运转起来：<br />在属性面板中输入Clock。新建一个文档类Clock.as。代码如下：
<div class="blockcode">
<h5>代码:</h5>
<p><code><br /><font face="Courier New">[code] <br />package <br />{<br />import flash.display.Sprite;<br />import flash.display.MovieClip;<br />import flash.utils.Timer;<br />import flash.events.TimerEvent;<br /><span class="t_tag">public</span> <span class="t_tag">class</span> Clock extends Sprite<br />{<br />&nbsp;&nbsp;var clockTimer:Timer=new Timer(1000,0);<br />&nbsp;&nbsp;var bellSound:Bell=new Bell();<br />&nbsp;&nbsp;public <span class="t_tag">function</span> Clock()<br />&nbsp;&nbsp;{<br />&nbsp; &nbsp;refreshPoint(); //初始化指针<br />&nbsp; &nbsp;clockTimer.start(); //开始运行计时器<br />&nbsp; &nbsp;clockTimer.addEventListener(TimerEvent.TIMER,timerFunction); //添加事件<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;private function timerFunction(evtObj:TimerEvent):void<br />&nbsp;&nbsp;{<br />&nbsp; &nbsp;refreshPoint();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;private function refreshPoint():void<br />&nbsp;&nbsp;{<br />&nbsp; &nbsp;var currentDate:Date=new Date();<br />&nbsp; &nbsp;//秒针每走一格旋转6度。<br />&nbsp; &nbsp;secondPoint.rotation=currentDate.seconds*6;<br />&nbsp; &nbsp;//分针每走一个旋转6度加上秒针对它的增量<br />&nbsp; &nbsp;minutePoint.rotation=currentDate.minutes*6+currentDate.seconds*6/60;<br />&nbsp; &nbsp;//使用取余数的方法把24小时制转化为12小时制，时针每走一格旋转30度加上分针对它的增量<br />&nbsp; &nbsp;var hour12:int=currentDate.hours%12;<br />&nbsp; &nbsp;hourPoint.rotation=hour12*30+currentDate.minutes*30/60;<br />&nbsp; &nbsp;<br />&nbsp; &nbsp;//整点报时功能<br />&nbsp; &nbsp;if(currentDate.minutes==0 &amp;&amp; currentDate.seconds==0)<br />&nbsp; &nbsp;{<br />&nbsp; &nbsp; if(hour12)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp;&nbsp;&nbsp;bellSound.play(0,hour12);<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; else<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp;&nbsp;&nbsp;bellSound.play(0,12); //0点时敲12下<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp;}<br />&nbsp;&nbsp;}<br />}<br />}</font></code></div>
<p>上述代码有两点需要阐明：<br />一、Date类是24小时制的，而时钟是12小时制的，转化的方法是取余数。currentDate.hours%12。<br />二、0点代表12点。当到达0点时要敲12下而不是0下。</p>
<p>最后为了更像我们把下面那个单摆做成动画。现在可以测试了。把系统时间改为接近与整点如11点59分。等待一分钟。响了。恭喜，可以把这个用来装饰你的网页了。其钟面可以任意绘制，只要掌握运行原理即可。</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/18/timer-category-wonderful-timer-with-clock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3的冒泡机制</title>
		<link>http://www.glglife.com/2008/01/18/as3-mechanisms-of-bubble/</link>
		<comments>http://www.glglife.com/2008/01/18/as3-mechanisms-of-bubble/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 09:36:41 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[冒泡]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/18/as3%e7%9a%84%e5%86%92%e6%b3%a1%e6%9c%ba%e5%88%b6/</guid>
		<description><![CDATA[<a href="http://www.glglife.com/2008/01/18/as3-mechanisms-of-bubble/"><img align="right" hspace="5" width="50" src="http://www.blogbus.com/user/?mm=Post&amp;aa=Edit&amp;blogid=1915&amp;id=14062836" class="alignright wp-post-image tfe" alt="" title="" /></a>再述冒泡思路1 在as2中发现问题，2 在as3中解决问题。3 结合问题，说明冒泡4 冒泡的问题所在以及解决方法

冒泡很多人在谈，前段时间小弟也是一知半解。弄得云里雾里的。最近找到一个pdf，呵呵，才算弄明白了点。把一点学习笔记发出来。

1 在as2中发现问题，我们用一个例子来发现as2中究竟有什么问题。As2中实现如下效果：舞台上一个mc，mc中一个btn点选mc实现拖动mc，鼠标松开停止拖动点选mc实现mc隐藏。

最容易想到的方法，代码如下：

<span class="readmore"><a href="http://www.glglife.com/2008/01/18/as3-mechanisms-of-bubble/" title="AS3的冒泡机制">阅读全文——共2585字</a></span>]]></description>
			<content:encoded><![CDATA[<p>再述冒泡<br /><font color="#ff0000">思路<br />1 在as2<span class="t_tag">中</span>发现问题，<br />2 在as3中解决问题。<br />3 结合问题，说明冒泡<br />4 冒泡的问题所在以及解决方法</font></p>
<p>冒泡很多人在谈，前段时间小弟也是一知半解。弄得云里雾里的。<br />最近找到一个pdf，呵呵，才算弄明白了点。<br />把一点学习笔记发出来。</p>
<p><font color="#ff0000">1 在as2中发现问题，</font><br />我们用一个例子来发现as2中究竟有什么问题。<br />As2中实现如下效果：<br />舞台上一个mc，mc中一个btn<br />点选mc实现拖动mc，鼠标松开停止拖动<br />点选mc实现mc隐藏。</p>
<p>最容易想到的方法，代码如下：
<div class="blockcode">
<h5>代码:</h5>
<p><code><font face="Courier New">mc.onPress = <span class="t_tag">function</span>() {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;this.startDrag();<br />};<br />mc.onRelease = function() {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;this.stopDrag();<br />};<br />mc.btn.onPress = function() {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;mc._visible=false<br />};</font></code></div>
<p>表面来看，这个思路是正确的。（实际上没什么思路可言，很简单的方法。）</p>
<p>实际怎么样？<br />当然是不能实现。<br /><font color="#006400">问题来了：</font><br />点击btn，不能触发btn的动作！！！！<br /><font color="#006400">解释如下:</font><br />1 因为btn处于mc内部，mc被加上了<span class="t_tag">事件</span>以后，按照as2的<span class="t_tag">事件</span>机制，mc内部的btn甚至是其他的元件都不能接受<span class="t_tag">事件</span>。或者可以认为mc的<span class="t_tag">事件</span>覆盖了mc中其他元件的<span class="t_tag">事件</span>。<br />2 从非冒泡机制来说（as2就是非冒泡），在btn上点击鼠标，首先接受到点击事件的自然是btn的上一层（也就是mc），然后才是btn元件。Mc先接受到点击事件，触发相关的函数。然后呢？我们要实现的点击btn的效果没了。我们可以认为mc把我们的鼠标点击事件据为私有了，不再往下传递。（如果是冒泡机制的话，这个动作就回继续往下传递到btn，然后btn会执行。）那么这种效果在as2中还能实现么？答案自然是肯定的，不过方法就复杂了。<br />这里就不讨论了。As3已经成为主流。</p>
<p>但是as3中的冒泡机制，让我们可以简单的解决这样的难题。</p>
<p><font color="#ff0000">2 在as3中解决问题：</font><br />下面来看as3中怎么实现。<br />代码如下：
<div class="blockcode">
<h5>代码:</h5>
<p><code><font face="Courier New">import <span class="t_tag">flash</span>.<span class="t_tag">event</span>s.*;</p>
<p>mc.addEventListener(MouseEvent.CLICK,mcfunction);<br />mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);<br />function mcfunction(event:MouseEvent) {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span class="t_tag">trace</span>(&quot;mc click&quot;);<br />}<br />function btnfucntion(event:MouseEvent) {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;trace(&quot;btn click&quot;);<br />}</font></code></div>
<p>能实现了吧？<br />看看代码就觉得，好像没用什么特别的解决方法，就加两个侦听函数，就搞定了。<br />这个代码自然的不能再自然了，就好像做flash 先的安装软件一样。<br />但是如此自然的代码下面，使as3的冒泡机制在提供支持。 </p>
<p>结合问题，说明冒泡机制：<br />Chm中有一个冒泡机制的图，相信大家都已经看过了<br />这里我联系实例，另外做一个图，帮助各位理解。<br />&nbsp;<img src="http://www.blogbus.com/user/?mm=Post&amp;aa=Edit&amp;blogid=1915&amp;id=14062836" border="0" alt="" width="1" height="1" /><img src="http://photo1.bababian.com/upload6/20080118/2D2D13C9009ACC1FF3AADD80E5C4FB85.jpg" border="0" alt="" width="523" height="269" /><br />上图为as2中的执行原理<br />下图为as3中的执行原理<br /><span style="display: none; left: 215px; position: absolute; top: 2132px"><img src="http://bbs.actionscript3.cn/images/default/attachimg.gif" border="0" alt="" /></span>&nbsp;<img src="http://photo1.bababian.com/upload6/20080118/2D8D966808DAEEA2C9701B5E09B334FE.jpg" border="0" alt="" width="523" height="269" /><br />上图也就是在as3中实现我们文章开始提出的例子的工作原理。<br /><font color="#006400">下面详细描述一下<br />捕获阶段：</font><br />鼠标在btn上发出点击事件，首先捕捉到该事件的事stage.,然后事件往下传递到mc，再到btn..（如果鼠标事件发生在btn按钮中的一个label上，那么该事件还会继续向下传递，直到找到label元件。）<br />&nbsp; &nbsp;&nbsp;&nbsp;As2中，一旦找到了可以相应事件的函数，就停止了，不会往下传递。这个道理应该说明白了</p>
<p><font color="#006400">目标阶段：</font><br />找到我们的鼠标最底层的目标，也就是btn以后，那么就开始执行btn的侦听函数了。<br />&nbsp; &nbsp; 如果鼠标事件发生的所在位置，是mc中的btn中的一个label。那么将先执行label的侦听函数。（当然我们的例子中没有label）</p>
<p><font color="#006400">冒泡阶段：</font><br />执行了目标阶段的侦听函数以后，开始冒泡。<br />换一个说法是，返回btn的父级元件mc，如果能找到相关的侦听函数，那么就执行，如果没有，就继续往上冒泡到btn的父级元件mc的父级元件stage。看能不能找到相关的侦听函数。<br />注意一个：首先执行的函数一定是目标<span class="t_tag">对象</span>的侦听函数。就像我们上面的例子一样，点击btn会先trace(&ldquo;btn click&rdquo;),然后冒泡到mc，执行trace(&ldquo;mc click&rdquo;)..然后继续往上，如果stage我们也加一个侦听函数，执行语句，那么还会继续执行 trace(&ldquo;stage click&rdquo;).<br />到达stage顶层了，冒泡结束。</p>
<p>说到这里，各位看官也应该明白了as3的冒泡究竟是干什么用的了</p>
<p><font color="#ff0000">4 冒泡的问题所在以及解决方法</font><br />&nbsp;&nbsp;冒泡也有问题，并不是说它有缺陷，因为出现问题无法避免。<br />&nbsp;&nbsp;问题在于，<br />&nbsp;&nbsp;假如在上面的例子中，我们不想在点击btn冒泡阶段中执行mc的侦听函数，我们只想执行btn的侦听函数。怎么解决？<br />同样的问题延伸出去，可以得到很多扩展和应用。<br />那么我们需要阻止他的冒泡的时候执行相关的侦听函数。<br />Chm中的方法有
<div class="quote">
<blockquote>stopImmediatePropagation():void<br />防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。<br />stopPropagation():void<br />防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。</p></blockquote>
</div>
<p>用来修改我们上面的例子<br />代码如下： </p>
<p>代码:</p>
<div class="blockcode"><code><font face="Courier New">import flash.events.*;</p>
<p>mc.addEventListener(MouseEvent.CLICK,mcfunction);<br />mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);<br />function mcfunction(event:MouseEvent) {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;trace(&quot;mc click&quot;);<br />}<br />function btnfucntion(event:MouseEvent) {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;trace(&quot;btn click&quot;);<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;event.stopPropagation();//修改在此处。简单一句，解决问题<br />}</font></code></div>
<p>现在可以试试，点击btn运行得到的结果就是
<div class="blockcode">&nbsp;<br />
<h5>代码:</h5>
<p><code><font face="Courier New">btn click</font></code></div>
<p>说明，已经防止了冒泡阶段中对mc侦听函数的处理。也就没有trace(&ldquo;mc click&rdquo;)了</p>
<p>As3事件机制远远不像这里写的那么简单，还有很多东西需要研究。<br />本文只为抛砖引玉，让各位能先了解一下冒泡机制。<br />希望能多的朋友能提供相关的学习资料</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/18/as3-mechanisms-of-bubble/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《ActionScript 3.0 making things move》</title>
		<link>http://www.glglife.com/2008/01/16/u0026quotactionscript-30-making-things-moveu0026quot/</link>
		<comments>http://www.glglife.com/2008/01/16/u0026quotactionscript-30-making-things-moveu0026quot/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 11:33:19 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[ActionScript 3.0 making things move]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/16/%e3%80%8aactionscript-30-making-things-move%e3%80%8b/</guid>
		<description><![CDATA[看了一下keith peters的ActionScript 3.0 making things move样张，实在令人佩服与惊叹

果然这些东西还是老外写的好啊！怎么说呢？更加符合&#8220;人脑工程学&#8221;，呃～是，你很可能没听过这个词。我是说-很符合思维导图的模式，嗯&#8230;&#8230;再简洁一点，就是：你在看某个例子，碰到疑惑，正想了解这个疑惑的时候，下一行这个疑惑的解答就出来了，而且还非常详细与容易理解

只是还没出版，等，出了之后一定备一本在身边

[给自己的P.S：多看一下样张，重复看几次。虽然翻译的不怎么样，不过自己结合一下自己所理解的语法多看几次，总会有新的发现与概念上的突破]

]]></description>
			<content:encoded><![CDATA[<p>看了一下<a href="http://www.bit-101.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.bit-101.com/?referer=');"><font color="#636194">keith peters</font></a>的<a href="http://www.friendsofed.com/book.html?isbn=1590597915" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.friendsofed.com/book.html?isbn=1590597915&amp;referer=');"><font color="#636194">ActionScript 3.0 making things move</font></a>样张，实在令人佩服与惊叹</p>
<p>果然这些东西还是老外写的好啊！怎么说呢？更加符合&ldquo;人脑工程学&rdquo;，呃～是，你很可能没听过这个词。我是说-很符合思维导图的模式，嗯&hellip;&hellip;再简洁一点，就是：你在看某个例子，碰到疑惑，正想了解这个疑惑的时候，下一行这个疑惑的解答就出来了，而且还非常详细与容易理解</p>
<p>只是还没出版，等，出了之后一定备一本在身边</p>
<p>[给自己的P.S：多看一下样张，重复看几次。虽然翻译的不怎么样，不过自己结合一下自己所理解的语法多看几次，总会有新的发现与概念上的突破]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/16/u0026quotactionscript-30-making-things-moveu0026quot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于AS3的初始化顺序（设置了Document Class之后）</title>
		<link>http://www.glglife.com/2008/01/16/about-as3-initialization-sequence-set-up-after-the-document-class/</link>
		<comments>http://www.glglife.com/2008/01/16/about-as3-initialization-sequence-set-up-after-the-document-class/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 08:24:26 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[初始化]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/16/%e5%85%b3%e4%ba%8eas3%e7%9a%84%e5%88%9d%e5%a7%8b%e5%8c%96%e9%a1%ba%e5%ba%8f%ef%bc%88%e8%ae%be%e7%bd%ae%e4%ba%86document-class%e4%b9%8b%e5%90%8e%ef%bc%89/</guid>
		<description><![CDATA[Document Class初始化 &#62; 主时间轴代码执行 &#62; 舞台元件绑定的类初始化 &#62; 元件的时间轴代码初始化 &#62;.. 下面的层次按这样的规律循环。

]]></description>
			<content:encoded><![CDATA[<p><strong>Document Class初始化 &gt; 主时间轴代码执行 &gt; 舞台元件绑定的类初始化 &gt; 元件的时间轴代码初始化 &gt;.. <br /></strong>下面的层次按这样的规律循环。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/16/about-as3-initialization-sequence-set-up-after-the-document-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex学习笔记五&amp;关于FDT的和Eclipse的一点牢骚</title>
		<link>http://www.glglife.com/2008/01/12/flex-5-u0026amp-study-notes-on-fdt-and-eclipse-point-grumbling/</link>
		<comments>http://www.glglife.com/2008/01/12/flex-5-u0026amp-study-notes-on-fdt-and-eclipse-point-grumbling/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 07:20:59 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[FLEX]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2008/01/12/flex%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%ba%94%e5%85%b3%e4%ba%8efdt%e7%9a%84%e5%92%8ceclipse%e7%9a%84%e4%b8%80%e7%82%b9%e7%89%a2%e9%aa%9a/</guid>
		<description><![CDATA[1、ComboBox，重点理解DropdownEvent事件。在列表被弹出或收回时，会分别派发DropdownEvent对象的OPEN事件和CLOSE事件。对这两个时间进行监听，便可捕捉用户的动作。

2、注意，与之外的都是一个整体，而不是分开的

3、发现还有很多人不明白这个void为什么要加。这里说明一下：是为了方便不带参的function除错（debug）。例如：&#160;&#160; function testVoid():void{&#160;&#160;&#160;&#160; trace(&#34;testVoid&#34;) &#160;&#160;&#160; }&#160; 然后我testVoid(1),运行这时候程序就会出错。&#160; 函数参数为void的意思是这个函数不接受任何参数。所以，养成好习惯，只要不传参的function等，都加上void声明吧

4、Alert的show是一个静态方法，格式如下：&#160;&#160; show(text,title,flags,parent,closeHandle,iconClass,defaultButtonFlag)

<span class="readmore"><a href="http://www.glglife.com/2008/01/12/flex-5-u0026amp-study-notes-on-fdt-and-eclipse-point-grumbling/" title="Flex学习笔记五&#038;关于FDT的和Eclipse的一点牢骚">阅读全文——共2683字</a></span>]]></description>
			<content:encoded><![CDATA[<p>1、ComboBox，重点理解DropdownEvent事件。在列表被弹出或收回时，会分别派发DropdownEvent对象的OPEN事件和CLOSE事件。对这两个时间进行监听，便可捕捉用户的动作。</p>
<p>2、注意，与之外的都是一个整体，而不是分开的</p>
<p>3、发现还有很多人不明白这个void为什么要加。这里说明一下：是为了方便不带参的function除错（debug）。例如：<br />&nbsp;&nbsp; function testVoid():void{<br />&nbsp;&nbsp;&nbsp;&nbsp; trace(&quot;testVoid&quot;) <br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; 然后我testVoid(1),运行这时候程序就会出错。<br />&nbsp; 函数参数为void的意思是这个函数不接受任何参数。所以，养成好习惯，只要不传参的function等，都加上void声明吧</p>
<p>4、Alert的show是一个静态方法，格式如下：<br />&nbsp;&nbsp; show(text,title,flags,parent,closeHandle,iconClass,defaultButtonFlag)</p>
<p>5、关于evt:CloseEvent，CloseEvent之后的值是在evt.detail</p>
<p>6、关于itemRender，实在不明白概念的，就理解为&ldquo;界面/组件绑定&rdquo;吧&hellip;&hellip;是，这样对真正的意思有些偏移，不过若实在对itemRender的概念混淆，也只能暂时在全部顿悟之前，先这样理解吧。这里也说说真正的意思：<br />&nbsp; 用来控制数据表现形式的机制我们称之为&ldquo;itemRender&rdquo;。用户可以定义自己的itemRenderer对象，来覆盖某些有itemRenderer对象的组件的默认属性。自定义的itemRenderer相当于一个简单的自定义组件。同样，里面可以放置其他控件来表现更加丰富的内容。<br />&nbsp; 顺便一说，这个东西相当使用，可以用来实现很多有趣的功能。<br />&nbsp; <strong>[2008.1.14附加]<br /></strong>&nbsp;&nbsp;可以作为用来作为与itemRender的组件又一个共同的特点，那就是拥有一个名为&ldquo;data&rdquo;的属性。<br />&nbsp; 当组件被用作<span>itemRenderer时，就拥有了data属性。data代表的是当前元素的数据信息，一般是Object类型，包括若干属性，data的数据格式和数据源的数据格式是一一对应的。 <br />&nbsp;&nbsp;&nbsp; itemRenderer的data是由控件主动传入的，直接使用就可以了。<br />&nbsp;&nbsp;&nbsp; 比如datagrid的数据源是books，其中每一条数据类型是book，那么itemRenderer的data也是book类型。<br /></span></p>
<p>7、关于function的函数中带事件<br />&nbsp;&nbsp; 如internal function selectHandler(evt:CloseEvbent):void{}。意思是说将事件evt:CloseEvbent的结果带入到函数中，从而供这个function进行使用。这个和我们一直理解的function一样，只是带入的东西不同罢了<br />&nbsp;&nbsp; 然后，这里是作者Email的解释（以<font color="#cc0000"><font color="#000000"><strong>bookList.addEventListener(DropdownEvent.CLOSE,chooseHandler)</strong></font><font color="#000000">为例</font></font>）：<br />&nbsp;&nbsp;&nbsp;<font color="#800000"><font color="#ff6600"><font color="#000000"> </font><font color="#cc0000"><font color="#000000"><font color="#cc0000">bookList.addEventListener(DropdownEvent.CLOSE,chooseHandler);<br />&nbsp;&nbsp;&nbsp; 这句代码的意思是添加一个事件监听器，chooseHandler是函数名。<br />&nbsp;&nbsp;&nbsp; 在使用</font></font></font><font color="#cc0000"> <font color="#000000"><font color="#cc0000">addEventListener方式添加</font></font></font><font color="#cc0000"><font color="#000000"><font color="#cc0000">事件监听函数时，该函数在定义时必须定义参数类型，也就是监听的事件类型。这样，当目标发送该事件时，会把事件作为参数传递过来，如果函数没有定义参数，也就无法接受事件传递的信息。&nbsp;</font></font></font></font></font></p>
<p><font color="#000000"><strong>作者EMAIL2：</strong></font></p>
<p><font color="#cc0000">&nbsp;&nbsp;&nbsp;&nbsp;在使用</font><font color="#cc0000"> <font color="#000000"><font color="#cc0000">addEventListener方式添加 </font></font></font><font color="#cc0000"><font color="#000000"><font color="#cc0000">事件监听函数时，该函数在定义时必须定义参数类型，也就是监听的事件类型。这样，当目标发送该事件时，会把事件作为参数传递过来，如果函数没有定义参数，也就无法接受事件传递的信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 比如：<br />&nbsp;&nbsp;&nbsp;&nbsp; btn.addEventListener(MouseEvent.CLICK,doClick);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 那么，doClick函数在定义时，就必须是：doClick(event:MouseEvent)，这个参数的名字可以随便定义，但类型必须是 </font></font></font><font color="#cc0000"><font color="#000000"><font color="#cc0000">MouseEvent或者</font></font></font><font color="#cc0000"><font color="#000000"><font color="#cc0000">MouseEvent类的父类。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 事件类型的工作机制是这样的： </p>
<p>&nbsp;&nbsp;&nbsp; 1、注册事件监听器，把监听对象和监听函数记录下来，也就是把btn和doClick记录下来。<br />&nbsp;&nbsp;&nbsp; 2、当事件发生时，程序开始检查是否有对象进行了监听，如果有，这些监听函数就会被调用，调用的形式就像：obj.doClick(event)，其中obj表示添加了监听器的对象btn，也就是执行了</font></font></font><font color="#cc0000"><font color="#000000"> <font color="#cc0000">addEventListener的对象，参数event表示事件对象。因此，doClick函数必须定义准确的参数，参数类型必须是event的类型或其父类类型，否则，变量类型不对，将引发运行错误。<br /></font></font></font><font color="#800000"><font color="#ff6600"><font color="#cc0000"><font color="#000000"><font color="#cc0000"><br />&nbsp;&nbsp;&nbsp; <font color="#000000">如果一下子还是无法理解过来，那么就记住这点：addEventListener的是什么事件，那么在这个事件触发的自定义函数中，就要定义这个addEventListener监听的事件的事件类型。<br />&nbsp;&nbsp;&nbsp; 例子：<br />&nbsp;&nbsp;&nbsp; <strong>exp1:</strong><br />&nbsp;&nbsp;&nbsp; <font color="#cc0000">bookList.addEventListener(DropdownEvent.CLOSE,chooseHandler);</font><br /></font></font></font></font></font></font><font color="#800000"><font color="#ff6600"><font color="#cc0000"><font color="#000000"><font color="#cc0000">&nbsp;&nbsp;&nbsp; internal function chooseHandler(evt:DropdownEvent):void{}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000"><strong>exp2:<br /></strong><font color="#993300"><font color="#000000">&nbsp;&nbsp;&nbsp; </font><font color="#cc0000">btn.addEventListener(MouseEvent.CLICK,doClick);</font><br /><font color="#800000"><font color="#ff6600"><font color="#cc0000"><font color="#000000"><font color="#cc0000">&nbsp;&nbsp;&nbsp; internal function chooseHandler(evt:MouseEvent):void{}</font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font color="#cc0000">&nbsp;&nbsp;&nbsp; 然后就可以通过evt来调用监听事件的参数和值了。如<br />&nbsp;&nbsp;&nbsp; internal function closeHandler(evt:CloseEvent):void{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(evt.detail==Alert.YES){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewLabel.text=&quot;选择的是：yes&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewLabel.text=&quot;选择的是：No&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</font></p>
<p><font color="#800000"><font color="#ff6600"><font color="#cc0000"><font color="#000000"><font color="#cc0000"><font color="#000000"><font color="#993300"><font color="#800000"><font color="#ff6600"><font color="#cc0000"><font color="#000000"><font color="#cc0000">&nbsp;&nbsp;&nbsp; <font color="#000000">可能有些朋友已经注意到了为什么后面带入的evt中没有具体的事件名？而仅仅是类的成员名？是这样，我们以MouseEvent来说<br />&nbsp;&nbsp;&nbsp; 导入的MouseEvent对象包含了所有的鼠标事件，如单击、双击、鼠标按下、鼠标松开、鼠标移动等等，这些事件名被封装成MouseEvent类的成员属性。在使用时，我们直接引用类成员名，而不需知道真正的事件名。</font></font></font></font></font></font></font></font></font></font></font></font></font><font color="#800000"><font color="#ff6600"><font color="#cc0000"><font color="#000000"><font color="#cc0000"><font color="#000000"><font color="#993300"><font color="#800000"><font color="#ff6600"><font color="#cc0000"><font color="#000000"><font color="#cc0000"><br /></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font color="#800000"></font>
<p>嗯，最后，记住今天所说的：数组，push吧！</p>
<p>BWT:FDT你是个球，你是个大球，下了几百次都下不下来</p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2008/01/12/flex-5-u0026amp-study-notes-on-fdt-and-eclipse-point-grumbling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>flahs as 无基础入门经典教程</title>
		<link>http://www.glglife.com/2007/12/19/flahs-as-no-basis-for-entry-classic-tutorials/</link>
		<comments>http://www.glglife.com/2007/12/19/flahs-as-no-basis-for-entry-classic-tutorials/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 08:51:07 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[AS入门]]></category>
		<category><![CDATA[AS理念]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2007/12/19/flahs-as-%e6%97%a0%e5%9f%ba%e7%a1%80%e5%85%a5%e9%97%a8%e7%bb%8f%e5%85%b8%e6%95%99%e7%a8%8b/</guid>
		<description><![CDATA[<a href="http://www.glglife.com/2007/12/19/flahs-as-no-basis-for-entry-classic-tutorials/"><img align="right" hspace="5" width="50" src="http://www.wangmeng.cn/Article/UploadFiles/200510/20051011211317817.gif" class="alignright wp-post-image tfe" alt="Smile" title="" /></a>为什么发这么古老的东西？理由同前两篇导读：本篇，最主要看最后一点的XML篇，让对XML没有任何了解的人对XM...]]></description>
			<content:encoded><![CDATA[<div id="log_146">
<div class="Content-body">
<p style="line-height: 180%" class="cc-lisence"><font color="#ff0000">为什么发这么古老的东西？理由同前两篇</font></p>
<p style="line-height: 180%" class="cc-lisence"><font color="#ff0000">导读：本篇，最主要看最后一点的XML篇，让对XML没有任何了解的人对XML有个基础的了解，并与FLASH结合运用。其他甚至不用带过，直接往下拖即可。之所以发全，是为了一些想学AS，而一点点基础都没有的朋友们</font></p>
<p>&nbsp;</p>
<p>做过Flash动画的Flash爱好者们都知道，要做好一个Flash动画，AS是必不可少的，即使只是很简单的几句代码也能起到整个Flash画龙点睛的作用。这里我只简单的介绍一下AS的基本常识。<br />首先我们要了解AS要写在什么地方，什么时候AS会被触发执行。<br />1、帧：<br />写在关键帧上面的AS，当时间轴上的指针走到这个关键帧的时候，就写在这个帧上面的AS就被触发执行了。常见的例子有在影片结尾的帧写上 stop() 等。操作方法就是点选关键帧，然后打开AS面板。<br />2、按钮：<br />不同于帧上面的AS，按钮上面的AS是要有触发条件的。要把AS写在按钮上，操作方法是点选目标按钮，然后打开AS面板。举个例子能说的更明白。<br />假设有一个动画，要让它在播放完同时停止，那么，你要做的就是在这个动画的最后一帧写AS<br />stop(); <br />再假设有个按钮，效果是按下按钮后停止播放，那么步骤如下。<br />做一个按钮，放到主场景，点选按钮，然后打开AS面板。现在如果也在按钮上写<br />stop(); <br />那么，输出的时候就会提示错误。正确的应该这样写<br />on(release){<br />stop();<br />} <br />这里要比帧的动画多这些代码: on(release){} , 整个代码翻译过来就是: <br />当(松开){<br />停止<br />} <br />红色的代码表示鼠标的触发事件事件之一，这里用的是 release 松开，按钮的常用事件: <br />release 松开 <br />releaseOutside 在按钮外面松开 <br />press 按下 <br />rollOver 鼠标进入按钮的感应区 <br />rollOut 鼠标离开按钮的感应区 <br />现在很明确了:写在按钮上面的AS一定就是这种格式的：<br />on(事件){要执行的代码} <br />3、MC(电影剪辑)<br />如果你看懂了上面的内容，那么写在MC上面的AS和写在按钮上的大同小异。操作方法就是点选MC，然后打开AS面板。看个例子<br />onClipEvent(load){<br />stop();<br />} <br />同样，MC需要一个事件来触发AS的执行。翻译这段代码就是<br />当剪辑(载入){<br />停止<br />} <br />红色代码同样表示一个事件。MC的事件有下面这些:<br />load 载入,当MC出现的时候执行。也就是除非卸载这个MC，否则load事件内的代码只执行一次 <br />unload 卸载，当MC卸载的时候执行 <br />enterFrame 存在的每个帧。在MC存在的每个帧都要执行一次代码。如果你的场景有100个帧，有个MC从41帧开始出现到100帧才消失，那么这个MC上面的代码执行了60次 <br />mouseDown 按下鼠标，在场景内任何地方都算。和按钮不一样的地方 <br />mouseMove 移动鼠标，只要移动鼠标就执行代码 <br />mouseUp 松开鼠标 <br />同样你要明确:写在MC上的代码一定总是这种格式：<br />onClipEvent(事件){代码} <br />看到这里，如果你明白的写在 帧、按钮、MC上的代码有什么不一样，任务就算完成了</p>
<p>AS 对象篇<br />重点 ：点语法学会表达对象<br />学会用绝对路径和相对路径表达对象<br />虽然AS不是真正的面向对象的编程，但是它也有对象的概念。这个概念贯穿整个AS的始终，所以，对对象的理解，比对语法或者其他的理解更为重要。现在开始吧：<br />首先，我们来了解一下路径，路径分两种：绝对路径和相对路径。做过html的朋友应该知道这个概念。但这里我还是要详细解释一下，我认为对路径的理解要深入，我初学的时候就是磕在路径上。<br />在讲路径之前，有必要先讲一下 .语法 : 举例说明，这里要表示房间里的桌子上的一本<br />书，用 .语法这么表示：<br />房间.桌子.书 <br />如果要再细到书上的页上面的字，很显然<br />房间.桌子.书.页面.字 <br />看明白了吧？我也不懂得怎么说， .语法就是这样表示对象的，点的前面是其后面的父级。如房间是桌子的父级，桌子的子级就是书。<br />还是不明白？这样吧，你把 . 里写成&ldquo;里面的&rdquo;就可以了，这样就是<br />房间(里面的)桌子(里面的)书(里面的)页面(里面的)字 <br />这样容易多了吧？<br />现在我开始说路径了，其中也要夹杂的对象的说明，看：<br />从例子入手。新建一个Flash文件，然后创建一个MovieClip,MC命名为&ldquo;MC&rdquo;,放在主场景里面，然后再创建一个按钮，放在&ldquo;MC&rdquo;里面，然后从库里面拖一个出来放在主场景，分别给这两个元素实例命名(Instance Name , 注意是实例名不是MC的名字)：MC-&gt;myMC button-&gt;myBtn<br />现在我们假设主场景是房子，MC是桌子，按钮是书，那么分别怎么表达房子，桌子，书呢？如下<br />_root 房子<br />_root.myMc 房子.桌子<br />_root.myMc.myBtn 房子.桌子.书 <br />这里的 _root 是Flash的关键字，表示主场景的 Timeline （时间线）。<br />很容易理解对不。这里的 房子，桌子，书 都是我们要理解的&ldquo;对象&rdquo;。<br />当你找到这个对象后，才能对对象进行操作，才能给对象施加方法。比如，我现在要打扫房子，打扫是方法，但对象是房子，表达式是这样 ： <br />房子.打扫() <br />如果你不能正确的表达房子这个对象，你的打扫也就不能正确的实施了。<br />*说明:这里为什么要在打扫后面加()呢？因为打扫是方法不是对象，为了让Flash知道这是个方法，我们必须加上(),要不然它会以为房子里面有&ldquo;打扫&rdquo;这个东西。<br />现在，我们可以很容易的对房间里面的各个东西进行操作，如<br />房子.打扫();<br />房子.木桌子.整理();<br />房子.玻璃桌子.打碎();<br />房子.书桌.书.看(); <br />等等，相信你把它们&quot;翻译&quot;成AS代码没什么问题吧 <img src="http://www.wangmeng.cn/Article/UploadFiles/200510/20051011211317817.gif" alt="Smile" width="15" height="15" /> 比如要主场景停止播放，就是<br />_root.stop(); <br />要MC停止播放，就是<br />_root.myMc.stop(); <br />现在说说相对路径。还是上面的例子。假如给你下了一个命令：修理房子里面的红色的椅子。那么怎么表达呢？就是:<br />房子.红色椅子.修理() <br />无论给你下命令的人在哪里告诉你的，你都会知道要修理的椅子是哪一张。但是他如果这么说：修理你现在坐的这张椅子。红色的？还是蓝色的？这就要取决于你坐在哪个椅子上了。那么相对的表达式就是<br />我坐的椅子.修理(); <br />这里为什么不这么写呢：<br />房子.我坐的椅子.修理() <br />这么写是错的，因为我坐的椅子是不固定的，我说不定把椅子搬到房子外面去坐，那这个表达式就错了，因为椅子根本就不在房子里面。<br />换过来用Flash实例说明。现在我想让主场景下的 myMC 在一开始就不要播放，而是先停止。那么你有什么办法呢？<br />我你猜想到的办法可能就是在主场景放入这个MC的那个帧写上：<br />_root.myMc.stop(); <br />这个是对的。但是一旦 myMc 的名字一变，你就得跟着改这句话了。<br />有没有办法不管这个&ldquo;MC&rdquo;的实例名不管怎么改，都会被我们同样一句的AS找到？当然可以，前提是你的AS必须&ldquo;坐在这个MC上&rdquo;。<br />进入Mc的编辑状态 ， 在 Mc 的 Timeline 的第一帧写上 <br />this.stop(); <br />这里的this也是Flash的关键字 ， 这个 this 指AS所在的这条 Timeline .<br />现在不管你这个MC放在哪里，命名是什么，我都不管，反正肯定会停下来。为什么，因为AS正&ldquo;坐在MC上&rdquo;。<br />如果你在这里写上<br />_root.stop(); <br />那就错了。为什么？仔细想想。<br />这个 this 就是相对路径的关键字之一。你必须要仔细理解它。<br />另外的一个关键字就是 _parent 。如果你理解了 this ， 那么 _parent 并不难理解。举例：<br />还是哪个假设 房子(_root) , 桌子( mc_zhuozi ) , 书 (mc_shu) 他们的关系是(括号内为mc实例名)<br />房子.桌子.书<br />_root.mc_zhuozi.mc_shu <br />在 mc_zhuozi 的 timeline 里面写<br />_parent.打扫(); <br />意思就是打扫房间；<br />在 mc_shu 的 timeline 里面写<br />_parent.打扫(); <br />意思就是打扫桌子。<br />_parent 也就是父级。桌子的 _parent 就是房子的 timeline , 书的 _parent 也就是 桌子的 timeline。点的后面的对象 的 _parent 就是点前面的对象。 </p>
<p>AS 语法篇<br />首先要让大家明白的是：AS 语法的大小写是敏感的。<br />如： gotoAndPlay() 正确 gotoAndplay() 错误 。<br />关键字的拼写必须和语法一致，要做到很容易，因为在Flash的AS面板里面，关键字会有不一样的颜色显示。<br />很多Flash小鸟们也许要开始埋怨，记不住咋办？我这里有个办法，就是背。不要流下委屈的泪水，俺们都是这么走过来的。多用两次你就记住了。<br />这里说一下，我们要从开始就养成编程的好习惯，如在每个语句后面都加上分号，有可能的话，尽量给复杂的语句加上注释。注释的例子<br />//这个是注释，但是只能有一行<br />/* 这个也是注释，可以写很多行 */ <br />接下来，介绍几个类型的语法。<br />1、几个常用的控制场景的方法，如<br />play(); //让时间轴的指针播放<br />stop(); //停止时间轴的指针在程序触发时候的那个帧<br />gotoAndPlay(); //让指针跳转到某个帧，然后继续播放<br />gotoAndStop(); //让指针跳转到某个帧，停止在那个帧<br />nextFrame(); //往下走一帧<br />prevFrame(); //往前走一帧<br />上面的都是方法。<br />方法？解：打个比方，我们管吃饭叫作一种方法，用来解决肚子饿这个问题。我们管stop()叫做一种方法，用来解决时间轴指针停下来的问题。我们管上面的几个东西叫方法，用来解决时间轴指针运动的问题。<br />2、控制属性的语法。有很多，我列几个<br />_x<br />_y<br />_alpha<br />_width<br />_name<br />&#8230;..等等属性<br />上面的都是属性<br />属性？解：打个比方。我们管你的身高叫做属性，用来标识你的高度。我们管你的体重叫属性，用来标识你的质量。我们管 _x 叫属性，用来标识目标的X轴坐标。我们管_alpha叫属性，用来标识目标的透明度&#8230;&#8230;.我真罗嗦啊，唉。<br />3、控制语句流程的语法，如<br />if (条件){<br />//条件满足执行这里的代码<br />}else{<br />//条件不满足执行这里的代码<br />}<br />for(i=0;i//执行这里的代码N次<br />}<br />while(条件){<br />//当条件满足时一直执行这里的代码<br />}<br />等等。这些都是基本的语法，也是AS的基础。<br />4、其他方法和自己定义的方法。<br />这里我不能把所有的语法都一一列出来介绍，因为实在是太多了，具体可以参考Flash自带的帮助手册。我们只能在以后的应用中慢慢熟悉。这里，你有个基本概念就行了。到后面我会给每句话都加上注释。<br />回顾一下，今次要大家记住的东西：<br />AS 语法的大小写是敏感的。 <br />方法的概念。 <br />属性的概念。 </p>
<p>[转帖]AS基础精典教程<br />作者和出处俱不详，版权归原作者所有<br />次给大家带来MOOCK在世界性FLASH大会：FF2K1大会上的演说，要说到Action的权威，当然要数MOOCK，他写的ASDG（一本书）是可以和FLASH自带的AS字典相提并论的宝贝。虽然他是这样一个高高手，但是他的这个演讲却是非常的浅显，如果你某处读起来觉得难，那也一定是chocobo翻译得不好。（有些地方实在是太浅，我受不了就改了 ）<br />这篇文章预算的演讲时间很长，所以读起来也会觉得较长，你可以分开来读。<br />还有，本文是关于FLASH5的AS的，毕竟FLASH4的AS已经淘汰。 <br />第一章：由O开始 <br />为了示范，MOOCK将会做一个多选题问答的动画来做为例子。<br />这个例子以4种不同版本的方法来实现。<br />对于用户来说，4种版本使用起来将没有区别，只是对于我们开发者来说，研究的就是如何改进这些FLASH代码的结构与组织。<br />改进的重点在于：<br />*更便易的维护<br />*更便易的扩展<br />*更快捷的建设<br />要牢记的是，学习编程是一个过程（process）而不是一个事件（event）。<br />如果你第一次学习到的时候不能照着完成也不必担心。<br />接下来，MOOCK说到为了照顾没有多少编程经验的菜鸟，会由最最最简单的开始。 <br />关于计算机语言：<br />编程语言是用来发信息给电脑，从电脑接受信息的<br />编程语言也有词汇表和文法，如人类的语言类似<br />通过编程语言我们可以告诉电脑去做什么，也可以从他那获得信息 <br />关于语法和逻辑<br />学习编程的思想比学习一种语言的语法重要<br />假设FLASH是懂我们语言的单词的，我们对FLASH说：&ldquo;Flash, 让一个球在屏幕里面弹来弹去吧&rdquo;<br />FLASH会什么都做不了，FLASH要我们用他的世界懂的东西，例如：movie clips, buttons, frames，来描述它要做的事<br />那我们再说一次：&ldquo;Flash, 让一个名字叫ball_one的movie clip在屏幕里面弹来弹去吧&rdquo;<br />我们已经用MC这个FLASH懂的东西来描述了，但FLASH还是什么都不做，因为它需要更多的信息：<br />*这个球有多大<br />*它放在哪里？<br />*一开始它首先往哪个方向运动？<br />*它初始的速度是多少<br />*它在屏幕的那一个范围之内弹来弹去呢？<br />*弹来弹去要持续多久呢？<br />看来我们需要有逻辑结构地告诉FLASH它应该怎么去做<br />1、一个球指的是一个叫ball_one的圆形MC，直径50像素<br />2、还有一个方形MC叫square，边长300像素<br />3、将ball_one放在square上某处<br />4、以一个随机的角度，75像素每秒的速度开始移动ball_one<br />5、如果ball_one接触到square的某边，就弹回<br />6、一直不停地运动下去，知道我们让它停<br />如果FLASH真的懂我们语言的单词，他应该知道如何开始做了 <br />总结一下关键点：<br />无论是使用什么语言，编程思想的艺术都在于用如何将逻辑步骤列出<br />在你开始将要做的事用计算机语言描述之前，用我们人类的语言描述一次会很有帮助<br />即使你将他们翻译成任何的计算机语言，他们的逻辑步骤应该是一样的<br />电脑不懂用假设完成去你的想法，他们没有思考能力（chocobo：就是你要把要求完全无遗漏地写出来让它运行） </p>
<p>第二章：基础 <br />首先了解如何在FLASH输入程序<br />在FLASH菜单Window里面Actions可打开ACTION面板，ACTION面板分右面的脚本窗，和左面的工具窗<br />脚本窗就是放脚本的地方，而工具窗用于快速地输入各种ACTION，运算符，函数，属性，对象<br />MOOCK建议大家使用专家模式，在FLASH菜单的Edit的Preferences的Actions panel里面选Expert Mode，以后每次打开ACTION面板都会自动设置为专家模式（专家模式可直接输入代码，初学者学下去就会知道，很多代码无法在普通模式里输入） <br />AS的一些概念<br />所有代码都需存于某个地方，可以是frame（帧）, button（按钮）, or movie clip（电影夹子）。<br />只要你选择了某按钮或MC，你之后输入的代码就存放在它的上面了，注意此时ACTION面板上方提示为Object Actions。同理你也可以将代码存放于帧，不过此时提示为Frame Actions。<br />当你在专家模式的时候仍无法输入代码，你首先要检查你是否选择了frame, button, 或MC来存放代码。 <br />然后我们象学所有语言一样吧，来个HELLO WORLD吧<br />在ACTION面板输入<br />var message = &quot;HELLO WORLD&quot;;<br />trace (message); <br />然后我们按CTRL和ENTER键，看到结果了吗？<br />以下两章比较基础。MOOCK是骗演讲费吗？<br />第三章：解读<br />第一行代码：var message = &quot;HELLO WORLD&quot;;<br />告诉FLASH记住一个名字叫message的容器（通常在计算机里称为变量(variable)，在FLASH里面，变量可以装文字，和可以装数字）里面装了这样的数据(datum)，内容为：&quot;HELLO WORLD&quot;<br />&ldquo;=&rdquo;等号是一个常用的运算符号(operators)，在FLASH里面它不是代表相等，而是代表赋值<br />var 命令的含义是宣布给整个电影，此变量的内容是什么。 <br />第二行代码：trace (message); <br />就是要FLASH显示message里面的内容，为什么FLASH能输出内容呢，因为当你按CTRL+ENTER又或者在网上打开这个电影的时候，你输入的每一段Action Scrpit代码，都会通过FLASH的解释器(interpreter)来解读然后执行<br />如果解释器能解释你的代码，他会运行它，并返回你要返回的结果，如果解释器看不懂你的代码，他也会返回错误代码&mdash;&mdash;告诉你错误的原因 <br />通常，我们发给解释器的命令不只命令这么简单，还包括命令的内容例如trace (message); 这个trace输出命令的内容就是message，计算机里就称为参数(argument或parameter)，如果一个命令支持多个参数，参数之间一般用&ldquo;,&rdquo;来分割 <br />第四章 还有一些概念<br />表达式(expression)：(2 + 3) * (4 / 2.5) &#8211; 1可称为一个表达式，&quot;a&quot;+&quot;b&quot;也是表达式，需要解释器运算才得到结果的值，一个相反的概念，不需要运算的直接引用的，称为literal<br />条件(conditionals)：(look at a series of options and make a decision about what to do based on the circumstances)<br />不翻译了，大概意思就是美女穿着新衣上街，会先看看外面会否下雨，这就叫条件判断啦 <br />if(天气==&quot;下雨&quot;){trace(&quot;还是带把雨伞吧&quot;)}<br />循环(loop)：如果要输出5个数字，你是写5遍trace命令吗？更多的就不行了吧<br />你可以用while和for命令来完成重复的动作<br />事件(events)：放在frame里面的代码只要电影播放到就会执行，放在MC、button的代码则只在解释器发现预先设置好的事件被触动的时候执行。最典型的就是一下鼠标点击按钮造成press时间啦。<br />函数(functions)：将一组程序打包成一句命令来调用他，其实FLASH里面的很多命令就是函数：trace、play、gotoAndStop等等都是。<br />第五章 开始第一个版本的选择题的制作<br />多选题共有两道<br />如图，大家应该养成一个好习惯，用一个独立的层来放置代码，并把该层放到最上面会更便于修改。<br />第二层则独立放置Label。不要觉得麻烦，只要你想到世界上大部分好的闪客都是如此做的，你就不会嫌麻烦了。<br />以下的层放的是选择题的内容，如上图 <br />开始创建题目<br />在question 1层的第一帧，写上题目&quot;When were movie clips introduced into Flash?&quot; （什么时候FLASH开始引入电影夹子的概念？）<br />再写上三个选项：Version 1, Version 2, Version 3<br />跟着我们再做一个用来选择的方框按钮，从Library里面拖出这样的三个按钮，分别放到各个选项的前面。<br />第二题的创建我们用第一题来做个模版，选择question 1层的第一帧，选择菜单上的Edit&gt;&gt;Copy Frames<br />再选择question 2的第十帧，Edit&gt;&gt;Paste Frames 将第一题复制过来了<br />当然问题要改成&quot;When was MP3 audio support added to Flash?&quot; （什么时候FLASH开始支持MP3格式导入？），答案也要改成Version 3, Version 4, Version 5 <br />数据初试化<br />虽然是个很简单的FLASH，但是象其他复杂的FLASH一样，先告诉FLASH要用到的数据，例如题目的答案等，这是个好习惯，越复杂的FLASH，受惠越多<br />正常来说定义数据应该LOADING结束之后的。<br />为了把题目定在第一题，ACTION还需要一句stop();<br />选择第一帧，在ACTION面板里面输入代码<br />// init main timeline variables<br />var q1answer; // user&#8217;s answer for question 1 第一题用户的答案<br />var q2answer; // user&#8217;s answer for question 2 第二题用户的答案<br />var totalCorrect = 0; // counts number of correct answers 答对的题数<br />var displayTotal; // text field for displaying user&#8217;s score 显示用户分数的变量<br />// stop the movie at the first question<br />stop();<br />你会发现//开头的那一行代码都变了色，//代表的是注释，是用来辅助阅读代码用的，对代码执行没有影响（是的，你在里面写笑话，写小说都可以，不会影响你的FLASH的^-^）<br />我们定义了四个将要用到的变量，用途已经在注释里面写了，写注释也是一个好习惯 <br />关于命名变量名<br />变量起名displayTotal，意思是 display total，因变量名不能使用空格和破折号，所以用第二个单词的开始字母大写，以此分隔单词<br />一些程序员也喜欢用下划线：display_total<br />记住一定要给你的变量起一个一眼就能识别意义的名字 <br />添加label<br />我们知道第二题是在第10帧的，我们只需要一句AS：gotoAndStop(10); 就可以执行第二个问题了<br />不过MOOCK告诉你这不是好习惯，因为动画的内容是不断改变的，所以我们应当习惯使用label，即使帧数如何变化，只要label指向正确，不需要修改ACTION都可以继续运行（chocobo再提醒你吧，不要使用相同的label，即使在不同是Scene当中）<br />好了，我们在label层的第1、10、20分别F6创建关键帧，给他们写上init、q2、quizEnd <br />要给按钮写上代码了<br />在三个按钮里面分别写入代码，大同小异的：<br />按钮一：<br />on (release) {<br />q1answer = 1;<br />gotoAndStop (&quot;q2&quot;);<br />} <br />按钮二：<br />on (release) {<br />q1answer = 2;<br />gotoAndStop (&quot;q2&quot;);<br />}<br />按钮三<br />on (release) {<br />q1answer = 3;<br />gotoAndStop (&quot;q2&quot;);<br />} <br />这三段代码用人类的语言描述，就是：当用户点击某个按钮选择答案后，把他选择的答案记录到q1answer变量中去，然后进入下一题。<br />on这个单词代表随后的就是一个要触发的事件<br />release是指在按钮上松开鼠标这样一个事件<br />当动画执行到这里的时候，三个按钮都会分别监听用户有没有做在按钮上放开鼠标这个动作，一旦发生，按钮就会自动执行大括号{}里面的代码了<br />若用户选第一个，{}中是：<br />q1answer = 1; //用q1answer变量记住用户选择的是第一个答案<br />gotoAndStop (&quot;q2&quot;); //进入下一题<br />上面我用了注释的方法来解释两句代码，你必须习惯，因为不是所有源程序都有教程，但是好的源程序都会有注释<br />第二题的按钮与前面相似，只是变量换为q2answer，选择完进入结束的画面，例如第一个，改为：<br />on (release) {<br />q2answer = 1;<br />gotoAndStop (&quot;quizEnd&quot;);<br />} <br />结束的画面<br />结束应该做什么，当然是告诉用户分数啦，写在第20帧，就是label为quizEnd的那帧的代码：<br />// tally up the user&#8217;s correct answers<br />if (q1answer == 3){<br />totalCorrect = totalCorrect + 1;<br />}<br />if (q2answer == 2){<br />totalCorrect++; //totalCorrect++其实是totalCorrect = totalCorrect + 1;一个更简洁的写法，几乎少打了一半的字母啊。<br />} <br />// show the user&#8217;s score in an on-screen text field<br />displayTotal = totalCorrect; <br />用人的语言描述：如果第一题选3，答对数加一，如果第二题选2，答对数加一，把答对题目数赋予另一变量<br />现在答对的题数是放到变量displayTotal中了，怎么显示？<br />在quiz end第20帧处建关键帧，键入&quot;Thank you for taking the quiz! Your score final score is: /2&quot;（谢谢回答问题，你最后成绩是答对了 /2道题）<br />在&quot;/2&quot;之前那个空白的地方放上一个文本框，菜单Text&gt;&gt;Options显示文本面板，把Static Text下拉改为Dynamic Text，顺便把Border/Bg的钩去掉，最后在Variable那一栏填上要显示的变量名displayTotal <br />你是不是和chocobo一样不耐烦了？快下载http://www.moock.org/webdesign/lect&#8230;oockQuizzes.zip ;吧，里面的quiz.fla就是本章的内容，其他的fla的内容也将会在后面讲到 </p>
<p>[nextpage] </p>
<p>第六章 再来补充一点AS知识 <br />数据分类是很有必要的，象8005154556这样的一个数字是没有多大意义的，但是如果将他归类到电话号码：800-515-4556，那就有意义了。（这是WHO的电话啊？是不是MOOCK的？呵呵）<br />AS里面数据的类型相对其他语言已经算少的，有：<br />* 字符串String 由一系列的characters组成，可以包含字母，数字和符号，一般用双引号&quot;&quot;扩住（记住不要写了全角的&ldquo;&rdquo;）<br />* 数字Number<br />* 布尔值Boolean 用于条件判断的时候，只有两个值true和false<br />* Null and Undefined 这也是数据的类型之一，Null代表变量还没有内容，Undefined是连变量都未定义<br />* 数组Array 用来按顺序地存放一组数据<br />* MovieClip 这也是数据的一种吗？你就当它是FLASH特有的一种数据吧，装的就是一个个MC INSTANCE（解释一下吧，MC从library拖到场景中就是一个独立的instance，一个MC可以创立多个instance），还有MC里面的其他数据<br />* Object 可以是FLASH已经内部定义的，或者是用户写程序时自定义的一类数据 <br />再分类一下<br />number, string, boolean, undefined, and null，这些属于简单的数据类型，特征是只有一个值<br />array, object, movieclip. 就可以包含不止一个值 <br />chocobo：其实array也应该算是object，上面这些概念的东西总是有些沉闷，没关系，留下印象，以后用到了，自然会回过来真正了解一遍的<br />第七章 可以重复的函数(function)<br />不是用几个例子来示范吗？怎么还不讲例子啊？是的，下一个例子要用到函数，所以再补充点函数知识。（上当了吧？chocobo也上当了，开始翻译的时候没想到这篇东西这么长的，这才讲完第一个例子呢 55~）<br />一个函数是下面这个样子的：<br />function funcName () {<br />statements<br />}<br />在ACTION面板里面，function这个单词是变色的，FLASH认识这个单词，它代表后面的就是描述函数的内容<br />funcName是函数的名字，当你以后要用这函数的时候，就要敲这个名字了（是的，建函数就是为了以后反复调用它）<br />()小括号里面是参数，什么是参数一会再讲<br />{}大括号里面的就是函数所要完成功能的一句句代码。<br />当我们建立函数之后，函数并不运行，只在你用函数的名字调用它出来，才正式开始运行 <br />例如我们有这样一个函数<br />function sayHi () {<br />trace(&quot;Hi!&quot;);<br />} <br />当我们在FLASH某帧需要sayHi的时候，输入AS：<br />sayHi();<br />是不是和最常见的stop();还有play();一样啊？因为它们都是函数嘛 <br />sayHi函数真是智，来个有意义的函数吧。先在场景里放好一个名字叫ball的instance（千万记得要给instance输入名字，否则函数运行没结果别找我）<br />在第一帧输入这样一个函数：<br />function moveBall () {<br />ball._x += 10; // 怕有人不懂，解释一下，_x代表ball的横坐标，ball._x +=10 的意思是ball._x = ball._x + 10 ，这样省略的写法还有 -= *= /= 等等<br />ball._y += 10;<br />} <br />再做一个按钮，按钮的AS：<br />on (release) {<br />moveBall();<br />} <br />好的，运行，从AS你可以看到，每点一下按钮，执行一次函数，而函数让小球下斜下移动。（FLASH的坐标轴，原点在左上角） <br />为什么要建立函数呢，就是想更有效率，现在有这个函数已经不用每移动一下写一次AS了，但还是不够，我们需要更有扩展性(flexibility)的函数<br />这个函数只能移动叫ball的MC，只能向固定的方向移动固定的距离，我们需要可以移动任何MC，向任何方向移动任何距离的函数，这样可以省却很多输入AS的工夫（这就叫一劳永逸，呵呵）<br />我们的新函数有三个地方是每次调用都不一样的<br />1、移动的那个MC的名字<br />2、水平移动的距离<br />3、垂直移动的距离（呵呵，用极坐标，也可以把2、3说成移动的距离，和移动的角度，不过大家都不习惯极坐标）<br />为了告诉函数这些变化的地方，我们需要参数(parameters)，参数在定义函数的时候就要输入，我们的函数改写好了：<br />function moveClip (theClip, xDist, yDist) {<br />theClip._x += xDist;<br />theClip._y += yDist;<br />} <br />当我们要实现原来函数功能的时候，现在调用新函数就变成<br />moveClip (ball, 10, 10)； <br />定义函数的时候function moveClip (theClip, xDist, yDist) {<br />这里的theClip等参数(parameters)只是定义，本质上说是不存在的，因为没有内容嘛<br />当我们用moveClip (ball, 10, 10)；调用的时候，ball就输入到theClip中去了，这里的ball称为arguments（偶读得书少，不会翻译）<br />arguments可以是一个变量，也可以是一个表达式（例如&quot;a&quot;+&quot;b&quot;，先得出结果再传输给函数）只要用逗号隔开各个参数就行 <br />函数如何结束呢<br />正常来说，函数运行完 {}里所有语句结束，我们也可以用一句AS：return; 让它中途结束，例如：<br />function say(msg) {<br />return; <br />trace(msg);<br />}<br />这个函数被调用的时候将什么都不做就结束 <br />return还有更重要的用途：<br />function sqr<img src="http://www.wangmeng.cn/Article/UploadFiles/200510/20051011211320478.gif" alt="Fight" width="32" height="15" /> { // Squares a number 平方<br />return x * x;<br />}<br />a=sqr(2); //a将会被赋予2的平方 4<br />return更重要的用途就是返回数据 <br />在AS里面，有个内建的函数Math.sqrt（就是说你敲入的时候会变色），其功能和我们刚才做的sqr函数是一样的，现在你该知道内建函数也没什么神秘的，我们一样可以做出相同功能的来。<br />第八章 第二个版本选择题的制作<br />读到这你发现什么，我是发现了，MOOCK不是在教AS，他简直是在上编程课。 <br />在第一个版本的制作里你发现了什么缺点？是的，输入了很多次AS，很麻烦。<br />我们要做的是用函数来集中我们的代码，只有集中了才好修改，越复杂的程序越是如此（想象一下在很多个MC之间查代码，真是头痛，当然是集中一块好）<br />这个多选题，我们就归结成两个函数吧answer和gradeUser <br />代码（可以直接看源程序，在上面地址那个ZIP里面的quiz-version2.fla）：<br />大部分的代码都被集中到第一帧了，千万不要被一大堆代码吓着了，代码这么长，只是为了让阅读者看得更清楚而已。（其实越短的代码才越可怕呢，呵呵）<br />// Stop the movie at the first question<br />stop (); <br />// Initialize main timeline variables 定义变量<br />var displayTotal; // Textfield for displaying user&#8217;s score<br />var numQuestions = 2; // Number of quiz questions<br />var q1answer; // User&#8217;s answer for question1<br />var q2answer; // User&#8217;s answer for question2<br />var totalCorrect = 0; // Number of questions answered correctly 以上和例一一样<br />var correctAnswer1 = 3; // The correct choice for question 1 第一题的正确答案<br />var correctAnswer2 = 2; // The correct choice for question 2 第二题的正确答案 <br />// Function to register user&#8217;s answers 这个函数的功能是提交答题者的答案<br />function answer (choice) {<br />answer.currentAnswer++; <br />//现在answer.currentAnswer是1，正在提交的是第一题，下一次answer.currentAnswer就变成2，代表提交的是第二题<br />set (&quot;q&quot; + answer.currentAnswer + &quot;answer&quot;, choice); <br />// 不复杂不复杂，&quot;q&quot; + answer.currentAnswer + &quot;answer&quot;第一题的时候就是q1answer，第二题是q2answer，把参数choice传过来的值放到两个变量里面而已<br />if (answer.currentAnswer == numQuestions) { <br />// 判断是不是两题都答完了，是就转到问题结束帧<br />gotoAndStop (&quot;quizEnd&quot;);<br />} else {<br />gotoAndStop (&quot;q&quot; + (answer.currentAnswer + 1));<br />}<br />} <br />// Function to tally user&#8217;s score 这个函数是改题的<br />function gradeUser() {<br />// Count how many questions user answered correctly 将两个答案和正确答案比较，对就totalCorrect加一<br />//此处用了一个for循环，大家如有疑问的，可以查AS字典，在帝国就有中文版<br />for (i = 1; i &lt;= numQuestions; i++) {<br />// 下面用的eval有必要说一下，它的作用是将字符串和变量组成一个新的变量名，是个很方便的功能<br />if (eval(&quot;q&quot; + i + &quot;answer&quot;) == eval(&quot;correctAnswer&quot; + i)) {<br />totalCorrect++;<br />}<br />} <br />// Show user&#8217;s score in an on-screen text field 将答案显示出来，与第一个例子同<br />displayTotal = totalCorrect;<br />} <br />好了，第一帧的函数写好了，之后每个答案的选择按钮就简单了<br />例如第一题的选项一，就写：<br />on (release) {<br />answer(1);<br />} <br />第二题的写法同上（如果你的选择题有很多道，做法都是一样的，只要复制第一题，然后把题目改了就行）<br />最后在quizEnd帧里面调用改题的函数gradeUser(); <br />分析第二个例子是代码，你会发现比第一个例子精简了很多。 <br />而集中在同一帧的代码，将：<br />* 更容易修改<br />* 更容易升级<br />* 更少的出错机会<br />* 更容易查错<br />* 更精简（更少的字节数）<br />第九章 数组(arrays)<br />在下一个新版本的多选题里，我们将使用什么AS的特性，来让它更好呢？<br />那就是数组。<br />数组就是一系列的数据（MOOCK又开始上课了，chocobo的英文和计算机都不算好，为免误人子弟，概念性的东西尽量精简）<br />例如这样两个变量储存的数据：<br />fruit1 = &quot;oranges&quot;;<br />fruit2 = &quot;apples&quot;; <br />它们是互相独立的，使用起来很不方便，我们需要的是数组，以下是数组的定义方法，用&ldquo;&amp;#;&rdquo;框住，用&ldquo;,&rdquo;分隔开每个元素：<br />fruitList = [&quot;oranges&quot;, &quot;apples&quot;]; <br />现在两个数据是放到同一个数组里面了，我们开始详细解说数组<br />数组里面每一个数据称为元素(element)。<br />而每一个元素都有个独立数字代表所处的位置，数字叫索引(index)，注意! 第一个数据的索引是0，第二个才是1<br />要按索引来提出数据，我们要用一个运算符&amp;#;，例如使用fruitList第一个元素赋值给a：<br />a=fruitList&amp;#0;;<br />又例如将a的值赋给fruitList第一个元素：<br />fruitList&amp;#0;=a; <br />当然&amp;#;里面也可以放表达式、变量：<br />var index = 3;<br />// Set numApples to 2<br />var a = fruitList[index]; <br />下面是个使用表达式的例子：<br />// Create a myFrames array. Note the legal formatting. 建立一个记录LABEL的数组<br />var myFrames = [&quot;storyEnding1&quot;,<br />&quot;storyEnding2&quot;,<br />&quot;storyEnding3&quot;,<br />&quot;storyEnding4&quot;]; <br />// Set randomFrame to a randomly picked element of myFrames<br />// by calculating a random number between 0 and 3<br />// 随机从数组中提取一个LABEL<br />var randomFrame = myFrames[Math.floor(Math.random() * 4)]; <br />// Now go to the random frame<br />// 然后跳到该LABEL播放<br />gotoAndStop(randomFrame); <br />而数组包含数据的个数称为长度(length)，例如fruitList.length 就等于2 <br />对数组最常用的处理就是从数组中选出有用的数据了，来看一个运用循环的例子：<br />// Create an array 建立数组，里面放了一些歌的类型<br />var soundtracks = [&quot;electronic&quot;, <br />&quot;hip hop&quot;,<br />&quot;pop&quot;,<br />&quot;alternative&quot;,<br />&quot;classical&quot;]; <br />// Check each element to see if it contains &quot;hip hop&quot;<br />// 一个循环，检查每一个元素是否等于&quot;hip hop&quot;这个类型<br />// 另外，请留意此处MOOCK对FOR的写法，J=0之前有一个VAR，这好象可有可无，其实是一个好习惯！<br />for (var j = 0; j &lt; soundtracks.length; j++) {<br />trace(&quot;now examining element: &quot; + j);<br />if (soundtracks[j] == &quot;hip hop&quot;) {<br />trace(&quot;the location of &#8216;hip hop&#8217; is index: &quot; + j);<br />break; // 跳出循环，找到了就不用再找了<br />}<br />} <br />关于数组的方法(method)<br />方法就是从属于某一对象(object)的函数，通常都是对该对象进行处理的函数<br />好象太抽象了？我们还没讲到什么是对象，其实数组是对象的一种，我们就暂且将数组的方法理解为一个专门处理数组内数据的结构和内容的工具吧<br />例如一个叫push()的方法就是一个工具，用于为数组添加一个元素，并且加在该数组的最后<br />使用起来并不复杂，看例子就知：<br />// Create an array with 2 elements<br />var menuItems = [&quot;home&quot;, &quot;quit&quot;]; <br />// Add an element 加一个元素<br />// menuItems becomes [&quot;home&quot;, &quot;quit&quot;, &quot;products&quot;]<br />// 现在数组的结构变成[&quot;home&quot;, &quot;quit&quot;, &quot;products&quot;]<br />menuItems.push(&quot;products&quot;); <br />// Add two more elements 这次是加两个<br />// menuItems becomes [&quot;home&quot;, &quot;quit&quot;, &quot;products&quot;, &quot;services&quot;, &quot;contact&quot;]<br />menuItems.push(&quot;services&quot;, &quot;contact&quot;); <br />跟push()相反从最后弹出一个元素的方法是pop()<br />而跟push()类似，但是是将一个元素加到数组的开头的方法是unshift()，与之相反的是shift()<br />方法sort和reverse，用于重新排列数组的元素<br />方法splice用于从数组中间删除某元素<br />方法slice和concat可以在某些数组的基础上生成另一个新的数组<br />方法toString和join可以将整个数组变成单一个字符串 <br />以上方法都可以从AS字典里面查到 </p>
<p>[nextpage} </p>
<p>第十章 第三个版本的选择题 <br />首先，此版本沿用了上一版本的函数answer和gradeUser<br />在这一版本中，用户的答案与正确答案将使用数组来存放 <br />看看我们的新代码：<br />stop();<br />// *** Init main timeline variables <br />var displayTotal; // Text field for displaying user's final score<br />var numQuestions = 2; // Number of questions in the quiz<br />var totalCorrect = 0; // Number of correct answers<br />// 上一版本中，用户答案使用了两个变量来存放，但是试想如果是10题、100题呢？使用数组将更容易管理，也更容易处理<br />var userAnswers = new Array(); // Array containing user's guesses 这是定义数组的语句，但是还未输入数据<br />var correctAnswers = [3, 2]; // Array containing each correct answer 这一句既定义数组，同时输入数据，因为正确答案是已知的 <br />// *** Function to register the user&#8217;s answers<br />function answer (choice) {<br />// Tack the user&#8217;s answer onto our array 将数据PUSH进数组，因为是顺序答题，所以用方法PUSH<br />userAnswers.push(choice);<br />// Do a little navigation, baby<br />// 如果答案数超过题目总数，自然就跳到quizEnd帧了<br />// 注意在本例中，已经不用上例的answer.currentAnswer而是使用userAnswers.length来控制问题是否结束<br />// 我们甚至可以用correctAnswers.length来代替numQuestions，记录正确答案数组的长度，不就是题目总数吗？<br />if (userAnswers.length == numQuestions) {<br />gotoAndStop (&quot;quizEnd&quot;);<br />} else {<br />gotoAndStop (&quot;q&quot;+ (userAnswers.length + 1));<br />}<br />} <br />// *** Function to tally the user&#8217;s score<br />function gradeUser() {<br />// Count how many questions were answered correctly.<br />// 开始改题，这里就不用再用上个版本的eval啦，那个东东实在是难懂兼难用，这个版本相对就很清晰明快<br />for (var j = 0; j &lt; userAnswers.length; j++) {<br />if (userAnswers[j] == correctAnswers[j]) {<br />totalCorrect++;<br />}<br />}<br />// Show the user&#8217;s score in a dynamic text field<br />displayTotal = totalCorrect;<br />} <br />电影的其他部分不用改动（这就是使用FUNTION的好处啦，升级多快~） <br />OK，进入下一章之前想想目前版本的点<br />* 题目，每次修改题目都要进入FLASH的场景修改，麻烦<br />* 按钮，每题就要做三个按钮<br />这都是麻烦的地方，我们要更精益求精地修改，让我们的多选题，轻易地从两题变成10题、100题<br />接下来我们要做的是<br />* 进一步改进我们存放数据的结构<br />* 让我们可以动态地生成每一道题目，只需输入数据，而不需要在FLASH里面作就可以自动生成 <br />所以&mdash;&mdash;我们需要面向对象编程！(object oriented programming) <br />chocobo：嘻嘻，众菜鸟是不是都倒了，AS基础教程竟然开始讲OOP了，呵呵，没关系啊，上面的教程一直都这么浅，以后也深不了<br />第十一章 一点面向对象编程知识 <br />At is heart, OOP simply means that you treat portions of your program as self-contained, but interrelating modules called objects. <br />这是什么呀？我不翻译了，概念的我们就先不懂吧，对象主要构成包括属性(properties)和方法(methods)<br />一个对象通常都以现实世界里的某个东东做蓝本<br />例如我们可以定义一个对象叫球<br />那么这个球将会有这样的属性：半径、X坐标、Y坐标、颜色<br />同时，也会用属于球自己的方法例如：移动球、计算球的面积 <br />当然，我们还可以定义一些相对抽象的对象，例如我们要做的多选题 <br />所有的对象都属于某类(class)，类的意思其实是用于创建对象的模版 <br />一个实例(instance)就是某一个类的特定某一个case（好复杂，概念性的东西我翻不过来啦，反正实例就类创建出来的某一个对象） <br />还是再举例吧<br />* 例如我们有个一个叫Chair的类<br />* 这个类定义了一个东西需要它有四条腿，一个坐垫<br />* 然后我们就可以用Chair这个类来定义我们的不同对象（可理解为椅子的款式），每个对象就有它特有的高、宽、材料、重量、颜色，正是这些属性使每个对象互相区别。 <br />所有的椅子互相区别，有自己的属性，但是他们又有同样的结构：四条腿、一个坐垫 <br />OK，那AS里面的类和对象呢？<br />是的，AS里我们可以自己创建对象，也有可以使用的内建对象<br />内建的类（你可以用它来创建对象）包括：Array, Boolean, Color, Date, MovieClip, Number, Object, Sound, String, XML, XMLSocket <br />内建的对象（已经可以直接使用的对象）包括：Arguments, Key, Math, Mouse, Selection <br />内建的类、对象当然都是在FLASH里面有自己功能的东西。而正是这些功能非常常用，FLASH才内建了这些类和对象，例如：<br />Mouse.hide(); // Hide the mouse pointer 将鼠标隐藏，你经常用吧？现在才知道其实是内建的Mouse对象的一个hide()方法吧？ <br />在学习如何创建自己的类和对象之前，先来了解一下内建类和对象是怎样工作的吧 <br />与数组的结构类似，对象是容器们(containers)的容器(container)<br />一个对象，用各个独立的属性来存放数据，只不过数组区分每个容器是用数字，而对象则是用属性名，要调用一个数组里面某个数据，我们需要它是索引值，而要调用对象的属性，则要知道属性名<br />看看以下这个例子，这是个叫BALL的对象&ldquo;<br />BALL对象有两个属性：radius 和 color<br />而两个属性分别赋值为：50 和 0xFF0000 （这是AS里面表达16进制的方法） <br />概念清楚了，说一AS里面使用对象要注意的地方<br />首先，对象的属性很灵活，它储存的数据可以是strings（字符串）, numbers（数字）, booleans（布尔值）, null（空）, undefined（未定义）, functions（函数）, arrays（数组）, movie clips（电影夹子）, or even other objects（甚至是其他的对象，包括自定义的）. <br />调用属性，可用点语法：objectName.propertyName<br />例如我们赋值给BALL里面的属性radius：<br />ball.radius = 100; <br />我们也可以用符号&amp;#;来访问属性，但是&amp;#;里面的属性名需用双引号扩住，同上例：<br />ball[&quot;radius&quot;] = 100; （所以说数组也是对象一种，访问方法也一样，并没有搞特殊化）<br />与点语法比较，&amp;#;更灵活，可以动态地改变属性的名字，里面可以是变量或表达式，例如：<br />var propName = &quot;radius&quot;;<br />ball[propName] = 100; <br />这点是点语法无法办到的 <br />纯粹的OOP中，我们几乎不会直接访问对象的属性<br />我们一般都使用方法(methods) ，来改变属性<br />例如改变mySound这个声音对象的音量属性<br />AS的用法应该是mySound.getVolume(100);<br />而不是mySound.volume=100;<br />但是为了简单，多选题这个例子里不一定遵循这个原则，事实上AS里面很多对象都不可以办到这点，所以有人说AS不是面向对象语言。 <br />关于对象的方法<br />方法method其实是一些附属于对象的函数，其作用主要是访问对象中的数据，或完成某种功能<br />所以调用方法和调用普通函数类似：objectName.methodName() 只是前面加上了对象的名字<br />例如上面的BALL对象，我们需要它的面积，使用 getArea 这个方法：<br />ball.getArea(); <br />预习一下，在下一个例子中，虽然MOOCK不打算建立自己的方法，但是将使用内建于MovieClip对象的两个方法：<br />*MovieClip.attachMovie()<br />此方法是将Library（CTRL+L按出来的那个）里面的symbol复制一个instance到场景中<br />（chocobo：给不懂概念的人紧急补习，放在库（Library）里面的叫符号(symbol)，拉到场景中就叫实例(instance)，一个符号可创建多个实例，符号改变则实例随之改变）<br />与之类似的是MovieClip.duplicateMovieClip()，但是该方法需要事先在场景里已经有一个实例 <br />*MovieClip.removeMovieClip()<br />此方法与上面相反，是删除场景里面的instance的 <br />大家看到了，在下一例中，我们将使用MovieClip这个内建对象，因为它就可以满足我们的需要，不必新类型的对象了<br />我们先来熟悉一下MC这种对象 <br />它有很多属性_height（高度）、 _alpha （透明度），MC的属性大家可以在AS字典里面查到，在AS面板里这写属性也是变色显示的<br />同时MC的方法，例如 MC.play(); 等也可以查到<br />当我们在MC里面的时间线使用这些属性、方法的时候，可以省略不写前面部分，直接写play(); <br />MC可以互相嵌套，MC当中又有MC，就出现类似： mc1.mc2.play(); 的情况<br />为了调用包含自己的上一级MC的方法、属性，AS里面用_parent，例如：<br />在mc1包含mc2 ，在mc2中想使mc1播放：_parent.play(); <br />还有另一个保留字：_root指代该电影的主时间线<br />例如想在某个mc里面让整个电影播放：_root.play(); <br />想在某个MC中让另一mc1播放：_root.mc1.play(); <br />还有，MC中定义的变量，将作为MC的一个属性可被访问<br />在mc1里面写了一句 var a=1;<br />我们将可使用 mc1.var来调用它 <br />关于类(class)<br />这个概念大家还是不大懂吧？类就是定义一个对象将拥有什么的方法跟属性的东东，类似MC里instance与symbol的关系，instance的结构就是由symbol决定的，每个instance又可以不一样<br />AS里面没有专门定义类的例如class这样的关键字，我们使用函数来定义类，这种函数称构造函数constructor function，函数的作用就是产生我们定义好的类的实例（就是对象）<br />举例最实在：<br />// make a Ball constructor 最简单的构造函数<br />function Ball () {<br />// do nothing 里面是空的<br />} <br />现在我们可以定义新类型Ball的对象了<br />myBall = new Ball(); <br />语法就是前面是新对象实例名，等号后是new加构造函数名<br />myBall就拥有了Ball定义的一切结构了（虽然Ball里面是空的，嘻嘻） <br />不过不是所有对象创建都用new，例如mc创建就用的是attachMovie()或duplicateMovieClip() <br />好了，我们的构造函数总不能空的，如何定义类，让新对象有自己的属性呢？<br />使用this这个关键字，看例子，新的构造函数：<br />function Ball () {<br />this.radius = 10;<br />this.color = 0xFF0000;<br />this.xPosition = 35;<br />this.yPosition = -4;<br />} <br />以后我们定义出来的新对象，都拥有半径，颜色、XY坐标属性啦<br />慢着，怎么每个新对象都一模一样啊？<br />再改，用函数的参数来定义动态的属性：<br />// Make the Ball constructor accept<br />// property values as arguments.<br />function Ball (radius, color, xPosition, yPosition) {<br />this.radius = radius;<br />this.color = color;<br />this.xPosition = xPosition;<br />this.yPosition = yPosition;<br />} <br />我们可以定义不同属性的对象了<br />myBall = new Ball(6, 0&#215;00FF00, 145, 200); <br />本教程关于还有创建方法以及如何在类之间继承方法和属性没讲，<br />无论如何，OOP都不可能在这么短时间之内说清楚，<br />但这不妨碍我们做下一个例子了。 </p>
<p>第十二章 第四个版本的选择题 <br />第三个版本的时候我们已经设想好，新版本中题目将是动态生成的，不用我们在FLASH的场景里面一题一题输入了，我们要做的只是输入题目和题目答案的数据就够了。<br />很明显，每一条题目都将是一个对象（不然我们学这么多对象的知识干嘛？），而这些所有的题目，会用一个数组来存放 <br />再重提一下，可配合源程序学习 <a href="http://www.moock.org/webdesign/lect...oockQuizzes.zip" onclick="pageTracker._trackPageview('/outgoing/www.moock.org/webdesign/lect...oockQuizzes.zip?referer=');"><u>http://www.moock.org/webdesign/lect&#8230;oockQuizzes.zip</u></a> ;<br />好，开始设计题目的模版<br />模版就是一个MC，包含两个TEXT FIELD，里面不用填东西，分别起变量名为：（FOR小鸟：TEXT FIELD就是按工具条里T按钮拉出来的文本框，同时还要在文本面板(ctrl+t)里将其改为Dynamic Text，变量名则在面板的Variable处改）<br />* qNum （以后将显示题目的编号）<br />* qText （以后将显示题目的正文）<br />我们还要在库里面做标识，点一库面板(ctrl+l)右上的Options&gt;&gt; Linkage ，选第二个Expert this symbol，identifier填上questionTemplate，至此，题目模版完成 <br />再制作选项的模版<br />选项模版应包括一个选择用的按钮<br />还有该选项的内容，一个起名为answerText的TEXT FIELD<br />在本例的后面，将为每一个动态生成的选项一个唯一的名字，譬如： &quot;answer0&quot;, &quot;answer1&quot;,&#8230;&quot;answern&quot;. <br />答题者所选定的答案将由这个名字来决定，调用一个MC的名字，用的是_name这个属性<br />所以答题的按钮上面的AS为：<br />on (release) {<br />// Trim the prefix &quot;answer&quot; off this clip&#8217;s name<br />// 下面使用了String.slice()方法，例如_name为answer0，它将被处理成0，slice的具体语法请查阅AS字典<br />// 按钮提交什么由该MC的名字决定的，我作个标记 @@ ，记得一会看回来<br />choice = _name.slice(6, _name.length);<br />// 与前面的例子一样，最后将答案提交给answer函数处理，不过现在我们是在某一MC里面用外面主时间线的函数了，所以得加上_root<br />_root.answer(choice);<br />} <br />最后，Options&gt;&gt; Linkage，标识名：answerTemplate，制作模版的工作就完成了 <br />下面将是放在第一帧的程序主体，可要打起精神来了： <br />// Stop the movie<br />stop();<br />// Init main timeline variables<br />var displayTotal; // Text field for user&#8217;s final score<br />var totalCorrect = 0; // Number of questions answered correctly <br />// Array containing the user&#8217;s guesses 记录作答答案的数组<br />var userAnswers = new Array(); <br />// Number of the question the user is on 记录正在作答中题目的编号<br />// 要注意的是，它是由0开始的，第一题的编号是0，因为我们要用到数组，数组的第一个编号是0，所以这里我们也用0<br />var currentQuestion = 0; <br />// The Question constructor <br />// 以下是新类型对象question的构造函数，包含三个属性：正确答案，题目正文，各个选项<br />function Question (correctAnswer, questionText, answers) {<br />this.correctAnswer = correctAnswer;<br />this.questionText = questionText;<br />this.answers = answers;<br />} <br />// Import the source file containing our array of question objects <br />// 咦？应该是输入各条题目的数据先啊，放哪去了？因为嘛，数据输入是个与编程无关的过程，为了让代码更优雅，这些繁琐的东西扔别地方去了，AS太长，会使查阅相当麻烦，分开存放也是好习惯！<br />// #include是引用外部AS命令，可以将AS分开储存于各个后缀名为AS的文件中，输入题目的代码就是放到了questionsArray.as中（记得和FLA放在同一目录下喔）<br />#include &quot;questionsArray.as&quot; <br />//// 我改变了一下教程的结构，把questionsArray.as的内容也插入进来了，因为跳过这段的话，看起来会有疑问<br />//// 以下内容系存放questionsArray.as中的 <br />// 输入数据其实是建立对象<br />// MOOCK用一个数组还存放这些对象，这样对象才更易于管理<br />// 不要被括号给弄昏了，输入对象参数的中间还有中括号，是因为输入题目的参数&ldquo;各个选项&rdquo;是一个数组<br />// 因为是存放于数组中，每个对象之间记得应有逗号分隔<br />// Remember to place a comma after each object<br />// in the array except the last <br />questionsArray = [new Question (2,<br />&quot;Which version of Flash first introduced movie clips?&quot;,<br />[&quot;version 1&quot;, &quot;version 2&quot;, &quot;version 3&quot;,<br />&quot;version 4&quot;, &quot;version 5&quot;, &quot;version 6&quot;]), <br />new Question (2,<br />&quot;When was Action formally declared a ing language?&quot;,<br />[&quot;version 3&quot;, &quot;version 4&quot;, &quot;version 5&quot;]), <br />new Question (1,<br />&quot;Are regular expressions supported by Flash 5 Action?&quot;,<br />[&quot;yes&quot;, &quot;no&quot;]), <br />new Question (0,<br />&quot;Which sound format offers the best compression?&quot;,<br />[&quot;mp3&quot;,&quot;aiff&quot;, &quot;wav&quot;]), <br />new Question (1,<br />&quot;True or False: The post-increment operator (++) returns the<br />value of its operand + 1.&quot;,<br />[&quot;true&quot;, &quot;false&quot;]), <br />new Question (3,<br />&quot;Action is based on&#8230;&quot;,<br />[&quot;Java&quot;, &quot;Java&quot;, &quot;C++&quot;, &quot;ECMA-262&quot;, &quot;Perl&quot;])]; <br />//// 离开questionsArray.as部分，我们继续 <br />// Begin the quiz 出题目！调用makeQuestion函数来完成，我们只需要给这个函数一个参数：题目的编号，函数就会按编号提取数据，结合我们刚才做的模版生成题目。<br />makeQuestion(currentQuestion); <br />// Function to render each question to the screen<br />// 下面就是makeQuestion函数<br />function makeQuestion (currentQuestion) { <br />// Clear the Stage of the last question<br />//这句是清理上一题生成的MC，这句从第二题开始生效，questionClip就是题目的MC名，MC从哪来的？看下面就知道了<br />questionClip.removeMovieClip(); <br />// Create and place the main question clip<br />// 利用模版questionTemplate生成一个叫questionClip的MC，这个MC就是我们的问题<br />attachMovie(&quot;questionTemplate&quot;, &quot;questionClip&quot;, 0);<br />// 设定MC的位置<br />questionClip._x = 277;<br />questionClip._y = 205; <br />// 把题目编号输入MC的qNum文本框中<br />questionClip.qNum = currentQuestion + 1; <br />// questionsArray[currentQuestion]就是数组questionsArray里的第currentQuestion个对象，例如currentQuestion是0，那么就是我们的第一条题目<br />// questionsArray&amp;#0;.questionText就是第一条题目对象的问题属性<br />// 然后问题输入MC的qText文本框中<br />questionClip.qText = questionsArray[currentQuestion].questionText; <br />// Create the individual answer clips in the question clip<br />// 以下循环将结合选项模版生成这一条题目的各个选项的MC <br />// questionsArray[currentQuestion].answers记得吗？选项这个属性可是个数组，所以我们把它的长度作为循环的次数，这个数组有多大，我们就生成多少个选项<br />for (var j = 0; j &lt; questionsArray[currentQuestion].answers.length; j++) { <br />// Attach our linked answerTemplate clip from the Library.<br />// It contains a generalized button and a text field for the question.<br />// 用answerTemplate做模版生成MC，MC名为&quot;answer&quot; + j ，即第一个选项MC名为answer0，第二个为answer1，选项的名字可是关系到按钮选什么的，如果你忘了，看看上面有 @@ 标记的地方<br />// 同时它们的深度为j，每次不同 <br />// 但和上面不同的是，我们要把选项MC生成到题目MC里，这样我们清除题目MC的同时也清除了选项<br />// 所以写成questionClip.attachMovie<br />questionClip.attachMovie(&quot;answerTemplate&quot;, &quot;answer&quot; + j, j); <br />// Place this answer clip in line below the question.<br />// 设定MC的位置，第一个高度为70，之后顺序加15<br />questionClip[&quot;answer&quot; + j]._y += 70 + (j * 15);<br />questionClip[&quot;answer&quot; + j]._x -= 100; <br />// Set the text field in the answer clip to the appropriate<br />// element of this question&#8217;s answer array.<br />// 下面语句的：questionClip[&quot;answer&quot; + j]可不是指数组，j=0的时候，它代表questionClip.answer0，具体解释可见上一章。<br />// 这句语句的作用是把questionsArray[currentQuestion]这个对象数组里面的answers[j]数组，输入到对应的选项MC的answerText文本框中，就是该选项的内容<br />questionClip[&quot;answer&quot; + j].answerText = questionsArray[currentQuestion].answers[j];<br />} <br />//生成选项的循环结束 <br />} <br />// Function to register the user&#8217;s answers<br />// 以下是记录答题者答案的函数，记录在数组userAnswers中，和上一例同<br />// 每一个选项如果被选都会调用此函数，并用参数choice传来作答的答案<br />function answer (choice) {<br />userAnswers.push(choice); <br />// 判断是否题目全部完成，是的话清楚掉题目MC，并跳转到quizEnd帧<br />if (currentQuestion + 1 == questionsArray.length) {<br />questionClip.removeMovieClip();<br />gotoAndStop (&quot;quizEnd&quot;);<br />} else {<br />// 在这里改变题目的编号，然后调用makeQuestion函数再次生成新的题目<br />currentQuestion++;<br />makeQuestion(currentQuestion);<br />}<br />} <br />// Function to tally the user&#8217;s score<br />// 改题的函数<br />function gradeUser() {<br />// Count how many questions the user answered correctly<br />for (var j = 0; j &lt; questionsArray.length; j++) {<br />// 将答题数组userAnswers[j]与问题数组questionsArray[j]的属性correctAnswer逐个比较<br />if (userAnswers[j] == questionsArray[j].correctAnswer) {<br />totalCorrect++;<br />}<br />}<br />// Show the user&#8217;s score in an onscreen text field<br />// 显示答对与题目数比<br />displayTotal = totalCorrect + &quot;/&quot; + questionsArray.length;<br />} <br />好了，我们来总结一下这个例子吧<br />我们已经完成了第三个版本结束时候定下来目标，更快捷的建设，更便易的扩展<br />我们的题目跟选项都是动态生成的，也就是说生成10、100题或更多题目也只需要修改questionsArray.as这个文件就可以了<br />如果说生成两题这个例子用时要长于上面的例子，那么生成100题，你会发现用这个例子将是最快的。还有，在100题里面修改其中一题，也是最快的。 <br />看完了例子，希望大家不是只明白了代码的含义，最重要是理解运用对象来编程的方法<br />同样的例子，其实还可以用其他的对象结构来完成的<br />更有效地组织数据也是编程艺术的一部分 <br />为了更进一步改进我们的例子，最后一个，就是第五个版本，将用XML代替那个存放对象的数组（也就是在questionsArray.as里那个），它实在太难懂了，是不是啊？呵呵<br />XML，名字是不是很COOL啊，其实，FLASH里面用XML不难（其他地方的应用就&hellip;&hellip;所以千万别说XML不难，是FLASH里面用不难），呵呵，好吧，开始吧。 </p>
<p>[nextpage] </p>
<p>第十三章 XML <br />XML是一种标记语言，通常用于储存，组织和传输数据 <br />XML文档主要由一系列的元素(elements)和属性(attributes)组成，看下面一个XML的例子： <br />Colin Moock<br />O&#8217;Reilly<br />这个例子就是由元素 BOOK, TITLE, AUTHOR, PUBLISHER 组成的 <br />在元素里就包含了一个属性：SALUTATION <br />这些元素怎么让浏览器解释是什么意思呢？它需要DTD，一套决定这些标记的意义的规则。（例如我们常听说的WML、SVG，它们都是XML，但对应不同的DTD） <br />XML与HTML想比要求格式更严格，格式要求：<br />* tags 一定要嵌套 （就是说有就一定要有）<br />* 一定要有一个根元素 （例如例子中的 BOOK）<br />* 开始部分要用XML声明标记 ： <br />但是AS里面的XML不需要DTD（这就是我说FLASH里面用XML不难的原因，哈哈） <br />从我们面向对象的角度来看，我们XML的内容可以当做为对象，下图就是我们建立XML对象的层次结构 <br />FLASH已经内建有XML类让我们可以定义自己的XML对象，同时XML对象还有很多方法。 <br />我们还是更进一步用例子分析吧，如果我们建立了如上图的XML对象，那么FLASH首先会自动建立一个元素document．下面才是我们自己的元素。 <br />本来是第一个元素的BOOK成为了document．第一个节点(node)，不过我们把它继续当我们XML数据的根也无妨 <br />当一个节点包含于另一个节点时，这个节点称为另一节点的子节点(child)，反之另一节点称为其的父节点(parent) <br />例子中BOOK就是document．child，document．是BOOK的parent <br />再看图，BOOK有7个子节点，是不是和你想象不同？多了四个节点#text，因为FLASH把标记之间的空格和回车也读成一个节点了。 <</p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2007/12/19/flahs-as-no-basis-for-entry-classic-tutorials/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>as2深入理解函数</title>
		<link>http://www.glglife.com/2007/12/19/as2-depth-understanding-of-function/</link>
		<comments>http://www.glglife.com/2007/12/19/as2-depth-understanding-of-function/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 08:47:26 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[AS入门]]></category>
		<category><![CDATA[AS理念]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2007/12/19/as2%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3%e5%87%bd%e6%95%b0/</guid>
		<description><![CDATA[看到这篇文章，我想很多人回问我为什么在AS3大潮的时代，&#160;发一片过时已久的AS2教程，而且还是基础教程...]]></description>
			<content:encoded><![CDATA[<p style="line-height: 180%" class="cc-lisence"><font color="#ff0000">看到这篇文章，我想很多人回问我为什么在AS3大潮的时代，&nbsp;发一片过时已久的AS2教程，而且还是基础教程。</font></p>
<p style="line-height: 180%" class="cc-lisence"><font color="#ff0000">这里解释一下。发现身边很多人，说自己熟悉AS2。可是看他们写的东西绝对的是AS1.1，甚至有的还是AS1.0的。有些人根本连AS2和AS1.X的区别都没有搞清楚，甚至一些2.0的理念、接口、类等，和AS1还是有较大区别的。而这些东西，在一个熟悉了AS1.X的人想直接学习AS3，会因为其中的一些东西而感到迷惑，最常见的就是一些往往认为很简单的东西，为什么到了AS3要加一大堆PACK和CLASS，还要指名PUBLIC，还要写出一大堆看似没用的东西。</font></p>
<p style="line-height: 180%" class="cc-lisence"><font color="#ff0000">虽然AS3较AS2来说有很大的差别，说天翻地覆也不为太过，不过，对于没有一点点OOP概念的人来说（特别是认为AS1.X</font><font color="#ff0000">就是AS2的人），下面这篇东西就比较值得一看了。不是为了学习AS2，而是为了能够更好的理解AS3</font></p>
<p>◆理解函数的目的<br />◆给函数传递参数<br />◆理解函数的变量作用域的重要性<br />◆编写自定义函数<br />◆从函数返回值<br />◆用setInterval()创建递归函数<br />通过使用函数,就可以创建可重用的代码、可读的代码、灵巧的代码。有了函数,就可以写出有效的、结构精巧的、维护得很好的代码,而不是冗长的、笨拙的代码。</p>
<p><strong>一、理解用函数进行编程<br /></strong>函数是一种革新。写代码没有函数,就像出版图书没有印刷机,出版业是如此没有生产力,如此没产量。有了印刷机,只制一次版,就可以从那个版复制出许多副本了。印刷机是一种革新。同样地,如果编程序没有函数,就不得不一次一次地写出代码的每一行。但是,当写出一个函数时,就可以将多条语句封装在一起,就可以重复地调用那个函数(即那些语句的组),而不用重复写相同的代码了。那就巧妙多了。函数是一种组织起一个代码块的方法,该代码块直到从其主流程中调用(直接地或间接地)时才执行。换句话说,函数是一种将调用时才执行(不调用不执行)某个特殊任务的代码块包装在一起的方法。函数比非结构化编程更具优势。这些优势包括:<br />◆ 通过消除混乱和冗余的代码,使代码更具有可读性。<br />◆ 通过重复使用函数而不是每次重复输入整个代码块,使程序更加有效率。<br />◆ 函数成为了进行修改的中心点。在函数中做个修改,该修改就能被应用到每个调用该函数的实例中。<br />◆ 编写成熟的函数可以在许多程序中重复使用。因此,可以开发出一个可被用于建立各种程序的函数库,而不需要每次从打草稿开始写脚本。<br />◆ 包装在一个函数中的代码提供了进行用户交互的基础。如果没有函数,应用程序就像一个单独的程序那样运行。有了函数,一个用户发起的动作就可以调用一个函数。 </p>
<p><strong>二、定义自定义函数</strong> </p>
<p>我们已经知道在<a href="http://www.51as.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.51as.com/?referer=');"><strong><font color="#f56b06">ActtionScript</font></strong></a>代码中使用函数的某些优点了。现在,需要学习如何来写函数。写一个函数也被称为&ldquo;定义&rdquo;或&ldquo;声明&rdquo;一个函数。函数的语法: </p>
<p>function&nbsp;函数名(参数):返回数据类型{ <br />&nbsp;&nbsp;函数体 <br />) </p>
<p>在函数的语法中,要注意如下几个关键点:<br />◆function关键字告诉Flash,正在声明一个函数。当定义一个函数时,必须像上面那样包括function关键字。<br />◆函数应该遵守变量的命名规则。就像命名变量那样,给函数取一个能表示其功能的名字是一个好想法。<br />◆所有函数的定义都必须在函数名字后面包括一对圆括号。在圆括号中的&ldquo;参数&rdquo;可以没有。在后面可以读到有关参数的更详细的内容。但是,无论一个函数是否定义了参数,都必须在定义中包括一对圆括号。<br />◆圆括号后面接着就是冒号和一个有效的数据类型名字。数据类型是函数将返回的数据的类型。在后面会看到如何返回数据。使用Void表示该函数不返回值。<br />◆函数体是由一对开始和结束波浪式大括号({})定义的。<br />现在已经知道基本的语法了,那就看一个非常简单的函数例子吧: </p>
<p>function&nbsp;displayGreeting():Void{ <br />&nbsp;&nbsp;trace(&quot;Hello.&quot;); <br />} </p>
<p><strong>三、调用函数</strong><br />我们将术语&ldquo;函数&rdquo;定义为延迟执行的代码块。这就是说,一个函数可以被定义,但直到访问或调用它之前什么也不会发生。可以自己测试一下这一点,即在主时间轴的第1帧中,用如下代码创建一个新的Flash影片: </p>
<p>function&nbsp;displayGreeting():Void{ <br />&nbsp;&nbsp;trace(&quot;Hello.&quot;); <br />} </p>
<p>当测试该影片时会看到,尽管在代码中有一个trace()动作,但什么也没发生。所以,既然知道了如何&ldquo;定义&rdquo;函数,就需要学习如何通过&ldquo;调用&rdquo;它们而在程序中使用它们。为了调用一个函数,需要使用该函数的名字,并后跟一个圆括号(它被称为&ldquo;函数调用运算符&rdquo;)。当调用一个函数时,对函数的调用本身就是一个语句。因此,应该在该语句的后面使用一个分号。下面的例子定义了一个函数,然后调用它。如果想自己学习和测试它,只需将该代码放置在主时间轴的第1帧即可。 </p>
<p>function&nbsp;displayGreeting():Void{ <br />&nbsp;&nbsp;trace(&quot;Hello.&quot;); <br />} <br />displayGreeting();//调用函数 </p>
<p>当测试该影片时,在Output窗口中显示如下内容：<br />Hello. </p>
<p><strong>四、传递参数<br /></strong>某些函数不需要给它们传递任何信息。例如,前面一节中的dlsplayGreetlng()函数就不需要任何参数。换句话说,许多函数需要给它们传递参数。例如,如果dlsplayGreetlng()函数可以使用不同的姓名来显示个性化的问候,就会使dlsp]ayGreetlng()函数更加有趣了。有了参数,实现这一点就简单了。把上面的函数修改一下,如下所示: </p>
<p>function&nbsp;displayGreeting(姓名:String):Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;Hello.&quot;+姓名) <br />} </p>
<p>一旦用这种方式定义了该函数,就可以调用它了,并给它传递不同的参数值。某些例子如下所示:<br />displayGreeting(&quot;张三&quot;);//显示:Hello.张三<br />displayGreeting(&quot;李四&quot;);//显示:Hello.李四<br />在一个函数中,一个参数就是一个变量,当调用该函数时就给变量赋值。就像在displayGreeting()函数中所看到的那样,参数被命名为&quot;姓名&quot;,在每次调用该函数的时候就给该参数设置值。当用值&quot;张三&quot;调用该函数时,该变量就被赋予了&quot;张三&quot;;当用值&quot;李四&quot;调用该函数时,该变量就被赋予了&quot;李四&quot;。参数(变量)是在函数定义的圆括号中声明的。读者可能注意到了,参数的声明与常规变量的声明相似但略微不同。首先,声明的相似性在于,需要给变量创建一个名字并定义一个数据类型。但是,当声明一个参数时,不需要使用var关键字,也不需要使用分号,并且不能在圆括号中初始化一个参数。下面的代码是不正确地声明参数的例子,将产生错误: </p>
<p>//不能使用var关键字。 <br />function&nbsp;displayGreeting(var&nbsp;姓名:String):Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;Hello.&quot;+姓名) <br />} <br />//不能使用分号。 <br />function&nbsp;displayGreeting(姓名:String;):Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;Hello.&quot;+姓名) <br />} <br />//不要试着在圆括号中初始化变量。 <br />function&nbsp;displayGreeting(姓名:String=&quot;王麻子&quot;):Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;Hello.&quot;+姓名) <br />} </p>
<p>如果想在函数中使用多个参数,该怎么办呢?很简单,当定义函数时,可以声明用逗号分隔开的多个参数。同样地,当调用该函数时,可以给它传递多个值,只需简单地用逗号分隔这些值即可。如下是具有多个参数的dlsp]ayGreetlng()函数的例子: </p>
<p>function&nbsp;displayGreeting(姓名:String,体重:Number):Void{ <br />&nbsp;&nbsp;trace(姓名+&quot;的体重是:&quot;+体重); <br />} </p>
<p>displayGreeting(&quot;张三&quot;,50);//显示:张三的体重是:50 ，读者可能注意到了,当开始将越来越多的参数添加到一个函数定义的参数列表中时,代码就开始超出编辑器的边界了。可以在Actions面板中启用自动换行功能。还可以在定义函数时将每个参数(或参数组)放置到新的一行中。这是一个通常采用的习惯,因为它能更容易地阅读一个由许多参数组成的函数的参数列表。语法是相同的,区别仅在于:参数列表中的每个参数都放在新的一行中,以便使它更容易阅读。例如: </p>
<p>function&nbsp;displayGreeting(姓名:String, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;体重:Number):Void{ <br />&nbsp;&nbsp;trace(姓名+&quot;的体重是:&quot;+体重); <br />} </p>
<p>注意:定义函数的参数个数与调用时传递的参数个数不一定要相同,当然,如果该有的参数没有的话,可能函数不会正常工作,多个参数是按先后顺序依次&ldquo;对号入座&rdquo;的。<br />1、给参数传递值和引用。<br />当给函数传递参数时,参数是用两种方式之一进行传递的:按值和按引用。其区别与数据类型有关。<br />(1)基本数据类型,如string,number,Boolean,是按值传递的。这就是说,值被传递给了函数,而与该值所来自的变量的任何联系都被切断了。换句话说,当值被传递给函数后,任何被用于传递值的变量就独立了。下面是一个例子: </p>
<p>function&nbsp;引用测试(a:Number):Number{ <br />&nbsp;&nbsp;a++; <br />&nbsp;&nbsp;return&nbsp;a; <br />} <br />var&nbsp;b:Number=5; <br />var&nbsp;c:Number=引用测试(b); <br />trace(b); <br />trace(c); </p>
<p>Output窗口会显示如下内容<br />&nbsp; &nbsp; 5<br />&nbsp; &nbsp; 6<br />在这个例子中,尽管b的值被传递给了函数,并且那个值在函数中被增加了1,但b仍保持它的值(5)。为什么?因为b的值被传递给了函数,而不是变量自己。然后,那个值在函数中被赋予了一个名为a的参数,被增加、被返回。然后,返回的值被赋予了一个新的名为c的变量。<br />(2)当引用数据类型被作为参数传递时,它们就按引用进行传递。这就是说,一个被传递给函数的对象是对该实际对象的一个引用。其结果是,在函数中对对象引用所做的任何事情都会影响到该对象本身。没有产生该对象的副本。下面是一个使用名为mBox的<strong>MovieClip</strong>实例的例子: </p>
<p>function&nbsp;move(mA:MovieClip,X:Number,Y:Number):Void{ <br />&nbsp;&nbsp;mA._X=x; <br />&nbsp;&nbsp;mA._y=y; <br />} <br />move(mBox,100,100); </p>
<p>上面这个例子将名为mBox的MovieClip对象移动到舞台的(100,100)处。 </p>
<p>2、使用arguments属性。<br />现在所看见过的函数要么不使用任何参数,要么参数被声明为圆括号中的参数列表。但是,不管一个函数是否声明了任何参数,传递给函数的所有参数都被保存在一个名为arguments的特殊数组中。每个函数都有一个arguments变量(对象),当调用函数的时候,就在该函数中创建该变量。<a href="http://www.51as.com/" target="_blank" title="as教程" onclick="pageTracker._trackPageview('/outgoing/www.51as.com/?referer=');"><font color="#f56b06">ActionScript</font></a>并不强求函数定义中的参数个数与调用时传递给该函数的参数个数一致。其意思是在调用时没有被传递、但在函数的参数字符串中被定义过的任何值,都会具有一个undeflned值;而在函数调用中传递的任何值,如果在函数的参数定义中没有它,就会被忽略。因此,完全可以定义一个没有参数的函数,但仍然可使用arguments对象传递参数。下面是一个把arguments对象作为数组使用的例子: </p>
<p>function&nbsp;traceParams():Void{ <br />&nbsp;&nbsp;for(i=0;i&nbsp;&nbsp;&nbsp;&nbsp;trace(arguments[i]); <br />&nbsp;&nbsp;} <br />} <br />traceParams(&quot;one&quot;,&quot;two&quot;,&quot;three&quot;); </p>
<p>在这个例子中,下面的内容会显示在Output窗口中:<br />one<br />two<br />three<br />在大多数函数中,声明参数要好得多。当重载一个函数或遇到相似情况时(参见&ldquo;重载函数&rdquo;一节),arguments对象很有用。每一个arguments对象都有两个特殊的引用函数的属性。尽管不常使用这些属性(caller和callee)，但在某些情况下(特别是在开发高度抽象的函数时)这些属性却有用。如果有一个函数调用当前函数的话，arguments对象的caller属性就返回对这个函数的引用。如果没有另一个函数调用当前函数的话，caller属性就有一个null值。 </p>
<p>function&nbsp;function1():Void{ <br />&nbsp;&nbsp;function2(); <br />} <br />function&nbsp;function2():Void{ <br />&nbsp;&nbsp;if(arguments.caller==function1) <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;function2&nbsp;called&nbsp;from&nbsp;function1&quot;); <br />&nbsp;&nbsp;else <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;function2&nbsp;not&nbsp;called&nbsp;from&nbsp;function1&quot;); <br />} <br />function1();//Output:function2&nbsp;called&nbsp;from&nbsp;function1 <br />function2();//Output:function2&nbsp;not&nbsp;called&nbsp;from&nbsp;function1 </p>
<p>一个函数的arguments对象的callee属性是对该函数本身的引用。可能不能立即看出为什么说这是有用的。但是，考虑一下匿名的递归函数的情况。可以像下面这样写一个可以递归地调用自己的函数： </p>
<p>Var&nbsp;fFactorial:Function&nbsp;=function(nOperand:Number):Number{ <br />&nbsp;&nbsp;&nbsp;&nbsp;if(nOperand&gt;0){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nOperand&nbsp;*&nbsp;arguments.callee(nOperand-1); <br />&nbsp;&nbsp;&nbsp;&nbsp;}else{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1; <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />} </p>
<p><strong>五、从函数返回一个值</strong><br />到现在为止，主要介绍了函数作为子程序的这一点。也就是说，函数可以将主程序分解为更小的、更易管理的片段。一方面，当函数用那种方式作为一个子程序时，函数并不需要返回一个值。另一方面，某些时候想创建一个函数，用它进行某些计算或操作，然后返回一个值。可以在一个函数中使用return语句来返回一个特定的值。return语句的语法如下所示：<br />&nbsp; &nbsp; return value；<br />当使用return语句从一个函数返回一个值时，应该指定要被返回的数据类型(在函数定义的圆括号后面指定)。在此之前的例子中，返回类型是Void(表示无返回)。但是，当返回一个字符串时，就应该将返回的数据类型设置成String;当返回一个数字时,就应该将返回的数据类型设置成Number,等等。下面是一个计算矩形面积的函数的例子,其返回值是数字: </p>
<p>function&nbsp;求面积(nA:Number,nB:Number):Number{ <br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nArea:Number=nA&nbsp;*&nbsp;nB; <br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nArea; <br />} </p>
<p>只要遇到return语句,Flash就退出该函数。因此,如果在return语句后面还有其他剩余代码,就不会再执行它们了。例如: </p>
<p>function&nbsp;求面积(nA:Number,nB:Number):Number{ <br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nArea:Number=nA&nbsp;*&nbsp;nB; <br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nArea; <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;The&nbsp;area&nbsp;is:&quot;+nArea); <br />} </p>
<p>求面积(6,6);在上面的例子中,trace()语句总是不会被执行的。这是因为在函数中的return语句后面的代码是执行不到的。下面是一个使用几个return语句的例子。明显地,在任何对该函数的调用中,只可能遇到其中的一个return语句。而在这个例子中,一个return语句是在条件满足时遇到的,其他return语句是在条件不满足时遇到的。该函数接受两个参数:一个(字符串)数组、一个字符串值。该函数用一个for语句来搜索遍历该数组,直到遇到一个与该字符串匹配的成员为止。一旦发现匹配,它就返回相应的索引。如果没有发现匹配,该函数就返回null。 </p>
<p>function&nbsp;findMatchingIndex(aTitles:Array,sTitle:String):Number{ <br />&nbsp;&nbsp;&nbsp;&nbsp;//循环遍历数组中的所有成员。 <br />&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i:Number=0;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果成员之一匹配sTitle的值,就返回相应的索引。这会导致该函数停止执行。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(aTitles[i]==sTitle){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;i; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;//如果没有发现匹配,就会遇到这条语句(仅此而已)。 <br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; <br />} </p>
<p>不管函数做什么,只要它返回一个值,就完全可以将其作为表达式的一部分来调用该函数。例如,可以用下面的方法来使用&ldquo;求面积&rdquo;函数: </p>
<p>var&nbsp;nArea:Number=求面积(6,6);//返值存入变量 <br />也可以： <br />var&nbsp;nArea:Number=求面积(6,3)&nbsp;*&nbsp;5;//函数参与计算 </p>
<p>从本质上说,该函数就变成了一个类似字符串、数字、变量的值。因此,尽管下面的内容是有效的,然而却是不太有用的ActionScript语句:<br />&nbsp;&nbsp;&nbsp;6;<br />下面也一样:<br />&nbsp; &nbsp; 求面积(6,6);<br />我们希望按某些有意义的方法来使用返回的值。可以像使用变量那样来使用一个会返回值的函数。我们已经见过用于赋值语句中的&ldquo;求面积&rdquo;函数了。下面是另外一个例子,在该例子中,函数作为条件表达式的一部分使用: </p>
<p>if(求面积(6,6)&gt;18){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;The&nbsp;area&nbsp;is&nbsp;more&nbsp;than&nbsp;18.&quot;); <br />&nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>注意：函数的返回&ldquo;值&rdquo;不但可以是数值，字串等，也可以是对象，如数组、Object等。 </p>
<p><strong>六、引用函数<br /></strong>可以用函数的名字来引用一个函数。当将函数名与函数调用运算符(圆括号)结合起来使用时,函数就被调用了,但是名字本身只是作为对函数的引用。这就是说,实际上可以使用函数的名字来将一个引用赋予一个变量。例如,一旦将对一个函数的引用赋予给一个变量,就可以将那个变量名与函数调用运算符结合起来调用那个函数。下面是一个例子: </p>
<p>function&nbsp;求面积(nA:Number,nB:Number):Number{ <br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nArea:Number=nA&nbsp;*&nbsp;nB; <br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nArea; <br />} <br />var&nbsp;fArea:Function=求面积; <br />trece(fArea(6,6));//36 </p>
<p>下面将看到如何将匿名函数赋予变量。<br /><strong>七、创建匿名函数<br /></strong>现在已经知道如何使用标准的、命名的函数语法来定义函数了。除此之外,还有一种使用&ldquo;匿名函数&rdquo;来定义函数的方式,它允许创建一个没有名字的函数。然后,可以将该函数赋予一个变量。下面是匿名函数的语法: </p>
<p>function(参数):返回类型{ <br />&nbsp;&nbsp;&nbsp;&nbsp;函数体 <br />}; </p>
<p>读者可能注意到了,标准的函数声明和匿名函数声明在语法上很相似,仅有两点不同。第一,匿名函数没有函数名。第二,匿名函数后应该跟一个分号,这在标准函数的声明中是不需要的。正如前面所述,这主要是想将匿名函数赋予一个变量。否则,当该函数被定义之后,它就&ldquo;离开了&rdquo;作用域(即变成未定义的了)。下面是将匿名函数赋予一个变量的例子: </p>
<p>var&nbsp;fSayHi:Function=function(sName:String):Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;Hi,&quot;+sName); <br />); <br />fSayHi(&quot;Joey&quot;);//显示:Hi,Joey </p>
<p>就像所看到的那样,可以使用被赋予该匿名函数的变量来调用该匿名函数。实际上，匿名函数大家经常都在用，回想一下，按钮事件函数的写法，如： </p>
<p>btn.onPress=funceton(){ <br />&nbsp;&nbsp;&nbsp;&#8230;&#8230; <br />} </p>
<p><a href="http://space.flash8.net/bbs/misc.php?action=viewratings&amp;tid=322559&amp;pid=1952527" onclick="pageTracker._trackPageview('/outgoing/space.flash8.net/bbs/misc.php?action=viewratings_amp_tid=322559_amp_pid=1952527&amp;referer=');"></a></p>
<p><strong>八、理解作用域<br /></strong>&ldquo;作用域&rdquo;是在ActionScript中定义的某些标识符的作用范围。有些标识符仅在一个时间轴中被定义,有些标识符在整个影片的范围中被定义,有些标识符仅在一个函数中被定义。在函数中,有两种作用域需要解释一下:变量的作用域、函数的作用域。&ldquo;变量的作用域&rdquo;是变量在一个函数中的作用范围,&ldquo;函数的作用域&rdquo;是一个函数在一个影片中的作用范围。<br />1、变量的作用域<br />当在一个函数中适当地声明一个变量时,该变量就被称为&ldquo;本地变量&rdquo;。本地变量表示当在一个函数中声明一个变量时,它的定义在该函数调用之后就不再保留。这是一种避免与其他变量产生命名冲突的好方法。下面是一个函数的例子,它声明并初始化了一个名为sMessage的本地变量。该本地变量在该函数中被定义。但是,如果想使用trace()在该函数之外来显示该变量的值,结果将是未定义的。 </p>
<p>function&nbsp;testScope():Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sMessage:String=&quot;hello,world!&quot;; <br />} <br />testScope(); <br />trace(sMessage);//显示:undefined </p>
<p>在一个具有许多函数的大程序中,使用本地变量有利于确保减少具有相同名字的变量之间的冲突。尽管总是应该试图为变量取一个惟一的名字,但是在不同的函数中重复使用相同的变量名字还是可能的。如果每个都有相同的作用域,那么一个就会干扰另一个,就会导致不希望的值和结果。另一个使用本地变量的可能原因是用于内存管理。尽管它可能并不是真的很大,但在程序中定义的每个变量都会占用内存。如果不用一个变量做什么事了,但它仍被定义,就会浪费内存。通过使用本地变量,当函数结束之后内存就会被释放。参数被看做本地变量,即其作用域在该函数中,但不在它之外。从下面的例子就可以看出这一点: </p>
<p>function&nbsp;testParameterScope(sMessage:String):Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(sMessage); <br />} <br />testParameterScope(&quot;Hello&quot;);&nbsp;//显示:Hello <br />trace(sMessage);//显示:undefined </p>
<p>与此不同的是,在该函数外面声明的变量(但在定义该函数的相同时间轴中)是可以在该函数中使用的,例如: </p>
<p>function&nbsp;testScopeTimeline():Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(sMessage); <br />} <br />Var&nbsp;sMessage:String=&quot;Hello&quot;; <br />testScopeTimeline();//显示:Hello </p>
<p>在该例子中,变量sMessage是在该函数之外声明的,但仍可以在该函数之中使用。<br /><strong>九、函数的作用域<br /></strong>正如现在所知,当声明一个函数时,其作用域被限制在声明它的时间轴中。这就是说,可以通过它的名字在相同的时间轴中调用它;如果使用一个目标路径,那么就可以在那个时间轴之外调用它。在相同的时间轴中使用该函数,是非常容易的。在另一个时间轴中使用该函数,就有些不方便了。在一个没有时间轴的对象中使用该函数,就变得颇具挑战性了。试一试吧！<br /><strong>十、创建递归<br /></strong>&ldquo;递归&rdquo;是指一个函数在其函数体中调用它自己。在某些情况下,这是一种必需的方法。递归的经典例子是计算一个数的阶乘。作为复习,数n的阶乘是指如下公式:<br /><em>n*(n-1)*(n-2) &hellip; *1</em>&nbsp;&nbsp; 例如,5的阶乘是120(即5*4*3*2*1)。下面就是一个完成这一工作的函数: </p>
<p>function&nbsp;factorial(n:Number):Number{ <br />&nbsp;&nbsp;&nbsp;&nbsp;if(n&gt;O){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n*factorial(n-1); <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;else{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1; <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />} </p>
<p>递归是一个相当简单的概念,但对于还没有写过大量代码的人来说它又是一个头痛的概念。因此,有些时候它可能有些模糊。为了搞清该例子中的递归的工作原理,我们来看看当调用该函数时会发生什么。这次,我们使用一个小数字来使其简单些:trace(factorial(3));当第一次调用factorial()函数时,是用3这个值进行调用的。因为n大于0,所以它执行if语句中的语句。该语句指示函数返回表达式n*factorial(n-1)的值。为了计算该表达式,该函数必须调用它自己(factorial(n-1))。这一次,当调用factorial()时,是用2这个值进行调用的。同样,n的值大干0,所以执行第一个rettIrn语句。该函数再一次调用它自己。这一次,是用1这个值进行调用的。重复相同的处理,再一次用O这个值调用factorial()。然而,在这次函数调用时,因为n不再大于0了,所以返回1并且不再调用该函数了。应该非常小心,以确保递归函数在递归的次数上有一个限制。设想一下,如果这个例子的函数被写成下面这样,将会发生什么: </p>
<p>function&nbsp;factorial(n:Number):Number{ <br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n*factorial(n-1); <br />} </p>
<p>该函数将永远地调用它自己。这个无限循环往往会导致系统崩溃。幸运的是,Flash对此有一个保护措施,即在一个设定的递归次数之后,会在影片中禁止ActionScript。如果在影片中使用了这种无限递归(即没有一个条件能使该递归停止)的函数,当测试影片时就会在Output窗口中看到警告信息。 </p>
<p><strong>十一、重载函数<br /></strong>重载函数是指,使多个函数具有相同的名字但具有不同数量和／或类型的参数。在许多情况下这可能是有用的。例如,可能有一个名为caIculateArea()的函数,它基于两个参数(各个边的长度)来计算矩形的面积。但可能还希望有一个calculateArea()函数,它基于一个单独的参数(半径)来计算圆的面积。问题是,正如已经提到过的那样,ActionScript并不要求函数定义中的参数数量与传递给它的参数的数量一致。这就是说,不能有两个具有相同名字的函数,即便它们有不同数量的参数。因此,不能真的用ActionScript来重载函数。相反,可以在函数中使用if语句或switch语句来检查参数的数量而模仿函数的重载。下面是一个例子,它说明可以如何写一个函数,使其根据传递给它的参数的数量(由arguments.length决定)计算矩形的面积或者圆的面积。这并不是一个严格意义上的重载函数,而是ActionScript的等价物。 </p>
<p>function&nbsp;calculateArea():Number{ <br />&nbsp;&nbsp;&nbsp;&nbsp;switch(arguments.length){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nRadius:Number=arguments[O]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(Math.PI*(nRadius*nRadius)); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nA:Number=arguments[O]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;nB:Number=arguments[1]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(nA*nB); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />} </p>
<p><strong>十二、为可重用而编写函数<br /></strong>当写一个函数时,要记住易用的或可重用的代码的重要性。理想的情况是使函数尽可能地通用和尽可能地包装好。函数一般应该像一个黑箱一样进行操作。这就是说,函数的活动性从本质上讲应该是不依赖于程序的其他部分的。一个写得很好的函数应该可以被用到许多不同的程序中,就像一把万能钥匙可以开不同的锁一样。应该用可重用性的观念来写函数。当写通用函数时,要记住如下几点:<br />◆通常,不要使用在函数外面定义的变量&mdash;&mdash;在函数中使用的变量(和对象)应该是在函数中声明的或作为参数传递给函数的。如果需要将一个值赋予一个将在函数的作用域之外使用的变量,则考虑使用一个return语句来代替。因为一个函数一次仅能返回一个值,所以可能会发现用一个return语句似乎有点局限。如果在函数中的确是这样的话,那么也许就会发生下面两件事之一:要么想返回的值是相关的值,那么可以将它们放入一个数组或一个对象中,然后返回它们;要么它们是不相关的值,那么就应该将函数拆散成多个函数。但也可能有例外。某些时候,只想用一个函数将一个影片中的某些功能组织到一起,以便将代码组织成子程序。在这种情况下,直接访问在该函数外面声明的变量和对象还是可以接受的。<br />◆给函数取一个能描述其任务的名字&mdash;&mdash;当再次看到函数时,就可以很容易地知道该函数是干什么的了。如果因为函数要做许多事情而不好给它取名,请考虑将那个函数拆散成多个函数。即便是通用函数,它们也应该执行特定的任务。虽然这些指导方针通常是有用的,但有的时候它完全不适合写一个真正通用的函数。如果写一个函数的任务对正在写的程序来说非常特殊,那么将它写得太通用了也许并没什么用。<br /><strong>十三、使用内置函数<br /></strong>前面已经学过如何在ActionScript中创建一个自定义函数了。通常,当人们谈到函数时所指的就是这些自定义函数。但是,在ActionScript中还有许多其他&ldquo;内置函数&rdquo;,基本上可以像使用自定义函数那样来使用它们。Actions工具箱中包含一个名为Global Functions的文件夹,在这个文件夹中是包含所有内置函数的子文件夹。这些函数中的许多已经被类和方法代替了,因此最好使用这些新的替代品。例如,所有的时间轴控制、影片剪辑控制和打印函数都已经被方法代替了。但仍有某些全局的内置函数是有用的。这些函数包括:<br />◆fscommand()_一仅在非常特殊的情况下才使用这个函数。fscommand()函数能使Flash影片与播放器进行通信。<br />◆setInterval()/clearInterval()&mdash;&mdash;这些函数能够指示Flash按特定的、固定的间隔去调用其他函数。请参见下面的&ldquo;创建间隔函数&rdquo;中的详细内容。<br />◆escape()/unescape()&mdash;&mdash;这些函数被用于在文本和安全URL格式之间进行转换。<br />◆getTimer()&mdash;&mdash;getTimer()函数返回自从Flash影片开始播放以来的毫秒数。这在某些定时处理(不要求很高的准确性和精确性)中可能有用。例如,想在影片&ldquo;时间到了&rdquo;之后做某些循环,在这些情况下,getTimer()就是一个合适的函数。例如,可能有一个等待来自服务器的响应的影片,但是,如果30秒钟之后还没有得到响应,可能就想停止等待并提醒用户服务器没有响应。<br />◆trace()&mdash;&mdash;trace()函数在本书中到处可见。在测试Flash应用程序显示信息时,它非常有用。<br />◆isFinite()/isNaN()&mdash;&mdash;这些函数测试一个值是否是有限的,甚至是否是一个有效的数字。<br />◆parseFloat()/parselnt()&mdash;&mdash;这些函数从一个字符串中解析一个数字。 </p>
<p><strong>十四、创建间隔函数</strong><br />可以用函数来做的一件非常有用的事情就是:利用setInterval()命令创建间隔函数。通过使用setInterval()函数,可以指定一个函数和一个连续调用该函数的时间间隔(以毫秒为单位)。该函数返回一个ID(标识),该ID可以被用于稍后停止该间隔。下面是setInterval()函数与一个函数一起使用时的标准语法: </p>
<p>setInterval(function,interval[,param1&hellip;,paramN]) </p>
<p>setInterval()函数的第1个参数应该是一个函数的引用。这就是说,不应该包含函数调用运算符,即不能有括号。interval参数以毫秒为单位。如果给interval参数传递1000,则该函数将大约每秒钟被调用1次。但是要知道,函数被调用的间隔并不精确。Flash尽可能地按间隔来调用函数。但是,运行播放器的计算机的处理器与间隔应该多么精确之间是有冲突的。通过使用setInterval()动作,可以随意地给函数传递参数。紧接在头两个参数(必需的)之后传递给setInterval()的任何参数,都将接着传递给函数。例如,下面的例子显示了一个使用两个参数的writeMessage()函数。通过使用setInterval()可以告诉Flash,每隔1000毫秒就调用该函数,并将两个值传递给该函数: </p>
<p>function&nbsp;writeMessage(sName:String,sMessage:String):Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;Hello,&quot;+sName+&quot;.&quot;+sMessage); <br />} <br />var&nbsp;nwriteInterval:Number=setInterval(writeMessage,1000,&quot;Joey&quot;,&quot;Good&nbsp;morning.&quot;), </p>
<p>Flash开发者在使用setInterval()时,常犯的一个错误是:认为会在每次调用函数时计算通过setInterval()传递给该函数的变量。例如,上面的代码可能被重新写成: </p>
<p>function&nbsp;writeMessage(sName:String,sMessage:String):Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(&quot;Hello,&nbsp;&quot;+sName+&quot;.&quot;+sMessage); <br />} <br />var&nbsp;sNameParam:String=&quot;Joey&quot;; <br />var&nbsp;sMessageParam:String=&quot;Good&nbsp;morning.&quot;; <br />var&nbsp;nWriteInterval:Number=setInterval(writeMessage,1000,sNameParam,&nbsp;SMeSsageParam); </p>
<p>用户可能认为:改变sNameParam或sMessageParam的值将导致在Output窗口中显示不同的值。但是,在每次调用wrlteMessage()函数时,并没有计算变量sNameParam和sMessageParam的值。相反,当调用setlrlterval()时,才计算它们一次。然后,那些值就被用于每次调用该函数。因此,尽管改变了这些变量的值,但传递给该函数的仍是相同的值。下面,让我们看一个例子,可以用它来检查Flash调用间隔函数的精确性。可以将该代码放置在一个新的Flash文档的主时间轴的第1帧中。 </p>
<p>function&nbsp;traceTimer():Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;trace(getTimer()), <br />} <br />var&nbsp;nTimerInterval:Number=setInterval(traceTimer,200); </p>
<p>当进行测试时就会看到,该函数有规律地，按大约200毫秒的间隔被调用。但间隔是不精确的。如果用setInterval()来影响舞台中的动画的话,帧速率也可能对如何使用setInterval()产生影响。影片刷新舞台的速率只在视觉上等于该影片的帧速率。这就是说,如果在该影片中某些处理发生的速率高于帧速率,它就不会对舞台中的显示有影响。因此,假如用setInterval()来将一个MovieCllp实例移动越过舞台,并且帧速率被设置成1fps(每秒的帧数)时,然而该函数被调用的间隔却是10毫秒,那么在舞台上的移动就可能起波浪。正如下面的代码所示,通过在正被setInterval()调用的该函数中使用updateAfterEvent()动作,可以对此进行修补。updateAfterEvernt()动作指示Flash刷新显示器而不管帧速率。 </p>
<p>function&nbsp;moveRight(mA:MovieClip):Void{ <br />&nbsp;&nbsp;&nbsp;&nbsp;mA._x++; <br />&nbsp;&nbsp;&nbsp;&nbsp;updateAfterEvent(); <br />} <br />Var&nbsp;nMoveRInterVal=setInterval(moveRight,10,&nbsp;mCircle); </p>
<p>还可以在setInterval()中定义一个匿名函数,这就不需要传递函数的名字或对函数的引用了。<br />var nTimerInterval:Number=setInterval(function(){trace(getTimer());},200);<br />现在,知道如何为一个要被调用的函数设置一个间隔了,读者或许还想知道如何使一个正在被不停调用的函数停下来。换句话说,就是想知道如何清除间隔。通过调用clearInterval()函数就能非常简单地做到这一点,clearInterval()函数使用一个单独的参数,即表示应该被清除的间隔的ID。请记住,setInterval()会返回一个可以被用于指示该间隔的ID。下面的代码停止一个间隔,该间隔的ID已经被赋予 nTlmerInterval 了: </p>
<p>clearInterval(nTlmerInterval); </p>
<p><strong>十五、小结</strong><br />◆函数是一种将代码块组织到一起的方法,可以通过名字或引用来调用它们,从而一遍又一遍地使用它们。<br />◆函数可以作为子程序,即它们可以执行某些运算并返回一个值。<br />◆函数可以被命名,也可以匿名。这两种类型都有不同的优点和缺点。<br />◆通过使用为函数创建的arguments对象,可以调用一个调用函数,递归地调用一个匿名函数, 并且按数组而不是按单独的各个变量来使用传递给函数的各个参数。<br />◆定义可以在许多不同环境中使用的通用函数是值得的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2007/12/19/as2-depth-understanding-of-function/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>as2 基础教程（1）</title>
		<link>http://www.glglife.com/2007/12/19/as2-essentials-1/</link>
		<comments>http://www.glglife.com/2007/12/19/as2-essentials-1/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 08:39:30 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[AS入门]]></category>
		<category><![CDATA[AS理念]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2007/12/19/as2-%e5%9f%ba%e7%a1%80%e6%95%99%e7%a8%8b%ef%bc%881%ef%bc%89/</guid>
		<description><![CDATA[<a href="http://www.glglife.com/2007/12/19/as2-essentials-1/"><img align="right" hspace="5" width="50" src="http://www.ultrashock.com/tutorials/flashmx2004/images-as2/output_script_1.gif" class="alignright wp-post-image tfe" alt="" title="点击这里用新窗口浏览图片" /></a>看到这篇文章，我想很多人回问我为什么在AS3大潮的时代，&#160;发一片过时已久的AS2教程，而且还是基础教程...]]></description>
			<content:encoded><![CDATA[<div class="postBody">
<p style="line-height: 180%" class="cc-lisence"><font color="#ff0000">看到这篇文章，我想很多人回问我为什么在AS3大潮的时代，&nbsp;发一片过时已久的AS2教程，而且还是基础教程。</font></p>
<p style="line-height: 180%" class="cc-lisence"><font color="#ff0000">这里解释一下。发现身边很多人，说自己熟悉AS2。可是看他们写的东西绝对的是AS1.1，甚至有的还是AS1.0的。有些人根本连AS2和AS1.X的区别都没有搞清楚，甚至一些2.0的理念、接口、类等，和AS1还是有较大区别的。而这些东西，在一个熟悉了AS1.X的人想直接学习AS3，会因为其中的一些东西而感到迷惑，最常见的就是一些往往认为很简单的东西，为什么到了AS3要加一大堆PACK和CLASS，还要指名PUBLIC，还要写出一大堆看似没用的东西。</font></p>
<p style="line-height: 180%" class="cc-lisence"><font color="#ff0000">虽然AS3较AS2来说有很大的差别，说天翻地覆也不为太过，不过，对于没有一点点OOP概念的人来说（特别是认为AS1.X</font><font color="#ff0000">就是AS2的人），下面这篇东西就比较值得一看了。不是为了学习AS2，而是为了能够更好的理解AS3</font></p>
<p style="line-height: 180%" class="cc-lisence">as2 基础教程（1）</p>
<div class="tit">
<table border="0" style="table-layout: fixed">
<tbody>
<tr>
<td>
<div class="cnt">
<p><strong>ActionScript 2.0-简介</strong> </p>
<p>随着FLASHMX2004的推出，Macromedia公司推出了一种新的脚本类型称为as2，在要教程中我们将要了解AS2的新特性。新的面向对象的模型以及如何使AS1的脚本过度到AS2。 </p>
<p>为什么我们需要一种新的脚本语言。 </p>
<p>如果你只是做一些简单的动画是不需要用一种新的脚本语言的，其实有许多项目是不需要脚本语言的。如果你真的不需要使用脚本语言那这个教程将是一个很短的教程，现在你就可以结束了。：） </p>
<p>如果你是一名开发人员，在开发一些比较复杂的项目，那么AS1就显得有些力不从心，或者不能胜任。对于使用主流语言如java,c++,c#开发程序的程序员来说AS1是很怪的。他们是要走一些弯路来学习AS1特别是在面向对象编程时。 </p>
<p>在as2中这些程序员将发现许多熟知的语法，AS2象JAVA。JSCRIPT.NET和javascript 2.0的程序员将感觉更好，因为AS2的语言基础来自于ECMASCRIPT EDITION 4.AS2可以使程序员写出更健状的程序，也可以吸引更多的程序员来学习FLASH。 </p>
<p>好，你可能并不开发程序，那你喜欢开发游戏吗。或者是开发交互式的展示。好消息是AS2为我们开发这些提供了很有力的支持。 </p>
<p>如果你对学习AS2没有兴趣，也不用担心。因为macromedia保留了AS1语法。你只是不能掌握这种语言的新特性而已。实际上在最后的编译过程中AS2和AS1都将被编译为相同的bytescode。这么做的原因大多是为了兼容FLASH6。ok.下面我们将继续学习。 </p>
<p><strong>ActionScript 2.0-AS1.0中的一点点面向对象编程</strong> <br />********************************** <br />在我们转移到AS2之前先让我了解一下在AS1时的面向对象的编程。这一节对于在FLASH5和FLASHMX不太了解面向对编程的人来说很重要。如果你已经很了解这些可以直接跳过此节。 </p>
<p>尽管AS1不是真正的面向对象的编程语言，开发人员已经在有些时候使用它进行面向对象的编程了。AS1中的任何东西都是依靠原型链也就是对象之间的联系。所以在AS1中使用面向对象需要了解原型链（或者是原型的关键字）。 </p>
<p>AS1的类就象是规则的函数。方法附加在这个的类的原型上。例如： </p>
<p>// Wizard class <br />function Wizard() { <br />} <br />// help()方法附加在WIZARD函数的原型上。 <br />Wizard.prototype.help = function() { <br />}; 如果我们把help()直接放在wizard class类中。FLASH在查找属性和方法时就不会找到它，因为FLASH在查找是沿着原型链进行搜索的。而在为所有的Wizard类创建一个实例copy.下面就是为每个实例创建的copy. function Wizard(){&nbsp;&nbsp;&nbsp; this.help=function(){}}对于java,c#的程序员来说。这样的将方法代码放在类中会看来很熟悉，然而为了代码的可重用性我们还是应将方法附加在类的原型链上。 在下面的例子中假如我们针对一个类上有两个方法，一个是附加在原型链上，另一个是直接放在类中，flash将先获得内部方法。// AS1_OOP_01.fla <br />function TestClass() { <br />&nbsp;&nbsp;&nbsp; this.method = function() { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace(&quot;Internal method&quot;); <br />&nbsp;&nbsp;&nbsp; };&nbsp;&nbsp;&nbsp; this.prop = &quot;&gt;&gt;&gt; Internal prop&quot;; <br />}// Attach a method to the prototype object of the class <br />TestClass.prototype.method = function() { <br />&nbsp;&nbsp;&nbsp; trace(&quot;Prototype method&quot;); <br />};TestClass.prototype.prop = &quot;&gt;&gt;&gt; Prototype prop&quot;;// Create an instance of the TestClass class <br />var w = new TestClass();// Internal method is located before the prototype method <br />w.method();// Replace the Internal method <br />w.method = function() { <br />&nbsp;&nbsp;&nbsp; trace(&quot;New method&quot;); <br />}; <br />w.method();// Delete the Internal method <br />delete w.method;// The only method remaining is the prototype method <br />w.method();// Test the properties <br />trace(w.prop);w.prop = &quot;&gt;&gt;&gt; New prop&quot;; <br />trace(w.prop);delete w.prop; <br />trace(w.prop); 上面的例子的输出内容为： <br /><a href="http://www.ultrashock.com/tutorials/flashmx2004/images-as2/output_script_1.gif" class="highslide-image" onclick="pageTracker._trackPageview('/outgoing/www.ultrashock.com/tutorials/flashmx2004/images-as2/output_script_1.gif?referer=');return hs.expand(this);" target="_blank"><img src="http://www.ultrashock.com/tutorials/flashmx2004/images-as2/output_script_1.gif" border="0" alt="" title="点击这里用新窗口浏览图片" width="221" height="195" /></a> </p>
<p>从上面这个例子我们可以看出在使用AS1面向对向对于初学者来说是极易混淆的。其中知道将代码写在什么位是很重要的，因为它可能经常出现意想不到的结果，正如在商业上有一句流行的话是：但是等等，还有更多。。。。 </p>
<p><strong>ActionScript 2.0-AS2.0中的新特性</strong> <br />*************************** </p>
<p>AS2中的新特性 </p>
<p>AS2实际上不是一种新的语言，它是在AS1基础上的升级，如果你基本上掌握了AS1编程，那么学习它应是很容易的。接下来让我们看一下AS2所提供的新东西。 </p>
<p>&nbsp;&nbsp;&nbsp; .严格的数据类型和编译提示。 </p>
<p>&nbsp;&nbsp;&nbsp; .以数据类型为基础的代码提示。 </p>
<p>&nbsp;&nbsp;&nbsp; .针对OOP的新的关键字和特性。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Interface&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extends </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; implements&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dynamic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intrinsic </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set </p>
<p>下面就让我看一下以上这些每一项都有什么新特点。 </p>
<p><strong>严格的数据类型</strong> </p>
<p>在比较专业编程语言中，表达是依靠数据类型的。它给我们的具大的好处是： </p>
<p>它可以帮助编译器发现潜在的问题，获取类型不配的错误信息。它可以使你的代码清晰易读。 </p>
<p>在AS1中声明一个变量如count的过程如下： </p>
<p>var count; </p>
<p>在AS2中声明的过程应是这样。 </p>
<p>var count:Number; </p>
<p>注意，它的语法结构是：&lt;变量&gt;:&lt;数据类型&gt;，这对许多java,c#,c++的程序员来说可能认为有些怪，这实际上是ECMA-262协会制定的规定，macromedia公司是按照这个规定做的而已。 </p>
<p>AS2的变量，函数以及返回值都支持严格的数据类型，如下例函数接收字符串参数返回一个布尔值。 </p>
<p>function func(arg:String):Boolean{}; </p>
<p>当一个函数在没有接收到参数和返回任何值时，使有Void做为数据类型。 </p>
<p>function func(arg:Void):Void{}; </p>
<p>这种参数被写空的形式看起来有些怪，但这种用法却被大量的应用在组件的编写上，它只意味着当前没有指定的参数。然而如果你试着将参数传给这个函数，编译器在编译时是不会出现任何的错误提示同时也会将参数进行传递的。 </p>
<p>尽管AS2支持严格的数据类型，却并没有被真正的执行这种语法，可是当编译器发现有数据类型不配的情况时就会出现错误提示信息，使用严格的数据来进行编程是一个好的开始习惯。它的好处我们在上面已经说过。如果你使用严格的数据类型来编程，那么你在发布时应指定使用AS2，并且指定发布为FLASH PLAYER 7。 </p>
<p>使用严格的数据类型，新的编译器为你提供的了许多新的编译提示阻止你的影片出现类型不配的错误，但在编译过程中可能要花去较长的时间调试。 </p>
<p><strong>代码提示</strong> </p>
<p>在FALSHMX中的代码提示是依据变量名称的扩展如myPushButton_pb,mycomboBox_cb中的_pb,_cb来出现代码提示的，在2004中你会发现大多数的变量扩展不在生效，新版本的AS2以不同的约定型式来出现代码提示。 </p>
<p>当一个变量类型被指定（如果这个变量类型对这个类是有效的）方法和属性的代码提示会在点的后面出现，否则是不会出现任何代码提示的。通过指定的数据类型来显示comboBox的代码提示如： </p>
<p>var combo:mx.controls.comboBox; </p>
<p>combo. </p>
<p><a href="http://www.ultrashock.com/tutorials/flashmx2004/images-as2/codehint.gif" class="highslide-image" onclick="pageTracker._trackPageview('/outgoing/www.ultrashock.com/tutorials/flashmx2004/images-as2/codehint.gif?referer=');return hs.expand(this);" target="_blank"><img src="http://www.ultrashock.com/tutorials/flashmx2004/images-as2/codehint.gif" border="0" alt="" title="点击这里用新窗口浏览图片" width="294" height="254" /></a> </p>
<p>你可以通过打开如下文件查看默认的扩展代码提示如： </p>
<p>\First RunActionsPanelAsCodeHints.xml </p>
<p>小提示：在2004中加入FLASHMX的代码提示 </p>
<p>如果你使用2004来编辑你的FLASHMX文档，你可以将部分的FLASHMX代码提示加入到2004的代码提示中。 </p>
<p>复制\First RunActionsPanelCustomActionsUIComponents.xml,中的 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>这一段到Flash MX 2004&#8217;s UIComponents.xml文件的结束标记之前，同样将这一段复制到2004的AsCodeHints.xml文件的 之间注意多余的标记要删除。 </p>
<p>现在你就可以在2004中使用FLASHMX的组件代码提示了。 </p>
<p><strong>ActionScript 2.0-针对OOP的关键字和特性</strong> <br />************************************ </p>
<p>下面我们将真正研究一下AS2的特性，在早期往往是在讨论AS1复杂的面向对象编程比实际工作更多一些，现在你将很快的看到，你不用花很多时间去争论怎么样做到最好的继承，将代码放置在哪和如何组织好你的代码库。 </p>
<p>让我们先回顾一下OOP基础，OOP的最基本单元是对象，它包含两部分：代码和数据。由于对象是一种以自己自足的形式出现，因此它的数据和代码（方法）不需要公开。就象一个黑盒子，对象负责以自身的方法去管理自身的数据，对象与对象之间通过传递信息通讯。这些信息以公用或公开的方式传递和接收。而内部的数据和方法并没有直接参与其中，这就是OOP的基本原理。 </p>
<p>在OOP的设计中，比做是一张大图，要想到重点和要实现的目标，以及各个部分之间的联系。将这张大图分成小的单元，并且保证各自的自身独立性，那么整个项目就很容易完成。而这些小的单元在OOP中就被称为类。所有这些AS2都提供了很好的支持。 </p>
<p>下面这些关键字与OOP有关： </p>
<p>class interface extends implements <br />public private static dynamic <br />import get set intrinsic </p>
<p>我们不在重复mcromedia的帮助文档中对每一关键字的描述，我们可以用实例来说明。注意关键字intrinsic是mcromedia内部使用的关键字。这里面没package也就包的关键字，但是它与类路径的工作方式是很重要的，就象是其它语言中的包一样，如JAVA。 </p>
<p>下面我们来看一下例子，在AS1中的类，将其改写为AS2的类。 </p>
<p>// 构造函数 <br />_global.Parent = function(name) { <br />&nbsp;&nbsp;&nbsp; this.init.apply(this, arguments); <br />}; <br />// 类的属性 <br />Parent.lastNames = new Array(); <br />Parent.prototype.init = function(name) { <br />&nbsp;&nbsp;&nbsp; this.lName = name; <br />&nbsp;&nbsp;&nbsp; Parent.lastNames.push(name); <br />&nbsp;&nbsp;&nbsp; this.id = Parent.lastNames.length-1; <br />&nbsp;&nbsp;&nbsp; trace(&quot;Added &#8216;&quot;+ Parent.lastNames[this.id] +&quot;&#8217; at: &quot;+ this.id); <br />}; <br />Parent.prototype.getLastName = function() { <br />&nbsp;&nbsp;&nbsp; return (this.lName); <br />}; <br />Parent.prototype.setLastName = function(s) { <br />&nbsp;&nbsp;&nbsp; this.lName = s; <br />&nbsp;&nbsp;&nbsp; Parent.lastNames[this.id] = s; <br />}; <br />Parent.prototype.getNames = function() { <br />&nbsp;&nbsp;&nbsp; return (Parent.lastNames); <br />}; <br />Parent.prototype.addProperty(&quot;lastName&quot;, Parent.prototype.getLastName, Parent.prototype.setLastName); <br />Parent.prototype.addProperty(&quot;names&quot;, Parent.prototype.getNames, null); <br />上面的代码改写为AS2就向下面这样： </p>
<p>新的关键字被应用在如下的例子中：class, private, public, static, get, set </p>
<p>class Parent { <br />&nbsp;&nbsp;&nbsp; private var lName:String = &quot;&quot;; <br />&nbsp;&nbsp;&nbsp; private var id:Number; <br />&nbsp;&nbsp;&nbsp; private static var lastNames:Array = new Array(); <br />&nbsp;&nbsp;&nbsp; // 构造函数 <br />&nbsp;&nbsp;&nbsp; public function Parent(name:String) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init.apply(this, arguments); <br />&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; private function init(name:String):Void { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lName = name; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastNames.push(name); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id = lastNames.length-1; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace(&quot;Added &#8216;&quot;+ lastNames[id] +&quot;&#8217; at: &quot; + id); <br />&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; public function get lastName():String { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return lName; <br />&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; public function set lastName(s:String):Void { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lName = s; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastNames[id] = s; <br />&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; public function get names():Array { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return lastNames; <br />&nbsp;&nbsp;&nbsp; } <br />} <br />通过上面的AS1和AS2执行同一个类。我们可以看出二者非常的相似，主要的不同以AS2为例： </p>
<p>1。以外部文件的形式存在如.as，同时注意类的名称要与外部文件名称相同。 </p>
<p>2。AS2区分大小写，在AS2中object 和 Object是不同的。 </p>
<p>3。类的方法定义在类的内部。 </p>
<p>4。类的内部不在允许有内部类出现。 </p>
<p>5。关键字如public,private,static等写在类方法或属性的前面。 </p>
<p>6。数据类型写在方法或属性名称的后面如：name:string; </p>
<p>7.创建get|set方法更容易使用如下方法：[modifier] function get|set functionName(argument[:type,...])[:type] {} </p>
<p><strong>ActionScript 2.0&#8211;THIS的范围</strong> <br />************************************ </p>
<p>关键词THIS是可以任意使用的一个关键字，您可能也清楚它的使用，但是当一个局部变量和一个类的属性共用一个名称时。如果你要指定类的属性则必须要用this.下面的例子就说明这个问题。 </p>
<p>1。新建一个FLASH文档，选择ActionScript文件，如下： <br /><a href="http://www.ultrashock.com/tutorials/flashmx2004/images-as2/as-file-new.gif" class="highslide-image" onclick="pageTracker._trackPageview('/outgoing/www.ultrashock.com/tutorials/flashmx2004/images-as2/as-file-new.gif?referer=');return hs.expand(this);" target="_blank"><img src="http://www.ultrashock.com/tutorials/flashmx2004/images-as2/as-file-new.gif" border="0" alt="" title="点击这里用新窗口浏览图片" width="500" height="261" /></a> <br />2。将你的文件另存在你在的工作目录中名为scopetest.as.就象我们之前提到过的一样，要将你的类名称和你的文件名保持一致。 </p>
<p>3。输入如下代码： </p>
<p>class ScopeTest { <br />&nbsp;&nbsp;&nbsp;&nbsp; private var myVar:String = &quot;I am the class property!&quot;; <br />&nbsp;&nbsp;&nbsp;&nbsp; public function doTest(Void):Void { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var myVar:String = &quot;I am the local variable!&quot;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace (&quot;myVar = &quot; + myVar); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace (&quot;this.myVar = &quot; + this.myVar); <br />&nbsp;&nbsp;&nbsp;&nbsp; } <br />} <br />4。保存你的文件 <br />5。创建一个新FLASH文档，将其另存为ScopeTest.fla文件，且确保和你的类文件 <br />在同一目录下。 <br />6。在第一帧上输入如下代码： <br />var myTest:ScopeTest = new ScopeTest(); <br />myTest.doTest();7。测试你影片 <br /><a href="http://www.ultrashock.com/tutorials/flashmx2004/images-as2/scope_test.gif" class="highslide-image" onclick="pageTracker._trackPageview('/outgoing/www.ultrashock.com/tutorials/flashmx2004/images-as2/scope_test.gif?referer=');return hs.expand(this);" target="_blank"><img src="http://www.ultrashock.com/tutorials/flashmx2004/images-as2/scope_test.gif" border="0" alt="" title="点击这里用新窗口浏览图片" width="344" height="158" /></a> </p>
<p><strong>ActionScript 2.0&#8211;私有或保护</strong> <br />************************************* </p>
<p>在AS2中需要注意的一件事是私有属性。就象JAVA一样，私有成员意味着只有类自身可以访问。而子类却不可以访问，包括是在同一个类路径或包内。就象其它语言一样私有属性多半是为了起到保护作用。 </p>
<p>由于这种特性只在编译时才会生效，一件非常重要的事情是你必须确保编译器能正确的获得私有的方法和属性。因此注意对你的实例名使用严格的类型指定，如下我们声明一个属性为私有属性： </p>
<p>class PrivateMemberClass{ </p>
<p>&nbsp;&nbsp; private Var privateProp:String=&quot;I am a private property&quot;; </p>
<p>} </p>
<p>这个私有属性名为privatProp.当你的实例名没有用严格的数据类型指定时是可能被实例访问。 </p>
<p>var instance=new PrivateMemberClass(); </p>
<p>trace(instance.privateProp); </p>
<p>此时将会输出&ldquo;I am a private property&quot;. </p>
<p>但是如果你使用的严格的数据类型指定就会出现编译错误。 </p>
<p>如：var instance:PrivateMemberClass=new PrivateMemberClass(); </p>
<p>trace(instance.privateProp); </p>
<p>此时就会出现编译错误。 </p>
<p>这是许多人常有错误，总会问为什么私有属性可以被实例访问，现在你知道了。 </p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<table border="0" style="table-layout: fixed">
<tbody>
<tr>
<td>
<div class="cnt"><strong>ActionScript 2.0&#8211;动态类VS静态类</strong> <br />************************************** </p>
<p>动态类允许动态的对类进行扩展（例如允许加入新的属性或方法）。象Jscript.NET程序中这种方式称为expando，如果类不是动态类（象Math类）用户不能加入新的属性和方法。而在as1中这其实是很平常的事。就象下面这样为MOVIECLIP加入新的属性和方法： </p>
<p>movieClip.protoType.someNewMethed=function(){ </p>
<p>&nbsp;&nbsp;&nbsp; 一些方法； </p>
<p>} </p>
<p>在as2中这种扩展方式是不允许的。然而我可能通过创建子类的方式加入新的属性和方法。 </p>
<p>下面的例子是我们要扩展静态类Math中的Max()方法.我们要新将其扩展为在一些数中求出最大的数而不是原先那样只限定在两个数中求出最大的数。 </p>
<p>dynamic class Math2 extends Math { <br />&nbsp;&nbsp;&nbsp; // store a reference to Math.max() <br />&nbsp;&nbsp;&nbsp; private static var oMax:Function = Math.max;&nbsp;&nbsp;&nbsp; // static class cannot be instantiated <br />&nbsp;&nbsp;&nbsp; private function Math2() {} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // override Math.max(), support any number of arguments <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static function max():Number { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var a:Array = arguments; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var n:Number = a.length; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n &gt; 2) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var m:Number = oMax(a[n-2],a[n-1]); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // remove two elements from the end of the array; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // could use &#8216;a.length -= 2&#8242; as a shortcut as well <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.pop(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.pop(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.push(m); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Number(max.apply(null, a)); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (n == 2) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return oMax(a[0],a[1]); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (n == 1) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a[0]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return oMax(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; } <br />} <br />不象原有的类那样，现在我们已经对其MAX（）方法进行了扩展将其变成了动态类。并且形成了新的类名为math2. </p>
<p>现在可以试一下了。 </p>
<p>trace(Math2.max(70,6,3,12,82,9,28,5)); </p>
<p><strong>ActionScript 2.0&#8211;继承</strong> <br />*************************************** </p>
<p>正如前面提到过的。继承对于OOP编程是很重要的尽管它不是绝对的需要。它用来定义子类与超类之间的关系。AS2为实现这一目的设置了一个新的关键词：extends.在上一例中的Math2中我们已经使用的了extends这一关键字继承Math类。它还是比较简单的。 </p>
<p>在构造函数时首先应注意的是super()关建字。它的作用是调用超类的构造函数，如果你之前没有在超类中构造函数那么FLASH会自动生成一个空的构造函数。 </p>
<p>值得欣慰的是许多BUG在新版的flash player7中已经被修复。但在FLASHPLAY6仍有bug的问题，如果你不太清楚，可能查看AS1中有关继承bug的相关列表文章。 </p>
<p>如果你想要从子类传递参数给你的超类，你应确保在你的超类中已有了这些参数的声明。否则你会发现为什么只有部分的参数被传递。如我们要创建一个子类名为Child，它继承自他的父类。我们应在构造函数中这样写： </p>
<p>class Child extends Parent { <br />&nbsp;&nbsp;&nbsp; private var fName:String = &quot;&quot;; <br />&nbsp;&nbsp;&nbsp; public function Child(lname:String, fname:String) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(lname); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // continue Child&#8217;s constructor code <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fName = fname; <br />&nbsp;&nbsp;&nbsp; } <br />} </p>
<p><strong>ActionScript 2.0&#8211;导入外部的类文件</strong> <br />************************************* </p>
<p>为了更好的组织类和避免类名称的冲突.被许多语言应用的概念包被引入.ActionScript 2.0引入包就是为了解决这个问题. </p>
<p>类名称的冲突是指什么呢?我们假想有两个开发人员,每个人都建立了一个代码库.在库中都有一个名为utility的类.如果这两个代码库合在一起使用,这时就会造成flash的混乱,不知使用哪一个库中的类. </p>
<p>这时类路径及来出来挽救,通过将路径合并到类名称中.就象是硬盘中的文件一样,在不同的目录中可以有相同的文件存在.要指明引用哪一个类.要在导入过程中使用正确的类路径.如: </p>
<p>import mx.events.Eventdesign; <br />一旦类被导入,我们在引用类时就可能只接使用类名称而不需要使用类的路径了. </p>
<p>class MyBroadcaster { <br />&nbsp;&nbsp;&nbsp; public function MyBroadcaster() { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EventDesign.initialize(this); <br />&nbsp;&nbsp;&nbsp; } <br />} </p>
<p>当然,你也可以不用导入的方式,而是在每次使用时都指明类的正确路径.可这样做会使人很烦的.当多次使用时要不断的输入重复的东西. </p>
<p>class MyBroadcaster { <br />&nbsp;&nbsp;&nbsp; public function MyBroadcaster() { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mx.events.EventDesign.initialize(this); <br />&nbsp;&nbsp;&nbsp; } <br />} <br />当在创建自已的类时,将你的类放在一个指定的项目目录中,或是放在一个公共的类库中,而不要将其放在 </p>
<p>\First RunClasses) 或:Documents and Settings\Local SettingsApplication DataMacromediaFlash MX 2004\ConfigurationClasses). </p>
<p>这样做可以使执行同步同时减少编译时错误的出现.一种公用的方法是使用你的反面的域名作为类的路径如 </p>
<p>import com.quantumwave.alliance.rebel.Commander; </p>
<p>如果要导入路径中的所有类.使用通配符*,如下: </p>
<p>import com.quantumwave.* </p>
<p>这一步导入将导入com.quantumwave下的所有的类但在编译时只编译使用到的类,所以你不必担心导入所有的类会增大你文件的大小. </p>
<p><strong>ActionScript 2.0&#8211;接口</strong> <br />************************************ </p>
<p>当在使用OOP时,除了继承比较重要之外,在就是接口了.就像JAVA和C#,ActionScript不提供多重继承(如一个子类可继承多个超类),这是因为如果使用不当在调试时就会象做了一场恶梦一样.会造成死循环和粘连不清的情况,在精心设计你的项目时,使用接口可以同样达到多重继承的效果,而不会出现上面说的那种很麻烦的情况. </p>
<p>一个接口就象是各类在执行方法时的一种协议,而通常在各个类未执行方法时是没有联系的.在接口中没有代码没有属性,只有方法,它的书写方式完全就象是在书写一个类一样,除了: </p>
<p>&nbsp;&nbsp;&nbsp; 1.它们都没有属性 </p>
<p>&nbsp;&nbsp;&nbsp; 2.它们只有方法的标记,参数,类型和返回的类型 </p>
<p>&nbsp;&nbsp;&nbsp; 3.在方法定义的结尾只有小括号而没有大括号 </p>
<p>下面是一个可拖动的类名为Dragable的范例(通常在命名接口时通常以大写的&quot;I&quot;开头). </p>
<p>interface IDraggable { </p>
<p>public function startDrag():Void; </p>
<p>public function stopDrag():Void; </p>
<p>public function isDragging():Boolean; </p>
<p>} </p>
<p>如果要使用Interface需要使用关键字implement.如下面的例子,child类继承超类同时使用接口IDraggable. </p>
<p>class Child extends Parent implements IDraggable { </p>
<p>public function Child() { </p>
<p>// add Child constructor code </p>
<p>} </p>
<p>public function startDrag():Void { </p>
<p>// implement the code for startDrag(); </p>
<p>} </p>
<p>public function stopDrag():Void { </p>
<p>// implement the code for stopDrag(); </p>
<p>} </p>
<p>public function isDragging():Boolean { </p>
<p>// implement the code for isDragging(); </p>
<p>} </p>
<p>} </p>
<p>唯一在使用接口时注意的事情是,在类中应使用与接口中一样的方法,参数类型的定义,通过这种方式接口可以在两个不一样的程序员之间标准化代码,当一个已知的接口被类使用时,和序员只需知道接口以在不同的类中使用. </p></div>
</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2007/12/19/as2-essentials-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自定义ActionScript中的trim函数，取回车函数，字节换算函数</title>
		<link>http://www.glglife.com/2007/07/05/actionscript-custom-trim-function-in-the-back-car-function-byte-conversion-function/</link>
		<comments>http://www.glglife.com/2007/07/05/actionscript-custom-trim-function-in-the-back-car-function-byte-conversion-function/#comments</comments>
		<pubDate>Wed, 04 Jul 2007 16:44:57 +0000</pubDate>
		<dc:creator>柳世杀神·GabrielGon</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[FLASH]]></category>
		<category><![CDATA[TRIM]]></category>
		<category><![CDATA[自定义函数]]></category>

		<guid isPermaLink="false">http://www.glglife.com/2007/07/05/%e8%87%aa%e5%ae%9a%e4%b9%89actionscript%e4%b8%ad%e7%9a%84trim%e5%87%bd%e6%95%b0%ef%bc%8c%e5%8f%96%e5%9b%9e%e8%bd%a6%e5%87%bd%e6%95%b0%ef%bc%8c%e5%ad%97%e8%8a%82%e6%8d%a2%e7%ae%97%e5%87%bd%e6%95%b0/</guid>
		<description><![CDATA[<a href="http://www.glglife.com/2007/07/05/actionscript-custom-trim-function-in-the-back-car-function-byte-conversion-function/"><img align="right" hspace="5" width="50" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" class="alignright wp-post-image tfe" alt="" title="" /></a>我们知道vbs中有个trim的函数，用来取掉一个字符串两头的空格，as中没有，我们可以自定义一个：//取掉字符串...]]></description>
			<content:encoded><![CDATA[<div class="postTitle">我们知道vbs中有个trim的函数，用来取掉一个字符串两头的空格，as中没有，我们可以自定义一个：</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" width="11" height="16" align="top" /><span style="color: #008000">//</span><span style="color: #008000">取掉字符串的前后空格</span><span style="color: #008000"><br /><img id="Codehighlighter1_56_301_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_56_301_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" alt="" width="11" height="16" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;trim(returnString)&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img id="Codehighlighter1_140_144_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_140_144_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;returnString.charCodeAt(</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0&#215;20</span><span style="color: #000000">;&nbsp;returnString</span><span style="color: #000000">=</span><span style="color: #000000">returnString.substr(</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_271_275_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_271_275_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;returnString.charCodeAt(returnString.length</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0&#215;20</span><span style="color: #000000">;&nbsp;returnString</span><span style="color: #000000">=</span><span style="color: #000000">returnString.substr(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;returnString.length</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;returnString;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" width="11" height="16" align="top" /><span style="color: #008000">//</span><span style="color: #008000">取掉字符串的前后回车</span><span style="color: #008000"><br /><img id="Codehighlighter1_61_342_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_61_342_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" alt="" width="11" height="16" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;trimEnter(returnString)&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img id="Codehighlighter1_163_167_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_163_167_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;returnString.substr(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;String.fromCharCode(</span><span style="color: #000000">13</span><span style="color: #000000">);&nbsp;returnString</span><span style="color: #000000">=</span><span style="color: #000000">returnString.substr(</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_312_316_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_312_316_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;returnString.substr(returnString.length</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;String.fromCharCode(</span><span style="color: #000000">13</span><span style="color: #000000">);&nbsp;returnString</span><span style="color: #000000">=</span><span style="color: #000000">returnString.substr(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;returnString.length</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;returnString;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>这个也常用：
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" width="11" height="16" align="top" /><span style="color: #008000">//</span><span style="color: #008000">字节换算KB,MB</span><span style="color: #008000"><br /><img id="Codehighlighter1_47_297_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_47_297_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" alt="" width="11" height="16" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;GetSizeType(size:Number)&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img id="Codehighlighter1_66_108_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_66_108_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(size</span><span style="color: #000000">&lt;</span><span style="color: #000000">1024</span><span style="color: #000000">)&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">(size</span><span style="color: #000000">*</span><span style="color: #000000">100</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">100</span><span style="color: #000000">+</span><span style="color: #000000">&quot;</span><span style="color: #000000">&nbsp;bytes</span><span style="color: #000000">&quot;</span><span style="color: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_130_175_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_130_175_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(size</span><span style="color: #000000">&lt;</span><span style="color: #000000">1048576</span><span style="color: #000000">)&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">((size</span><span style="color: #000000">/</span><span style="color: #000000">1024</span><span style="color: #000000">)</span><span style="color: #000000">*</span><span style="color: #000000">100</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">100</span><span style="color: #000000">+</span><span style="color: #000000">&quot;</span><span style="color: #000000">KB</span><span style="color: #000000">&quot;</span><span style="color: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_200_248_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" width="11" height="16" align="top" /><img id="Codehighlighter1_200_248_Closed_Image" style="display: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(size</span><span style="color: #000000">&lt;</span><span style="color: #000000">1073741824</span><span style="color: #000000">)&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" width="15" height="20" /></span><span><span style="color: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">((size</span><span style="color: #000000">/</span><span style="color: #000000">1048576</span><span style="color: #000000">)</span><span style="color: #000000">*</span><span style="color: #000000">100</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">100</span><span style="color: #000000">+</span><span style="color: #000000">&quot;</span><span style="color: #000000">MB</span><span style="color: #000000">&quot;</span><span style="color: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">((size</span><span style="color: #000000">/</span><span style="color: #000000">1073741824</span><span style="color: #000000">)</span><span style="color: #000000">*</span><span style="color: #000000">100</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">100</span><span style="color: #000000">+</span><span style="color: #000000">&quot;</span><span style="color: #000000">GB</span><span style="color: #000000">&quot;</span><span style="color: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" width="11" height="16" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.glglife.com/2007/07/05/actionscript-custom-trim-function-in-the-back-car-function-byte-conversion-function/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

