1.跳轉頁面代碼、下載代碼(new URLRequest(下載地址)):php
var request1:URLRequest=new URLRequest("http://www.baidu.com/"); navigateToURL(request1); request1=null;
2.權限html
(1)public :公開權限[類自己+類外部+被繼承]前端
(2)protected:保護權限[類自己+被繼承]ios
(I3)private:私有權限[類自己]程序員
3.web
(1)子類繼承與父類,子類可使用父類的public、protected設置的變量和方法。算法
(2)子類的實例化默認調用父類的構造函數數據庫
(3)子類經過關鍵字override,能夠重寫父類的共有方法。編程
(4)final關鍵字保證不被繼承。json
4.多態性:父類的引用變量能夠指向給他的子類。
5.讀取本地文件代碼(.txt)
import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.Event; var txtLoader:URLLoader=new URLLoader(); var txtRes:URLRequest=new URLRequest("test.txt"); txtLoader.load(txtRes); txtLoader.addEventListener(Event.COMPLETE,completeHandle); function completeHandle(e:Event) { trace(e.target.data); }
讀取xml文件
import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.Event; var txtLoader:URLLoader=new URLLoader(); var txtRes:URLRequest=new URLRequest("xml_demo.xml"); txtLoader.load(txtRes); txtLoader.addEventListener(Event.COMPLETE,completeHandle); function completeHandle(e:Event) { var dataXML:XML= XML(e.target.data); trace("dataXML.page.length()="+dataXML.length()); trace("dataXML.page[2].pic="+dataXML.page[2].pic); trace("dataXML.page[2].txt="+dataXML.page[2].txt); }
6.int 整型(有正數) / uint 整型(正數,通常表示正數)/Number 表示各類數字(整型,float等)
7.判斷數據類型(typeof(aa));
8.弱轉換,恢復之前的類型 ii as int
強轉換 , 強制裝換 Number(ii)
9.函數:參數,傳值,傳值
(1)傳值:當傳入參數爲簡單類型:String,int,number,boolean,Function等,參數會賦值一個值傳入方法體,函數內的運算結果不影響外部的參數值。
(2)傳地:當傳入參數爲複雜類型:對象,數組等等,參數會把內存地址傳入,函數內的運算結果將改變外部的參數值
10. ...rest:表不知道參數個數,聲明一個傳入參數的數組
11.閉包:函數返回函數,返回的函數的運行不影響另外一個調用者的運行
12.冒泡排序
規則:(1)第一個元素依次與剩下的元素比較,即,第一個元素與第二個元素比較以後,若是不符合條件,即交換,若是符合條件,不交換。還是第一個元素與第三個元素比較,若是不符合條件,即交換,若是符合條件,不交換。.......到最後爲止。。
(2)第二個元素依次與剩下的元素比較,即,第二個元素與第三個元素比較以後,若是不符合條件,即交換,若是符合條件,不交換。還是第二個元素與第四個元素比較,若是不符合條件,即交換,若是符合條件,不交換。.......到最後爲止。。
......
package { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; public class Hello extends Sprite { private var t:TextField; public function Hello() { t=new TextField(); t.autoSize=TextFieldAutoSize.LEFT; this.addChild(t); var arr:Array=[9,7,3,18,22,6,55,1,8]; var len:int=arr.length; var temp:int=0; for(var i:int=0;i<len;i++) { for(var j:int=i+1;j<len;j++) { if(arr[i]>arr[j]){ temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } t.text=arr.toString(); } } }
13.選擇排序
規則:(1)第一個次假設第一個位置k爲最小值,經過與後面的循環比較,獲得了最小值的位置。此時若不是第一個位置,則交換。
(2)第二個位置爲最小值k,經過與後面的值比較,獲得了最小值(實際是次小值)。此時若不是第二個位置,則交換。
.....
package { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; public class Hello extends Sprite { private var t:TextField; public function Hello() { t=new TextField(); t.autoSize=TextFieldAutoSize.LEFT; this.addChild(t); var arr:Array=[9,7,3,168,22,6,55,1,8]; var len:int=arr.length; var k:int=0; var temp:int=0; for(var i:int=0;i<len;i++) { k=i; for(var j:int=i+1;j<len;j++) { if(arr[k]>arr[j]){ k=j; } } if(i!=k){ temp=arr[i]; arr[i]=arr[k]; arr[k]=temp; } } t.text=arr.toString(); } } }
14.插值法排序
(1)規則:有兩個數組,第二個數組爲空。初始化第二個數組,把第一個數組中第一個原始賦值給第二個數組。
(2)拿第一個元素中第二個元素與第二個數組進行比較,若是比第一個元素小,則插入第一個元素前面,若是不是,
15.
var a:int=Math.floor(5.9);//向下取整
var b:int=Math.ceil(5.1);//向上取整
var c:int=Math.round(5.3);//四捨五入
16.二分法算法
package { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; public class Hello extends Sprite { private var t:TextField; public function Hello() { t=new TextField(); t.autoSize=TextFieldAutoSize.LEFT; this.addChild(t); var arr:Array=[99.78,66,23,15,8,17,3,45,18,1,19]; var len:int=arr.length; var narr:Array=new Array(); narr[0]=arr[0]; var left:int=0; var right:int=0; var point:int=0; var nlen:int=0; for(var i:int=1;i<len;i++) { left=0; nlen=narr.length; right=nlen; for(var j:int=0;j<nlen;j++){ point=left+Math.floor((right-left)/2); if(narr[point]<arr[i]){ left=point+1; }else{ right=point; } if(left==right){ narr.splice(left,0,arr[i]); break; } } } t.text=narr.toString(); } } }
17.繼承
(1)訪問權限:
子類 同一個包中 不一樣包中
private 不可見 不可見 不可見
protected 可見 不可見 不可見
默認 不可見 可見 不可見
public 可見 可見 可見
(2)重寫:繼承關係的子類中,寫與父類同名的方法,把父類的方法覆蓋掉
(3)重載:在同一類中,同名方法,不一樣參數
(4)AS的繼承是單繼承
(5)接口:只有方法的聲明,沒有方法體的類,只能被別人繼承。聲明的方法不能有訪問權限。
(6)一個類只能繼承另外一個類,但能實現多個接口。
18.數據在內存中的存放共分6個形式:
(1)棧區:編譯器自動分配和釋放,該區通常存放函數的參數值,局部變量等。
(2)堆區:不連續的內存空間,通常由程序員分配釋放,程序員若是不釋放,程序運行完畢時系統釋放。
(3)寄存器區:用來保存棧頂指針和指令指針
(4)全局區(靜態static):存放全局變量和靜態變量,初始化過的放在一塊區域,未初始化的放在另外一區域。程序結束後由系統釋放。
(5)文字常量區:存放常量字符串,程序結束後由系統釋放
(6)程序代碼區:存放函數體的二進制代碼
19.靜態成員變量、靜態成員方法,靜態的都是不可繼承的。
20.單例模式:
單例模式代碼:
package duixiang { public class Bag { public var cloth:String; public var weapon:String; private static var thisa:Bag;//聲明一個靜態的本類的成員變量 public function Bag() { } public static function getSingleTon():Bag{ if(thisa==null){ thisa=new Bag(); } return thisa; } } }
單例模式代碼運用
package { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; import duixiang.Bag; public class Three extends Sprite { private var t:TextField public function Three() { t=new TextField(); t.autoSize=TextFieldAutoSize.LEFT; this.addChild(t); var bag:Bag=Bag.getSingleTon(); bag.cloth="盔甲 "; var bag2:Bag=Bag.getSingleTon(); bag.weapon="寶劍"; var bag3:Bag=Bag.getSingleTon(); t.text="個人服裝:"+bag3.cloth+" 個人武器: "+bag3.weapon; } } }
21.門面Facade模式:把多個功能組織在一塊兒,完成特定的功能模塊。
Facade代碼
package duixiang { public class Facade { private var donghua:Donghua; private var shuzhi:ShuZhi; private var connBean:ConnBean; public function Facade() { donghua=new Donghua(); shuzhi=new ShuZhi(); connBean=new ConnBean(); } public function attack(weapon:Weapon):String{ donghua.attack(weapon); shuzhi.jisuan(weapon); connBean.send(weapon); return "發起進攻"; } } }
運用Facade代碼
package duixiang { public class Hero extends ChongWu { private var attackWeapon:Weapon; private var facade:Facade; public function Hero() { facade=new Facade(); } public function jingong(weapon:Weapon):String{ facade.attack(weapon);//門面模式 //調用寵物繼續攻擊 //登錄功能等等 return "發起攻擊"; } } }
22.適配器模式
適配器模式代碼
package duixiang.shipeiqi { public class Adapter implements Roles { public function Adapter() { } public function inquire():String{ return null; } public function kill():String{ return null; }; public function say():String{ return null; }; public function judge():String{ return null; }; } }
接口
package duixiang.shipeiqi { public interface Roles { function kill():String; function say():String; function judge():String; function inquire():String; } }
Policeman代碼
package duixiang.shipeiqi { public class Policeman extends Adapter { public function Policeman() { } override public function inquire():String{ return "問話"; } } }
Assassin代碼
package duixiang.shipeiqi { public class Assassin extends Adapter { public function Assassin() { } override public function kill():String{ return "刺殺"; } } }
Justicer
package duixiang.shipeiqi { public class Justicer extends Adapter { public function Justicer() { } override public function judge():String{ return "判斷"; } } }
Villager
package duixiang.shipeiqi { public class Villager extends Adapter { public function Villager() { } override public function say():String{ return "說話"; } } }
23.觀察者(observer)模式:消息的生產者->消息->全部消息的訂閱者
24.裝飾(Decorator)模式:無此功能->經過注入->使其擁有此項功能
25.TextFormat對象
var f:TextFormat=new TextFormat();
f.align= //left,center,right,justify(自動兩端對齊)
f.blockIndent //指示文本塊縮進像素數
f.bold //是否爲粗體
f.bullet //指示文本是否添加項目符號
f.indent //文本第一行縮進像素數
f.italic //是否爲斜體
f.kerning //是否直接調整整字距
f.leading //行間距
f.leftMargin //左側留白
f.letterSpacing //字間距
f.size //字號
f.tabStops//tab鍵的停靠位置
target //超文本連接目標
underline //下劃線
t.defaultTextFormat=f;
26.顯示對象容器中全都默認一支矢量筆:Graphics
Shape類:形狀繪製容器,不能容納其餘的顯示對象,不支持鼠標單擊事件、比其餘顯示對象消耗內存小。
27.數學表達式
(1)常量:Math.PI
(2)處理函數
(I)Math.abs(val);//絕對值
(II)Math.ceil(val);//向上取整
(III)Math.exp(val);//計算天然對數的底(e)的val次冪的值
(IV)Math.floor(val);//向下取整
(V)Math.log(val);//獲取參數val的天然對數的值
(VI)Math.max(...args);//比較n個數的最大
(VII)Math.min(...args);//比較n個數的最小
(VIII)Math.pow(x,y);//計算參數1的參數y次方,返回計算結果
(IX)Math.random();隨機
(X)Math.floor(最小值+Math.random()*(最大值-最小值+1));//不加1表示不包含最大值
(XI)Math.round(val);//四合五入
(XII)Math.sqrt(val);//開平方
(3)三角函數
角====-Math.PI/2~ Math.PI/2之間的弧度值
(I)Math.sin(角)
(II)Math.cos(角)
(III)Math.tan(角)
(IV)Math.atan(角)//反正切
(V)Math.atan2(dy,dx);//Math.atan2的兩個參數x,y爲數字,能夠表示舞臺上的座標...
angle=Math.atan2(dy,dx);//獲得角度
(VI)角度轉弧度:angle*Math.PI/180;
(VII)弧度轉角度:angle*1880/Math.PI
(VIII)計算兩點間距離
var dx:Number=x2-x1;
var dy:Number=y2-y1;
var d:Number=Math.sqrt(dx*dx+dy+dy)//求距離
28.(1)containsRect():返回一個布爾值,判斷參數矩形是否包含在目標矩形內。若是徹底包含,返回true,不然返回false。
(2)intersects():返回一個布爾值,判斷參數矩形是否與目標矩形相交。若是相交返回true,不然返回false。
(3)intersection():若是兩個矩形相交,則返回相交部分的矩形。若是沒有相交,則返回一個空的矩形。
(4)union():返回兩個矩形的最大矩形空間。
29.靜態函數和靜態函數
(1)所謂靜態:就是指程序一開始就建立好了,不須要實例化便可使用,且靜態的變量或者函數時全局可用的。
(2)對於靜態變量,因爲其是全局可用的,因此你的任何一次更改都會永久保存在該變量中。
(3)對於靜態函數,在函數中不可訪問非靜態變量。
package game { public class Board { private var comeOn:int=1; private static var baBy:int=1; public static var Pig:String="s_event is not a pig"; public static function ohMyGod():String{ comeOn++;//報錯,不可訪問非靜態變量 baBy++;//無措,由於是靜態變量 return "oh,my mother god~"; } public static function ohMyGod1():void{ baBy++;// } //onMyGod()與onMyGod1()函數都執行一次,此時baBy爲3 } }
package { import flash.display.Sprite; import game.Board; public class Kungfu extends Sprite//啓動項,至關於Main函數 { public function Kungfu() { var shit1:String=Board.Pig;//直接用類名加點操做符便可調用到變量與函數 var shit2:String=Board.ohMyGod(); var stc:Board=new Board(); var shit3:String=stc.Pig;//經過實例化Board來拿到靜態變量與函數則報錯。 var shit4:String=stc.ohMyGod(); } } }
30.關於本地的JSON的解析
public function Bag11() { var req:URLRequest=new URLRequest("assets/gameList.json");//這裏是你要獲取JSON的路徑 req.method=URLRequestMethod.POST; var ldr:URLLoader=new URLLoader(req); ldr.load(req); ldr.addEventListener(Event.COMPLETE, decodeJSONHandler); } private function decodeJSONHandler(eve:Event):void { var jsonArray:* = JSON.parse( eve.target .data ); trace("進"+ jsonArray.info[1].name); }
JSON:
{"info":[{"id":"1","top":"2","name":"像素騎士團H5","show":"像素騎士團H5","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_1.png","link":"http://s1.xs.17515.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"2","top":"1","name":"寶石與爬塔","show":"一款放置爬塔的遊戲,輕鬆容易。","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_2.png","link":"http://112.74.65.219/pt_qy_c/index.html","img":"http://h5.17515.cn/img/img_2.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"3","top":"3","name":"勇者之塔","show":"放置、掛機、爬塔,輕鬆玩遊戲!","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_3.png","link":"http://112.74.65.219/pt_qy_c/index.html","img":"http://h5.17515.cn/img/img_3.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"4","top":"0","name":"測試遊戲2","show":"測試內容","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"5","top":"0","name":"測試遊戲3","show":"測試內容","cool":"3","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"6","top":"0","name":"測試遊戲4","show":"測試內容","cool":"0","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"7","top":"0","name":"測試遊戲5","show":"測試內容","cool":"3","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"8","top":"0","name":"測試遊戲6","show":"測試內容","cool":"3","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"9","top":"0","name":"測試遊戲7","show":"測試內容","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"10","top":"0","name":"測試遊戲8","show":"測試內容","cool":"3","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"11","top":"0","name":"測試遊戲9","show":"測試內容","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"12","top":"0","name":"測試遊戲10","show":"測試內容","cool":"3","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"13","top":"0","name":"測試遊戲11","show":"測試內容","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"}]}
{"info":[{"id":"1","top":"2","name":"像素騎士團H5","show":"像素騎士團H5","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_1.png","link":"http://s1.xs.17515.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"2","top":"1","name":"寶石與爬塔","show":"一款放置爬塔的遊戲,輕鬆容易。","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_2.png","link":"http://112.74.65.219/pt_qy_c/index.html","img":"http://h5.17515.cn/img/img_2.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"3","top":"3","name":"勇者之塔","show":"放置、掛機、爬塔,輕鬆玩遊戲!","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_3.png","link":"http://112.74.65.219/pt_qy_c/index.html","img":"http://h5.17515.cn/img/img_3.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"4","top":"0","name":"測試遊戲2","show":"測試內容","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"5","top":"0","name":"測試遊戲3","show":"測試內容","cool":"3","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"6","top":"0","name":"測試遊戲4","show":"測試內容","cool":"0","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"7","top":"0","name":"測試遊戲5","show":"測試內容","cool":"3","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"8","top":"0","name":"測試遊戲6","show":"測試內容","cool":"3","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"9","top":"0","name":"測試遊戲7","show":"測試內容","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"10","top":"0","name":"測試遊戲8","show":"測試內容","cool":"3","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"11","top":"0","name":"測試遊戲9","show":"測試內容","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"12","top":"0","name":"測試遊戲10","show":"測試內容","cool":"3","down":"2","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"},{"id":"13","top":"0","name":"測試遊戲11","show":"測試內容","cool":"0","down":"1","icon":"http://h5.17515.cn/icon/icon_4.png","link":"http://h5.17517.cn","img":"http://h5.17515.cn/img/img_1.png","s_uid":"openid","s_sid":"server","s_snid":"1"}]}
31.點擊一個Label跳轉到網頁:
this.Label01.htmlText="<a href='http://www.163.com'><font size='30'color='#ff0000'>4444</font></a>";
label內容:4444,字體:30 紅色 跳轉頁面:http://163.com
32.字符串
var aa:String=new String("how are you"); trace(aa.length);//字符長度 trace(aa.charAt(1));//第幾位是什麼字符 trace(aa.indexOf("are",0));//在字符中檢索其餘字符 trace(aa.replace(" ","_"));//替換字符 trace(aa.substr(0,4));//取幾個字符 trace(aa.toUpperCase());//大寫 trace(aa.toLowerCase());//小寫
33.文本
var tx:TextField=new TextField(); tx.text="rrr"; tx.border=true;//顯示邊框 tx.borderColor=0xfff000;//邊框顏色 tx.multiline=false;//不是多行 tx.height=50; tx.type=TextFieldType.INPUT;//能夠設置爲輸入類型 tx.displayAsPassword=true;//密碼類型 tx.x=stage.width/2; tx.y=stage.height/2;//位置爲中心 tx.htmlText="<a href='http://www.163.com'>ddd</a>";//鏈接 stage.addChild(tx);
package td { import flash.display.MovieClip; import flash.events.Event; import flash.events.TextEvent; import flash.net.URLLoader; import flash.net.URLRequest; import flash.text.TextField; import flash.text.TextFieldType; import flash.text.TextFormat; import flash.text.TextFormatAlign; public class lesson17 extends MovieClip { public function lesson17() { init(); } function init(){ var tx:TextField=new TextField(); var tf:TextFormat=new TextFormat(); tf.align=TextFormatAlign.CENTER; tf.bold=true; tf.color=0xffffff; tf.leading=10; tf.leftMargin=10; tf.rightMargin=10; tx.defaultTextFormat=tf; tx.border=true; tx.borderColor=0xfff000; tx.width=300; tx.multiline=true; tx.wordWrap=true; stage.addChild(tx); tx.textColor=0xff00ff; tx.background=true; tx.backgroundColor=0x0000ff; // tx.text="dafdsfdfffffffffff" // +"dafdfdfdfdfddsfd" // +"dafddfdsfdsfdsfsfd\n" // +"dafddfdsfdsfdsfsfd" // +"dafddfdsfdsfdsfsfd" // +"dafddfdsfdsfdsfsfd" // +"dafddfdsfdsfdsfsfd" // +"dafddfdsfdsfdsfsfd" // +"dafddfdsfdsfdsfsfd"sasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasasa // +"dafddfdsfdsfdsfsfd" // +"dafddfdsfdsfdsfsfd" // +"dafddfdsfdsfdsfsfd" // +"dafddfdsfdsfdsfsfd\n" // +"dafddfdsfdsfdsfsfd\m" // +"dafddfdsfdsfdsfsfd\n" // +"dafdsfd"; // tx.appendText("\newwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n"); tx.scrollV=tx.numLines; trace( tx.length); tx.type=TextFieldType.INPUT; //tx.displayAsPassword=true; tx.setTextFormat(tf); //tx.htmlText="<h1>大神報名處</h1><br>"+"<a href='http://i.youku.com/webschool'target='_blank'>webscrool</a>"; var urreq:URLRequest=new URLRequest("td/gsjj.txt"); var url:URLLoader=new URLLoader(urreq); url.addEventListener(Event.COMPLETE,function( ){ var ss:String=url.data; tx.text=ss.replace(/\n/g,"");//把全部的換行換成空格 }); stage.addChild(tx);
package td { //登陸,公告,聊天 import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; import flash.net.URLLoader; import flash.net.URLRequest; import flash.text.TextFormat; import fl.controls.Button; import fl.controls.ColorPicker; import fl.controls.Label; import fl.controls.TextArea; import fl.controls.TextInput; public class lesson18 extends MovieClip { var mcLogin:MovieClip=new MovieClip(); var mcGsjj:MovieClip = new MovieClip(); var mcLiaotian:MovieClip = new MovieClip(); var usname:String=""; public function lesson18() { mcLogin.visible = true; mcGsjj.visible = false; mcLiaotian.visible = false; login(); gltl(); } function login(){ var tf:TextFormat = new TextFormat(); tf.size=14; tf.bold = true; var tf1:TextFormat = new TextFormat(); tf1.size=12; var la:Label = new Label(); la.text = "用戶登陸" ; la.x=100; la.y=100; la.setStyle("textFormat",tf); mcLogin.addChild( la ); var laUs:Label = new Label(); laUs.text = "用戶名:" ; laUs.x=la.x; laUs.y=la.y+30; mcLogin.addChild( laUs ); var inPutUs:TextInput = new TextInput(); inPutUs.x=laUs.x+50; inPutUs.y=laUs.y; inPutUs.name="userName"; inPutUs.height=16; inPutUs.width=120; inPutUs.maxChars=10; inPutUs.restrict="[a-z][A-Z][0-9]@#$_"; mcLogin.addChild( inPutUs ); var laInfo:Label = new Label(); laInfo.text = "" ; laInfo.x=la.x+180; laInfo.y=la.y+30; laInfo.width=200; tf1.color=0xff0000; laInfo.setStyle("textFormat",tf1 ); laInfo.name="info"; mcLogin.addChild( laInfo ); var laPs:Label = new Label(); laPs.text = "密碼:" ; laPs.x=laUs.x; laPs.y=laUs.y+30; mcLogin.addChild( laPs ); var inPutPs:TextInput = new TextInput(); inPutPs.name="userPass"; inPutPs.x=laPs.x+50; inPutPs.maxChars=10; inPutPs.restrict="[a-z][A-Z][0-9]@#$_"; inPutPs.displayAsPassword = true; inPutPs.y=laPs.y; inPutPs.height=16; inPutPs.width=120; mcLogin.addChild( inPutPs ); var btn1:Button = new Button(); btn1.label="肯定"; btn1.x=laPs.x+20; btn1.y=laPs.y+30 ; btn1.width=50; btn1.height=20; btn1.addEventListener(MouseEvent.CLICK,checkLogin); mcLogin.addChild( btn1 ); var btnReset:Button = new Button(); btnReset.label="取消"; btnReset.x=laPs.x+80; btnReset.y=laPs.y+30 ; btnReset.width=50; btnReset.height=20; btnReset.addEventListener(MouseEvent.CLICK,function(){ inPutUs.text=""; inPutPs.text=""; laInfo.text=""; }); mcLogin.addChild( btnReset ); stage.addChild( mcLogin ); } function checkLogin(e:MouseEvent){ var us:TextInput = mcLogin.getChildByName("userName") as TextInput; var pa:TextInput = mcLogin.getChildByName("userPass") as TextInput; var info:Label = mcLogin.getChildByName("info") as Label; if (us.text == "" || pa.text==""){ info.text = "用戶名或密碼不能爲空!"; return ; } if (us.text == "123" && pa.text =="456" ){ usname = us.text; mcLogin.visible=false ; mcGsjj.visible = true ; }else{ info.text = "用戶名或密碼不對,請從新輸入!"; return ; } } function gltl(){ var tf:TextFormat = new TextFormat(); tf.size=14; tf.bold = true; var la:Label = new Label(); la.text = "論壇條例" ; la.x=100; la.y=10; la.setStyle("textFormat",tf); mcGsjj.addChild( la ); var tA:TextArea = new TextArea(); tA.x=la.x; tA.y=la.y+50; tA.width=500; tA.height=200; var req:URLRequest = new URLRequest("file/gonggao.txt"); var lod:URLLoader = new URLLoader(req) ; lod.addEventListener(Event.COMPLETE,function(){ var ss:String= lod.data ; tA.text = ss.replace(/\n/g,"") ; }); mcGsjj.addChild( tA ); var btn:Button = new Button(); btn.label="贊成"; btn.width=50; btn.x=la.x+50; btn.y=la.y+260; btn.addEventListener(MouseEvent.CLICK,function(){ ///mcLogin.visible = true; mcGsjj.visible = false; mcLiaotian.visible = true; liaoTian(); }); mcGsjj.addChild( btn ); var btn1:Button = new Button(); btn1.label="不一樣意"; btn1.width=btn.width; btn1.x=la.x+150; btn1.y=btn.y; btn1.addEventListener(MouseEvent.CLICK,function(){ mcLogin.visible = true; mcGsjj.visible = false; mcLiaotian.visible = false; }); mcGsjj.addChild( btn1 ); stage.addChild( mcGsjj ) ; } function liaoTian(){ var la:Label = new Label(); la.text = "歡迎"+usname+"come華山論劍"; trace(usname) ; la.width=200; la.x=100; la.y=50; mcLiaotian.addChild( la ); var ta:TextArea = new TextArea(); ta.width=300; ta.height=200; ta.htmlText="<font color='#ff0000'> 你不能亂髮言,先看羣公告! </font>"; ta.x=la.x; ta.y=la.y+30 ; mcLiaotian.addChild(ta); var co:ColorPicker = new ColorPicker(); co.x=ta.x; co.y=ta.y+ta.height+30; mcLiaotian.addChild(co); var ip:TextInput = new TextInput(); ip.width=200; ip.x=co.x; ip.y=co.y+30; mcLiaotian.addChild(ip); var btn:Button = new Button(); btn.label="發送"; btn.width=50; btn.x=ip.x+ip.width+10; btn.y=ip.y; btn.addEventListener(MouseEvent.CLICK,function(){ //圖片 src只能在瀏覽器中顯示,模擬器不顯示。 var sIn:String = "<img src='image/renwu/man1.png' width='20' height='20'> <font color='#"+co.hexValue+"'> " + ip.text +"</font>"; ta.htmlText = ta.htmlText + "<br>" + sIn; ta.verticalScrollPosition=ta.maxVerticalScrollPosition ; //ta.appendText(sIn); }); mcLiaotian.addChild(btn); stage.addChild( mcLiaotian ); } } }
34.時間
var dd:Date=new Date(); trace(dd.date);//取得日期 多少號(日) trace(dd.getDate());//取得日期 多少號(日) trace(dd.day)//0表示星期日,,依次類推 trace(dd.fullYear);//年 trace(dd.getFullYear());//年 trace(dd.month);//月 trace(dd.getMonth()); trace(dd.hours);//小時 trace(dd.getHours()) trace(dd.minutes);//分鐘 trace(dd.getMinutes()); trace(dd.milliseconds);//毫秒 setInterval(function():void{ var dd1:Date=new Date(); trace(dd1.getSeconds()) },1000); dd.setDate(23);//設置日期 dd.setFullYear(2018);//設置年 trace(dd.getDate());//取得日期 多少號(日)--23 trace(dd.fullYear);//年 trace(dd.setFullYear(2016));//修改年 返回1970年之後的毫秒數
35.(1)Math類中的屬性和方法都靜態類型,不用實例化,即不用new一個,能夠直接用。靜態方法執行效率較高。
(2)角度與弧度:弧度=角度*PI/180 角度=弧度/PI*180 角度=Math.atan2(1,2);y/x
(3)經常使用的API示例
var n1:Number=-123123.623123; var n2:Number=new Number(12.123123); trace(n1.toFixed(2));//取小數位數 trace(n2+" "+n1); trace(Math.round(n1));//四捨五入 trace(Math.ceil(n1));//進位,只取大 trace(Math.floor(n1));//只取小 trace(Math.max(12,34,555))//取最大 trace(Math.min(333,4444,556667));//只取最小 trace(Math.random());//隨機數 [0——1)之間 trace(Math.sin(0)); trace(Math.atan2(0.5,1));//正切 trace(Math.pow(2,2));//平方 trace(Math.sqrt(3));//開方
36.事件
(1)事件:可以監聽某個對象並作出必定的反應。好比鼠標單擊一個按鈕,用戶按下某個鍵就發出人物走動等。
(2)事件三要素:發送者、接收者、事件類型。好比用戶單擊某個按鈕時輸出一行信息,這裏的按鈕就是發送者,點擊按鈕這個動做就是事件,輸出信息就是接收者。
(3)事件的發送者常見有舞臺,時間軸,按鈕,圖形(精靈),影片剪輯,組件(實際也是影片剪輯)等。
(4)事件類型常見有幀事件,鼠標事件,鍵盤事件等。
(5)事件接受者就是函數
(6)幀事件類型中的進入幀事件。幀動畫多人聯網時我的的網絡不通可能形成畫面不一樣步,對於單機版沒問題。基於時間的動畫,多人聯網快慢不影響同步,但不容易製做。
(7)經常使用按鍵與鍵控代碼:ASDW(65,83,68,87)表示方向,左上下右(37,38,39,40)鍵表方向,空格鍵(32),回車(13)鍵,左右shift(16)鍵等,另外左爲1,右爲2,只有一個鍵的爲0.
(8)幀標籤:給影片剪輯的幀起個方便易用的名字。之前經常使用gotoAndPlay(幀數字)一概改成gotoAndPlay(幀標籤)也就是幀的名字。這樣的話界面設計師修改了動畫,只要幀的名稱不變,程序員就不用修改代碼。
(9)鍵盤是全局的,由整個Flash響應,而不是MovieClip.須要添加到舞臺。
(10)若是想一打開頁面就能獲取到焦點。須要調整下HTML頁面代碼。
<body|onLoad="window.document.movielD.focus();">其中movieID就是flash pllayer播放器的id.movieID
37.實現列表與深度
(1)顯示列表:就是各類對象能夠相互嵌套,就造成了樹狀結構,隨着規模的增長顯示列表也愈來愈複雜,因此必須進行有效管理。
(2)深度:一個容器中經常會有多個對象,這些對象的前後順序,先後關係就是深度的概念。利用z軸順序來管理深度。注意區別Z軸座標。好比兩物體A,B深度是0,1,那麼A就在B後邊,與A,B的軸座標沒有關係。。深度越小越向裏,A在B的後邊。
38.垃圾回收與定時器
(1)Flash中垃圾回收機制(GC):再也不須要的變量或對象Flash會根據內存的佔用狀況來決定運行GC的時間自動清除,而這個時間不太肯定。若是反覆大量建立對象,而對象沒有及時清理,內存會愈來愈慢,甚至崩潰。因此不能只建立不銷燬。
(2)注意事件:再也不須要的對象要及時清除監聽器,從舞臺中移除,銷燬對象。
(3)有監聽的對對象若是隻是從舞臺中移除,那麼它只是看不見,但它依然在內存中存放而且依然在不斷執行監聽函數,很耗內存。另外即使這個對象沒有監聽器,但對象自己還在,因此必須清除。
(4)常見清除條件:
(I)超過舞臺的或根據其餘屬性來判斷是否要清楚對象。
(II)根據時間來判斷,定時器。
(III)清除順序最好是清除監聽,移除顯示,銷燬對象自己。
(5)定時器:Timer類是個強大好用的定時器,setInterval時間間隔要強,它具備觸發事件,時間間隔,循環次數等。
package tc { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.TimerEvent; import flash.text.TextField; import flash.text.TextFormat; import flash.utils.Timer; public class lesson11_wan extends Sprite { var zj:tc.zhujiao2 = new zhujiao2(); var keyLeft:Boolean = false; var keyUp:Boolean = false; var keyRight:Boolean = false ; var keyDown:Boolean = false; var gongj:String = "z" ; var time:Timer = new Timer(2000,0); var huaiDang:Sprite = new Sprite(); public function lesson11_wan() { init(); addEven(); } function init(){ focusRect = false ; addChild(huaiDang ); //敵人 addDiren(); addChild( zj ); zj.stop(); zj.x=100; zj.y=100; } function addEven(){ stage.addEventListener(KeyboardEvent.KEY_DOWN,move); stage.addEventListener(KeyboardEvent.KEY_UP,StopFun); stage.addEventListener(Event.ENTER_FRAME,keyMove); } function move(e:KeyboardEvent){ trace( "洪前進"+e.keyCode ); switch (e.keyCode){ case 37: keyLeft = true ;gongj="l"; break; case 38: keyUp= true ;gongj="q"; break; case 39: keyRight = true ;gongj="y"; break; case 40: keyDown = true ; gongj="z";break; case 32: gongjFun(); break ; default:keyDown = true ; break; } } function StopFun(e:KeyboardEvent){ switch (e.keyCode){ case 37: keyLeft = false ;zj.gotoAndStop("ll"); break; case 38: keyUp= false ;zj.gotoAndStop("ql"); break; case 39: keyRight = false ;zj.gotoAndStop("yl"); break; case 40: keyDown = false ;zj.gotoAndStop("zl"); break; case 32: gongjStopFun();break ; default:keyDown = false ; break; } } function keyMove(e:Event){ // trace(keyLeft,keyUp,keyRight,keyDown); if (keyLeft == true){ zj.gotoAndStop("lz"); zj.x -= 10; } if (keyUp == true){ zj.gotoAndStop("qz"); zj.y -= 5 ; } if (keyRight == true){ zj.gotoAndStop("yz"); zj.x += 10 ; } if (keyDown == true){ zj.gotoAndStop("zz"); zj.y += 5 ; } } function gongjFun(){ switch (gongj){ case "z": zj.gotoAndStop("zg"); gongjSend("z"); break ; case "l": zj.gotoAndStop("lg"); gongjSend("l"); break ; case "y": zj.gotoAndStop("yg"); gongjSend("y"); break ; case "q": zj.gotoAndStop("qg"); gongjSend("q"); break ; } } function gongjSend(fangxiang:String){ var jian:tc.jianzhi = new jianzhi(); addChild( jian ); jian.speedx = 0; jian.speedy = 0; jian.scaleX=0.1; jian.scaleY=0.1; switch (fangxiang){ case "z": jian.rotationZ=60; jian.x=zj.x+60; jian.y=zj.y+60; jian.speedx =5; jian.speedy =7; break; case "y": jian.rotationZ=0; jian.x=zj.x+80; jian.y=zj.y+27; jian.speedx =10; jian.speedy =0; break; case "q": jian.rotationZ=-90; jian.x=zj.x+5; jian.y=zj.y; jian.speedx =0; jian.speedy =-10; break; case "l": jian.rotationZ=-180; jian.x=zj.x-10; jian.y=zj.y+40; jian.speedx = -10; jian.speedy = 0; break; } jian.addEventListener(Event.ENTER_FRAME,jianMove); } function jianMove(e:Event){ var j:jianzhi = e.target as jianzhi ; j.x += j.speedx; j.y += j.speedy ; var mc:MovieClip ; for (var i=0;i<huaiDang.numChildren;i++){ if ( j.hitTestObject( huaiDang.getChildAt(i) ) ){ mc = huaiDang.getChildAt(i) as MovieClip ; mc.removeEventListener(Event.ENTER_FRAME,direnMove); mc.parent.removeChild( mc ); mc=null; j.removeEventListener(Event.ENTER_FRAME, jianMove); j.parent.removeChild( j ); j=null; break ; } if (j.x>600+200 || j.x<-200 || j.y > 400+100 || j.y < -200 ){ j.removeEventListener(Event.ENTER_FRAME, jianMove); j.parent.removeChild( j ); j=null; break ; } } } function addDiren(){ time.start(); time.addEventListener(TimerEvent.TIMER,direnCreat); } function direnCreat(e:Event){ var dr:tc.bao = new bao(); huaiDang.addChild( dr ); dr.rotationY=180; dr.x = 600+100; dr.y = 400 * Math.random(); dr.addEventListener(Event.ENTER_FRAME,direnMove); } function direnMove(e:Event){ var dr:tc.bao = e.target as bao; dr.x +=-1 ; if (dr.hitTestObject( zj ) ){ time.stop(); var bg:tc.bg3 = new bg3(); bg.width=100; bg.height=200; addChild( bg ); bg.x=220; bg.y=200; var tf:TextFormat = new TextFormat(); tf.bold=true; tf.color=0xff0000; tf.size=20; var tx:TextField = new TextField(); tx.defaultTextFormat = tf ; tx.text="勝敗乃兵家常事,大俠請從新來過"; addChild( tx ); tx.x=bg.x - 20 ; tx.y=bg.y - 100; tx.wordWrap = true; tx.width=50; tx.height=200; addEventListener(KeyboardEvent.KEY_DOWN,move); addEventListener(KeyboardEvent.KEY_UP,StopFun); addEventListener(Event.ENTER_FRAME,keyMove); for (var i=0;i<huaiDang.numChildren;i++){ var mc:MovieClip =huaiDang.getChildAt(i) as MovieClip ; mc.removeEventListener(Event.ENTER_FRAME,direnMove); mc.stop(); } } if (dr.x < -200 ){ dr.removeEventListener(Event.ENTER_FRAME,direnMove); dr.parent.removeChild( dr ); dr=null; } } function gongjStopFun(){ switch (gongj){ case "z":zj.gotoAndStop("zl");break ; case "l":zj.gotoAndStop("ll");break ; case "y":zj.gotoAndStop("yl");break ; case "q":zj.gotoAndStop("ql");break ; } } } }
39.向量
(1)弧度=角度*PI/180;
Y=Math.sin(弧度)*大小
X=Math.cos(弧度)*大小
40.碰撞
(1)常見碰撞:形狀間的碰撞,點間碰撞,點與形狀碰撞
(2)
ha1.hitTestPoint(ha2.x+100,ha2.y,false)
41.選擇類API
package td { import flash.display.MovieClip; import flash.events.Event; import flash.sensors.Accelerometer; import fl.controls.CheckBox; import fl.controls.ColorPicker; import fl.controls.ComboBox; import fl.controls.RadioButton; import fl.events.ColorPickerEvent; public class lesson19 extends MovieClip { //--全局變量 var cityArr:Array = new Array(); //原始數據,目的就是從裏邊篩選 var city:ComboBox = new ComboBox(); //主區域 var citySub:ComboBox = new ComboBox(); //子區域 public function lesson19() { init(); } function init(){ var cb:CheckBox = new CheckBox(); cb.label="讀書"; cb.x=100; cb.y=50; stage.addChild( cb ); var cb1:CheckBox = new CheckBox(); cb1.label="音樂"; cb1.x=cb.x+50; cb1.y=50; stage.addChild( cb1 ); var cb2:CheckBox = new CheckBox(); cb2.label="美術"; cb2.x=cb1.x+50; cb2.y=50; stage.addChild( cb2 ); var ra1:RadioButton = new RadioButton(); ra1.label="男" ; ra1.groupName="sex"; ra1.x=100; ra1.y=80; ra1.selected=true; ra1.value =1 ; stage.addChild( ra1 ); var ra2:RadioButton = new RadioButton(); ra2.label="女" ; ra2.groupName="sex"; //ra1.selected=true; ra2.x=ra1.x+50; ra2.y=80; ra2.value =2 ; stage.addChild( ra2 ); var raCity:RadioButton = new RadioButton(); raCity.label="北京" ; raCity.x=100; raCity.groupName="city"; raCity.y=ra1.y+30; //raCity.selected=true; raCity.value =1 ; stage.addChild( raCity ); var raCity1:RadioButton = new RadioButton(); raCity1.label="廣州" ; raCity1.groupName="city"; //ra1.selected=true; raCity1.x=raCity.x+50; raCity1.y=ra1.y+30;; raCity1.value =2 ; stage.addChild( raCity1 ); //---主區域-- city.addItem( {label:"北京",data:"010" } ); city.addItem( {label:"上海",data:"020" } ); city.addItem( {label:"廣州",data:"200" } ); city.x=100; city.addEventListener(Event.CHANGE,function(){ changSub();//選項變化時,調用函數 }); city.y=raCity1.y+30; city.selectedIndex=0; stage.addChild( city ); //---構造原始數據,注意第三個參數 cityArr.push( {label:"海淀區",data:"3453",fatherID:"010"} ); cityArr.push( {label:"sfsdf",data:"535",fatherID:"010"} ); cityArr.push( {label:"sdfsf",data:"35443",fatherID:"010"} ); cityArr.push( {label:"ssssss",data:"345",fatherID:"020"} ); cityArr.push( {label:"34534",data:"345",fatherID:"020"} ); cityArr.push( {label:"sfsgdfg",data:"3454",fatherID:"020"} ); cityArr.push( {label:"天河區",data:"5454",fatherID:"200"} ); cityArr.push( {label:"東山區",data:"23432",fatherID:"200"} ); cityArr.push( {label:"越秀區",data:"543353",fatherID:"200"} ); changSub();//初始時調用函數 citySub.x=100+100; citySub.y=raCity1.y+30; stage.addChild( citySub ); var co:ColorPicker = new ColorPicker(); co.x=100; co.y=citySub.y+30; co.addEventListener(ColorPickerEvent.CHANGE,function(){ trace( co.hexValue ) ; }); stage.addChild( co ); } //----從原始數據中篩選出須要的數據-- function changSub(){ citySub.removeAll(); for (var i=0;i<cityArr.length;i++){ if (cityArr[i]["fatherID"] == city.selectedItem["data"] ) { citySub.addItem( { label:cityArr[i]["label"] ,data: cityArr[i]["data"] } ) ; } } } } }
42.XML數據操做(增刪改查)
(1)XML語言簡介:全稱Extensible Markup Language.XML做用就是用來結構化、存儲以及傳輸消息。是一種標記怨言,很相似HTML,但與html不一樣的是它是沒有被預約義的,本身根據須要來定義,本身根據須要來定義,也就是說你能夠隨便起名稱。而html是預約義的,好比<head><body><title>等標籤,你不能任意修改。
(2)xml結構是樹狀結構。注意根元素、父元素、屬性等。另外必須有根元素,大小寫敏感,標籤最好成對出現等。
(3)對xml操做完後須要保存sharedobject.xml適合操做數據,不能保存數據,因此須要藉助SharedObject對象給予存儲。
43.本地數據存儲
(1)SharedObject Flash的本地共享對象是在用戶機器上實現持久化存儲的數據集合。Flash能夠從程序中控制這些數據集合,向其中存入或者從中讀取大量的信息數據。能夠用它來存儲任何Flash支持的數據類型,好比數字、字符串、數組、對象、XML等等。SharedObject按存儲放位置可分爲本地型(存放客戶端)和遠程型(存放服務器)。默認狀況下,每一個共享對象的大小限制爲100KB(經測算大約2萬5千漢字)。當超過這個大小時,會提示選擇肯定便可。
(2)共享對象常見做用保存數據外,還可用來製做購物車,用戶在一個頁面登陸後就不用再其餘頁面登陸,也能夠製做用戶登陸成功後不用再次登陸,以保存遊戲進度等。
(3)SharedObject注意事項:存儲路徑必須在同一域下多個flash纔可共享,不如路徑使用「/」;
(4)其餘的本地存儲方式,都不適合flash存儲。好比文本文件,數據庫等只適合桌面存儲,而xml文件的存儲也需藉助SharedObject。
44.數據展現類組件:
(1)List組件:列表。多行單列。經常使用來作成員展現,如qq羣成員列表
(2)TileList組件:卡片列表,平鋪列表。多行多列。經常使用來作圖片展現,如圖片牆。
(3)DataGrid組件:網絡列表。多行多列。經常使用來作複雜的數據展現,如人員管理系統等。
(4)List組件
package td { import flash.display.MovieClip; import flash.events.Event; import flash.text.TextField; import fl.controls.List; import fl.data.DataProvider; import tc.bao; import tc.fangWu; import tc.zhujiao1; public class lesson22 extends MovieClip { var text:TextField=new TextField(); public function lesson22() { init(); creaText(); } function creaText(){ text.x=20; text.y=100; stage.addChild(text); } function init(){ var zj:tc.zhujiao1=new zhujiao1(); zj.width=10; zj.height=10; var dp:DataProvider=new DataProvider(); dp.addItem({label:"嘖嘖嘖",data:"1",zhiwu:"1"}); dp.addItem({label:"bbb",data:"2",zhiwu:"2"}); dp.addItem({label:"ddd嘖",data:"3",zhiwu:"1"}); dp.addItem({label:"33嘖",data:"4",zhiwu:"3"}); dp.addItem({label:"iii嘖",data:"5",zhiwu:"2"}); dp.addItem({label:"嘖嘖嘖",data:"1",zhiwu:"1"}); dp.addItem({label:"bbb",data:"2",zhiwu:"2"}); dp.addItem({label:"ddd嘖",data:"3",zhiwu:"1"}); dp.addItem({label:"33嘖",data:"4",zhiwu:"3"}); dp.addItem({label:"iii嘖",data:"5",zhiwu:"2"}); dp.addItem({label:"嘖嘖嘖",data:"1",zhiwu:"1"}); dp.addItem({label:"bbb",data:"2",zhiwu:"2"}); dp.addItem({label:"ddd嘖",data:"3",zhiwu:"1"}); dp.addItem({label:"33嘖",data:"4",zhiwu:"3"}); dp.addItem({label:"iii嘖",data:"5",zhiwu:"2"}); var li:List=new List(); li.dataProvider=dp; li.width=140; li.iconFunction=getIcon; li.rowCount=3; li.addEventListener(Event.CHANGE,funChfang); stage.addChild(li); } function getIcon(it:Object){ var zw:String=it.zhiwu; if(zw=="1"){ var mc1:tc.zhujiao1=new tc.zhujiao1; mc1.width=10; mc1.height=10; return mc1; } if(zw=="2"){ var mc2:tc.bao=new tc.bao; mc2.width=10; mc2.height=10; return mc2; } if(zw=="3"){ var mc3:tc.fangWu=new tc.fangWu; mc3.width=10; mc3.height=10; return mc3; } } function funChfang(e:Event){ var li1:List=e.currentTarget as List; text.text=li1.selectedItem.label; } } }
(5)TileList組件
package td { import flash.display.MovieClip; import fl.controls.TileList; import fl.data.DataProvider; import fl.controls.ScrollBarDirection; public class lesson22a extends MovieClip { public function lesson22a() { init(); } function init(){ var dp:DataProvider=new DataProvider(); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remw1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); dp.addItem({label:"remwu1",source:"image/renwu/man1.png"}); var t1:TileList=new TileList(); t1.dataProvider=dp; t1.width=stage.stageWidth; t1.height=stage.stageHeight; t1.columnCount=5; t1.columnWidth=100; t1.rowHeight=100; t1.rowCount=5; t1.direction=ScrollBarDirection.VERTICAL; stage.addChild(t1); } } }
45.載入類控件
(1)ScrollPane滾動畫板:圖片、動畫等大小不一,或過大可使用此控件。由於它具備滾動條和拖動功能。
(2)UIload這個控件具備固定大小。載入的內容會自動調整大小適應此控件,與上個控件正好相反,適應於圖片,動畫等大小一致或比例一致的狀況。若是比例不一致時經常變形,很差控制。
(3)Slider滑動杆控件,經常用來控制對象的大小,方向等。
(4)ScrollPane
package td { import flash.display.MovieClip; import flash.events.Event; import flash.events.ProgressEvent; import fl.containers.ScrollPane; import fl.controls.Slider; import fl.controls.SliderDirection; import fl.events.SliderEvent; import tc.bg3; public class lesson23 extends MovieClip { var wi:int=0; var hi:int=0; var bgw:int=0; public function lesson23() { init(); } function init(){ var bg:tc.bg3=new bg3(); // bg.width=300; bg.height=10; bgw=bg.width; stage.addChild(bg); var sp:ScrollPane=new ScrollPane(); sp.source="image/scan/bg5.jpg"; sp.width=stage.stageWidth; sp.height=stage.stageHeight; sp.scrollDrag=true; sp.addEventListener(Event.COMPLETE,function(){ wi=sp.content.width; hi=sp.content.height; }); sp.addEventListener(ProgressEvent.PROGRESS,function(){ trace(sp.bytesLoaded); //已經加載的字節數 trace(sp.bytesTotal);//總共的字節數 trace(sp.percentLoaded);//加載的進度條百分比 值0——100 bg.width=width*(sp.percentLoaded/100); }); stage.addChild(sp); bg.x=sp.x+100; bg.y=sp.y+500; var sl:Slider=new Slider(); sl.width=300; sl.direction=SliderDirection.HORIZONTAL; sl.snapInterval=10; sl.tickInterval=10; sl.maximum=100; sl.minimum=0; sl.x=sp.x+10; sl.y=sp.y+10; sl.addEventListener(SliderEvent.CHANGE,function(){ sp.content.width=wi*(sl.value/100+1); sp.content.height=hi*(sl.value/100+1); }); stage.addChild(sl); stage.setChildIndex(bg,stage.numChildren-1); } } }
46.播放器
(1)FLVPlayBack播放器:Flash中內置播放器,可經過flash軟件的窗口菜單---組件打開。特麼強調在Flash builder使用時得作相應調整,由於導出組件時默認不在庫面板中,因此導入後找不到。須要打開:(跟人安裝目錄)\Adobe\ Adobe Flash CC 2015\Common\Configuration\Components
(2)皮膚:播放器外觀能夠經過皮膚設置,好比播放、中止,全屏、進度條等等能夠經過皮膚設置。最好把皮膚文件複製到本項目中方便調用。存放目錄:C:\Program Files\Adobe\ Adobe Flash CC 2015\Common\Configuration\Components
(3)經過Flash CC中把Video.fla 打開,把FLVPlayback 2.5組件拖到Video.fla中,發佈成swc格式,以後導入到flashbuilder4.7中。
(4)把Video.swc導入到fb庫中。
(5)同時把 Fash CC中的 Adobe Flash CC 2015\Common\Configuration\Components皮膚拷貝到fb中去。
(5)視頻播放
package { import flash.display.MovieClip; import fl.video.FLVPlayback; import fl.video.VideoEvent; public class teacher1 extends MovieClip { public function teacher1() { init(); } function init(){ var curPlayIndex:int=0; var arr:Array=new Array(); arr.push("music/仙劍四片尾動畫.flv"); arr.push("music/美麗的神話.mp4"); var flv:FLVPlayback=new FLVPlayback(); //flv.source="music/仙劍四片尾動畫.flv"; flv.source=arr[curPlayIndex]; flv.skin="file/MinimaFlatCustomColorAll.swf"; flv.width=stage.stageHeight; flv.height=stage.stageHeight; flv.autoPlay=false; flv.skinAutoHide=true; flv.skinFadeTime=2000; flv.skinBackgroundColor=0xfff000; flv.skinBackgroundAlpha=0.5; stage.addChild(flv); flv.addEventListener(VideoEvent.COMPLETE,function(){ // flv.source="music/美麗的神話.mp4" curPlayIndex++; if(curPlayIndex>arr.length-1){ curPlayIndex=0; } flv.source=arr[curPlayIndex]; }); } } }
(6)視頻點播
package td { import flash.display.MovieClip; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; import fl.containers.ScrollPane; import fl.controls.ScrollBarDirection; import fl.controls.TileList; import fl.data.DataProvider; import fl.video.FLVPlayback; public class lesson24a extends MovieClip { var tl:TileList=new TileList(); var vi:FLVPlayback=new FLVPlayback(); public function lesson24a() { init(); } function init(){ var req:URLRequest=new URLRequest("flv/video.xml"); var lod:URLLoader=new URLLoader(req); var xml:XML; trace(req); lod.addEventListener(Event.COMPLETE,function(){ trace(lod.data); xml= new XML(lod.data); creLsit(xml); }); } function creLsit(xml:XML){ var dp:DataProvider=new DataProvider(xml); tl.dataProvider=dp; tl.labelField="name"; tl.sourceField="src"; tl.columnCount=11; tl.columnWidth=150; tl.width=150; tl.height=stage.stageHeight; tl.direction=ScrollBarDirection.VERTICAL; tl.selectedIndex=0; stage.addChild(tl); tl.addEventListener(Event.CHANGE,function(){ vi.source=tl.selectedItem.swf; }); creVideo(); } function creVideo(){ vi.source=tl.selectedItem.swf; vi.skin="file/MinimaFlatCustomColorAll.swf"; vi.skinBackgroundColor=0xfff000; vi.skinBackgroundAlpha=0.8; vi.x=150; vi.skinAutoHide=true; stage.addChild(vi); } } }
47.繪圖
(1)繪圖類不是顯示對象,須要藉助其它對象來顯示。如Shape,prite,movieclip等。
(2)Shape:圖形,只用來顯示繪圖對象,沒有鼠標,鍵盤事件等交互功能。功能少效率高。
(3)Sprite:精靈,有交互功能,但沒時間軸,即沒有幀的該奶奶個,即沒有gotoAndPlay(*)等關於跳轉幀的內容。但不是說不能作動畫,須要用事件來作動畫:如進入幀功能等,由於它有交互功能。
(4)movieclip:影片剪輯:功能最多了,既有交互,又有幀。但效率低。
(5)直線折線曲線
package td { import flash.display.CapsStyle; import flash.display.JointStyle; import flash.display.LineScaleMode; import flash.display.Shape; import flash.display.Sprite; public class lesson25 extends Sprite { public function lesson25() { /*var sp:Shape=new Shape(); sp.graphics.lineStyle(10,0x000000,1,false,LineScaleMode.NORMAL,CapsStyle.SQUARE,JointStyle.MITER); sp.graphics.moveTo(0,0); sp.graphics.lineTo(100,100); sp.graphics.lineStyle(5,0xff0000,0.5); sp.graphics.lineTo(200,50); this.addChild(sp);*/ var sp:Shape=new Shape(); sp.graphics.lineStyle(2,0xff0000); sp.graphics.moveTo(0,0); sp.graphics.curveTo(500,100,400,10); sp.graphics.curveTo(200,200,300,300); this.addChild(sp); } } }
package td { import flash.display.Shape; import flash.display.Sprite; import flash.events.TimerEvent; import flash.utils.Timer; public class lesson25a extends Sprite { var zs:Shape=new Shape(); public function lesson25a() { createBg(); var tm:Timer=new Timer(1000,0); tm.addEventListener(TimerEvent.TIMER,function(){ init(); }); tm.start(); } function init(){ var arr:Array=new Array(); arr.push({month:201501,value:1000*Math.random()}); arr.push({month:201502,value:1400*Math.random()}); arr.push({month:201503,value:-300*Math.random()}); arr.push({month:201504,value:1500*Math.random()}); arr.push({month:201505,value:15000*Math.random()}); zs.graphics.clear(); zs.graphics.lineStyle(1,0xff0000); zs.graphics.moveTo(10,300); for(var i=0;i<arr.length;i++) { zs.graphics.lineTo(10+(50*(i+1)),300-arr[i].value/100); } this.addChild(zs); } function createBg(){ var spx:Shape=new Shape(); spx.graphics.lineStyle(2,0x000000); spx.graphics.moveTo(10,300); spx.graphics.lineTo(400,300); this.addChild(spx); var spy:Shape=new Shape(); spy.graphics.lineStyle(2,0x000000); spy.graphics.moveTo(10,300); spy.graphics.lineTo(10,10); this.addChild(spy); } } }
(6)煙霧
package td { import flash.display.GradientType; import flash.display.Shape; import flash.display.Sprite; import flash.geom.Matrix; import flash.events.*; import tc.bg3; import tc.tree1; public class lesson25c extends Sprite { public function lesson25c() { init(); creatTree(); creaYunTuan(); creatTree(); } function creatTree(){ var tr:tc.tree1=new tree1(); tr.x=200*Math.random()-100; tr.y=0; tr.scaleX=0.5; tr.scaleY=0.5; tr.z=100*Math.random(); this.addChild(tr); } function init(){ var bg:tc.bg3=new bg3(); bg.x=200; bg.y=200; bg.height=400; this.addChild(bg); } function creaYunTuan(){ for(var i:int=0;i<50;i++){ creaYunLizhi(); } } function creaYunLizhi(){ var sp:Shape=new Shape(); sp.x=500*Math.random(); sp.y=300*Math.random(); sp.z=200*Math.random(); sp.addEventListener(Event.ENTER_FRAME,function(){ sp.x+=5; if(sp.x>500) sp.x=-10; }); var ty:String=GradientType.RADIAL; var col:Array=new Array(); col.push(0xffffff); col.push(0xffffff); var ah:Array=new Array(); ah.push(0.5);//徹底不透明 ah.push(0); var rat:Array=new Array(); rat.push(100); rat.push(255); var mr:Matrix=new Matrix(); mr.createGradientBox(100,100,0,0,0); sp.graphics.beginGradientFill(ty,col,ah,rat,mr); sp.graphics.drawCircle(50,50,50); this.addChild(sp); } } }
(7)火
package td { import flash.display.GradientType; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix; public class lesson25d extends Sprite { public function lesson25d() { init(); } function init(){ this.addEventListener(Event.ENTER_FRAME,function(){ createTuan(); }); } function createTuan(){ for(var i:int=0;i<10;i++){ creaFire(); } } function creaFire(){ var sp:Shape=new Shape(); sp.x=Math.random()*200; sp.z=Math.random()*200-100; sp.y=Math.random()*50; var ty:String=GradientType.LINEAR; var cor:Array=new Array(); cor.push(0xffffff); cor.push(0xffff00); cor.push(0xff0000); cor.push(0xffffff); var ah:Array=new Array(); ah.push(0); ah.push(1); ah.push(1); ah.push(0); var rad:Array=new Array(); rad.push(10); rad.push(100); rad.push(150); rad.push(250); var ma:Matrix=new Matrix(); ma.createGradientBox(100,400,-Math.PI/2,0,0); var dy:int; var dx:int; sp.addEventListener(Event.ENTER_FRAME, moveFire); function moveFire(e:Event){ sp.graphics.clear(); sp.graphics.beginGradientFill(ty,cor,ah,rad,ma); dy+=5; dx=Math.random()*20-10; sp.graphics.drawRect(dx,300-dy,5,5); if(dy>800){ sp.removeEventListener(Event.ENTER_FRAME, moveFire); sp.parent.removeChild(sp); sp=null; } } this.addChild(sp); } } }
(8)曲線動態畫法
(I)曲線的控制點與開始點,結束點成全等三角形時,接近正圓的一部分。等腰三角形時成橢圓的一部分。任意三角形時成任意曲線。
(II)對於規則的圖形經常使用三角函數來肯定線上的點,把一整條線分隔成段,這也是電子地圖中尋路的常見方式。
(III)對於不規則的曲線經常使用曲線方程來肯定線上各點。
二次貝茨曲線方程B(t)=(1-t)2P0+2t(1-t)P1+t2P2
其中t爲百分比,p0 開始點,P1 控制點,P2結束點。
實際使用時經常使用來求曲線上某點座標。如:
曲線上第t處某點的x=(1-t)2P0x+2t(1-t)P1x+t2P2x
曲線上第t處某點的y=(1-t)2P0y+2t(1-t)P1y+t2P2y
(4)畫圓
package td { import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; public class lesson26hongqianjin extends Sprite { public function lesson26hongqianjin() { var pi:Number=Math.PI; var piD:Number=pi/8; var rad:Number=100;//半徑 var jiaoDu:Number=0; var startx:Number=100;//起始點 var starty:Number=0; var controlDis:Number=rad/Math.cos( piD);//控制點半徑 var sp:Shape=new Shape(); sp.graphics.lineStyle(2,0xff0000,1); sp.graphics.moveTo( startx,starty); // sp.graphics.beginFill(0x00ff00,1); // sp.graphics.drawCircle(startx,startx,5); this.addChild(sp); sp.x=200; sp.y=200; sp.addEventListener(Event.ENTER_FRAME, drawYuan); function drawYuan(e:Event) { jiaoDu+= piD; if(jiaoDu>=2*pi) { sp.removeEventListener(Event.ENTER_FRAME, drawYuan); } var conX:Number=Math.cos(jiaoDu)*controlDis;//控制點 var conY:Number=Math.sin(jiaoDu)*controlDis; //sp.graphics.curveTo( // sp.graphics.beginFill(0x0fff00,1); // sp.graphics.drawCircle(conX,conY,5); jiaoDu+= piD; var endX:Number=Math.cos(jiaoDu)*rad;//結束點 var endY:Number=Math.sin(jiaoDu)*rad; // sp.graphics.beginFill(0x0ffff0,1); // sp.graphics.drawCircle(endX,endY,5); sp.graphics.curveTo(conX,conY, endX,endY); } } } }
(5)沿着曲線運動
package td { import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import tc.huanBan; public class lesson25f extends Sprite { var sp:Shape = new Shape(); public function lesson25f() { creatHuliu(); } function creatHuliu(){ this.addChild( sp ) ; var p0x:Number = 0; var p0y:Number = 100; drawYuan(p0x,p0y); var p1x:Number = 180; var p1y:Number = 500; drawYuan(p1x,p1y); var p2x:Number = 150; var p2y:Number = -300; drawYuan(p2x,p2y); var p3x:Number = 200; var p3y:Number = -300; drawYuan(p3x,p3y); var p4x:Number = 400; var p4y:Number = 500; drawYuan(p4x,p4y); var p5x:Number = 300; var p5y:Number = 100; drawYuan(p5x,p5y); var p6x:Number = 600; var p6y:Number = 50; drawYuan(p6x,p6y); var t:Number = 0; sp.graphics.moveTo(p0x,p0y); sp.graphics.endFill(); sp.graphics.lineStyle(2,0x00ff00,1); for (t=0;t<1;t+=0.05){ var po:Point = getXY(t); sp.graphics.lineTo(po.x,po.y); } var ha:huanBan = new huanBan(); this.addChild( ha ); var haP:Point = new Point(); var haT:Number = 0; ha.scaleX = 0.3; ha.scaleY = 0.3; ha.addEventListener(Event.ENTER_FRAME,function(){ haT += 0.02; haP=getXY(haT); ha.x = haP.x - ha.width/2; ha.y = haP.y - ha.height/2; if (ha.x >= stage.stageWidth){ haT = 0 ; } }); function getXY(t:Number){ var dx:Number = 1*p0x*Math.pow((1-t),6) * Math.pow(t,0) + 6*p1x*Math.pow((1-t),5) * Math.pow(t,1) + 15*p2x*Math.pow((1-t),4) * Math.pow(t,2) + 20*p3x*Math.pow((1-t),3) * Math.pow(t,3) + 15*p4x*Math.pow((1-t),2) * Math.pow(t,4) + 6 *p5x*Math.pow((1-t),1) * Math.pow(t,5) + 1 *p6x*Math.pow((1-t),0) * Math.pow(t,6) ; var dy:Number = 1*p0y*Math.pow((1-t),6) * Math.pow(t,0) + 6*p1y*Math.pow((1-t),5) * Math.pow(t,1) + 15*p2y*Math.pow((1-t),4) * Math.pow(t,2) + 20*p3y*Math.pow((1-t),3) * Math.pow(t,3) + 15*p4y*Math.pow((1-t),2) * Math.pow(t,4) + 6 *p5y*Math.pow((1-t),1) * Math.pow(t,5) + 1 *p6y*Math.pow((1-t),0) * Math.pow(t,6) ; var po:Point = new Point(); po.x = dx; po.y = dy ; return po ; } /*B(t)= 1 P0 (1-t)^6*t^0 + 6 P1(1-t)5 t1 + 15 P2(1-t)4t2 + 20 P3(1-t)3t3 + 15 P4(1-t)2t4 + 6 P5(1-t)1 t5 + 1 P6(1-t)0 t6*/ } function drawYuan(x:Number,y:Number){ sp.graphics.beginFill(0xff0000,1); sp.graphics.drawCircle(x,y,5 ); } } }
package td { import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import tc.nu; public class lesson26ahongqianjin extends Sprite { var t:Number=0; var startX:Number=0;//起始點 var startY:Number=0; var conlX:Number=50;//控制點 var conlY:Number=300; var endX:Number=500;//結束點 var endY:Number=150; public function lesson26ahongqianjin() { var sp:Shape=new Shape(); sp.graphics.lineStyle(2,0xff0000,1); sp.graphics.moveTo(startX,startX); sp.graphics.curveTo( conlX,conlY,endX,endY); // 二次貝茨曲線方程B(t)=(1-t)2P0+2t(1-t)P1+t2P2//注意這裏2有的次方,有的是下標 sp.addEventListener(Event.ENTER_FRAME,drawYuan); function drawYuan(e:Event){ var renyiX:Number=Math.pow((1-t),2)*startX+2*t*(1-t)*conlX+Math.pow(t,2)*endX; var renyiY:Number=Math.pow((1-t),2)*startY+2*t*(1-t)*conlY+Math.pow(t,2)*endY; t+=0.05; sp.graphics.drawCircle(renyiX ,renyiY,5); if(t>1){ sp.removeEventListener(Event.ENTER_FRAME,drawYuan); } } this.addChild(sp); } } }
(7)二次方公式,它只有一個控制點,還有三次方公式,它有兩個控制點。
(8)高次公式:
B(t)=(1-t)2P0+2t(1-t)P1+t2P2
一次方公式:B(t)=P0 +(P1-P0)t=(1-t)P0+tP1, t屬於[0,1];
二次方公式:B(t)=(1-t)2P0+2t(1-t)P1+t2P2, t屬於[0,1];
三次方公式:B(t)=P0(1-t)3+3P1t(1-t)2+3P2t2 (1-t)+P3t3 , t屬於[0,1];
說明:00=1,0!=1
package td { import flash.display.Shape; import flash.display.Sprite; import flash.geom.Point; import flash.events.*; import tc.huanBan; public class lesson25fhongqianjin extends Sprite { var sp:Shape=new Shape(); public function lesson25fhongqianjin() { createHuliu(); } function createHuliu(){ this.addChild(sp); var p0x:Number=0; var p0y:Number=100; drawYuan(p0x,p0y); var p1x:Number=180; var p1y:Number=500; drawYuan(p1x,p1y); var p2x:Number=200; var p2y:Number=0; drawYuan(p2x,p2y); var p3x:Number=300; var p3y:Number=-100; drawYuan(p3x,p3y); var p4x:Number=400; var p4y:Number=400; drawYuan(p4x,p4y); var p5x:Number=500; var p5y:Number=100; drawYuan(p5x,p5y); var p6x:Number=600; var p6y:Number=100; drawYuan(p6x,p6y); var t:Number=0; sp.graphics.moveTo(p0x,p0y); sp.graphics.endFill(); sp.graphics.lineStyle(2,0xff00ff,1); for(t=0;t<1;t+=0.01){ var po:Point=getXY(t); sp.graphics.lineTo(po.x,po.y); } var ha:huanBan=new huanBan(); this.addChild(ha); ha.scaleX=0.5; ha.scaleY=0.5; var haP:Point=new Point(); var haT:Number=0; ha.addEventListener(Event.ENTER_FRAME,function(){ haT+=0.02; haP=getXY(haT); ha.x=haP.x-ha.width/2; ha.y=haP.y-ha.height/2; if(ha.x>=stage.stageWidth){ haT=0; } }); function getXY(t:Number){ var dx:Number=1*p0x*Math.pow((1-t),6)*Math.pow(t,0) +6*p1x*Math.pow((1-t),5)*Math.pow(t,1) +15*p2x*Math.pow((1-t),4)*Math.pow(t,2) +20*p3x*Math.pow((1-t),3)*Math.pow(t,3) +15*p4x*Math.pow((1-t),2)*Math.pow(t,4) +6*p5x*Math.pow((1-t),1)*Math.pow(t,5) +1*p6x*Math.pow((1-t),0)*Math.pow(t,6); var dy:Number=1*p0y*Math.pow((1-t),6)*Math.pow(t,0) +6*p1y*Math.pow((1-t),5)*Math.pow(t,1) +15*p2y*Math.pow((1-t),4)*Math.pow(t,2) +20*p3y*Math.pow((1-t),3)*Math.pow(t,3) +15*p4y*Math.pow((1-t),2)*Math.pow(t,4) +6*p5y*Math.pow((1-t),1)*Math.pow(t,5) +1*p6y*Math.pow((1-t),0)*Math.pow(t,6); // return {x:dx,y:dy};//作個對象,方法1 //方法二,放到一個點 var po:Point=new Point(); po.x=dx; po.y=dy; return po; } /*B(t)= 1 P0 (1-t)^6*t^0 + 6 P1(1-t)5 t1 + 15 P2(1-t)4t2 + 20 P3(1-t)3t3 + 15 P4(1-t)2t4 + 6 P5(1-t)1 t5 + 1 P6(1-t)0 t6*/ } function drawYuan(x:Number,y:Number){ sp.graphics.beginFill(0xff0000,1); sp.graphics.drawCircle(x,y,5); } } }
48.尋路
(1)尋路:就是從一點到另外一點,找出最近或最優的路徑。
(2)最多見的一個方法:把地圖分紅格子,每一個格子表明一段路程,格子上可標註不一樣信息,好比:
(I)障礙物:(山川河流房屋等等只要是不打算走的地方均可認爲障礙物)
(II)路況信息,例如1表示暢通,2表示堵車
(II)有無收費站:1表有,0表示沒有
(III)反正有什麼須要的信息均可以標註到格子上。
(3)涉及關鍵內容
(II)數據結構:須要作成鏈狀結構
(4)實例部分
第一步:鏈狀數據結構,標註路程信息,劃分網格圖,區分障礙等,並放入數組。
第二步:遍歷各類可能路徑,把能走的路線都放入新數組。
第三步:重新數組中,找出最近或最優路徑
第四步:讓人物或對象按路徑運動
(5)死路問題:也就是永遠也到不了終點,好比終點被圍時,或者起點被圍時。解決辦法就是當前節點時,除了判斷終點外,還須要判斷是否已經走過,如何已經走過了就隔過本節點,進入下個結點,若是下個節點也走過,就在進入下個結點,如何再也找不出下個結點了,就中段循環,代表無路可走。
注:若是再也沒有子節點可走時,就選不到節點名稱,這時名稱爲null,對象也爲null,可判斷無路可走,用return當即退出遞歸。
package td { import flash.display.MovieClip; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.sampler.NewObjectSample; import tc.fangWu; public class lesson26 extends Sprite { var gridWH:int = 50 ; var gridArr:Array = new Array(); var sprMap:Sprite = new Sprite(); var zhangAi:Sprite = new Sprite(); var startPost:String = "G0000"; var endPost:String = "G0303"; var pathArr:Array = new Array(); var spHuancheng:Sprite = new Sprite(); var sp:Shape = new Shape(); public function lesson26() { mapInfo(); creatGrid(); creatZA(); //testInof(); } function huaXian(){ sp.graphics.clear(); sp.graphics.lineStyle(5,0x00ff00,1); var ob:Object = getGridInfo(startPost ) ; sp.graphics.moveTo( ob.x+gridWH/2,ob.y +gridWH/2 ); for (var i=1;i<pathArr.length;i++){ var ob1:Object = getGridInfo( pathArr[i] ) ; sp.graphics.lineTo(ob1.x+gridWH/2,ob1.y+gridWH/2 ); } spHuancheng.addChild( sp ); this.addChild( spHuancheng ); } function mapInfo(){ var colNum:int = stage.stageWidth/gridWH; var rowNum:int = stage.stageHeight/gridWH; for (var i=0;i< colNum ;i++ ){ for ( var m=0;m<rowNum;m++ ){ var gridInfo:Object = new Object(); gridInfo.name="G"+getFormatNum(i)+getFormatNum(m); gridInfo.isSeach=false ; gridInfo.x=i*gridWH; gridInfo.y=m*gridWH; gridInfo.width=gridWH; gridInfo.height=gridWH; gridInfo.isZhangAi=false ; gridInfo.roadInfo=1; //--2,3,3 gridInfo.fengGuang=1; gridInfo.postFee=0 ; //gridInfo.photo="image/renwu/man1.png" ; gridInfo.photo="" ; var subArr:Array = new Array(); var gridNam=""; if ( i+1 < colNum ){ gridNam="G"+ getFormatNum(i+1)+getFormatNum(m) ; subArr.push( gridNam ) ; } if (i-1 >= 0 ){ gridNam="G"+ getFormatNum(i-1)+getFormatNum(m) ; subArr.push( gridNam ) ; } if (m+1 < rowNum){ gridNam="G"+ getFormatNum(i)+getFormatNum(m+1) ; subArr.push( gridNam ) ; } if (m-1 >= 0 ){ gridNam="G"+ getFormatNum(i)+getFormatNum(m-1) ; subArr.push( gridNam ) ; } if (i-1 >=0 && m-1>=0){ gridNam="G"+ getFormatNum(i-1)+getFormatNum(m-1) ; subArr.push( gridNam ) ; } if (i+1<colNum && m+1<rowNum ){ gridNam="G"+ getFormatNum(i+1)+getFormatNum(m+1) ; subArr.push( gridNam ) ; } if (i-1>=0 && m+1 < rowNum ){ gridNam="G"+ getFormatNum(i-1)+getFormatNum(m+1) ; subArr.push( gridNam ) ; } if (i+1 < colNum && m-1 >= 0 ){ gridNam="G"+ getFormatNum(i+1)+getFormatNum(m-1) ; subArr.push( gridNam ) ; } gridInfo.subGrid=subArr; gridArr.push(gridInfo ); ///trace (gridInfo.subGrid) ; } } } function creatGrid(){ for (var i=0;i<gridArr.length;i++){ var sp:Sprite = new Sprite(); sp.graphics.beginFill(0x00ff00,0.5); sp.graphics.drawRect( 0,0,gridArr[i].width,gridArr[i].height); sp.name=gridArr[i].name; sp.x = gridArr[i].x; sp.y = gridArr[i].y; sp.width = gridArr[i].width-1; sp.height = gridArr[i].height-1; sp.addEventListener(MouseEvent.CLICK,function(e:Event){ var ssp:Sprite = e.currentTarget as Sprite ; endPost = ssp.name; clearePath(); seachPath(startPost); huaXian(); startPost=endPost ; }); sprMap.addChild(sp ); } this.addChild( sprMap ); } function creatZA(){ var fw:fangWu = new fangWu(); fw.width=gridWH; fw.height =gridWH; fw.x = 3*gridWH; fw.y = 3*gridWH; fw.addEventListener(Event.ADDED,addZaColor); zhangAi.addChild( fw ); var fw:fangWu = new fangWu(); fw.width=gridWH*2; fw.height =gridWH*2; fw.x = 6*gridWH; fw.y = 2*gridWH; fw.addEventListener(Event.ADDED,addZaColor); zhangAi.addChild( fw ); this.addChild( zhangAi ); getZhangai("G0305"); getZhangai("G0405"); getZhangai("G0505"); changZA("G0305"); changZA("G0405"); changZA("G0505"); } function clearePath(){ pathArr.splice(0,pathArr.length); } function seachPath(sName:String){ if (sName =="" || sName == null){ return ; } var currGrid:Object = getGridInfo(sName); pathArr.push( currGrid.name ) ; if (currGrid.name == endPost){ return ; } //---以最短爲例-- var subA:Array = currGrid.subGrid; var distianName :Object; var endObj:Object = getGridInfo( endPost ); var distinNameArr:Array = new Array(); trace("subA.length "+subA.length); for (var i=0;i< subA.length;i++ ){ var subObj:Object = getGridInfo( subA[i] ); trace( subA[i] ) ; if (subObj.isZhangAi==true){ continue; } //------------ var isPath:Boolean = false ; for (var m=0;m<pathArr.length;m++){ if (subObj.name == pathArr[m] ){ isPath = true ; break; } } if ( isPath == true){ continue ; } //--------------------- var obj:Object=new Object(); obj.name= subObj.name; obj.dis= Math.abs( endObj.x - subObj.x ) + Math.abs( endObj.y - subObj.y ) ; distinNameArr.push( obj ) ; } trace(" disc"+distinNameArr); var disc:int = distinNameArr[0].dis; var minName:String = distinNameArr[0].name; for (var i=0;i<distinNameArr.length;i++){ if ( Math.round( distinNameArr[i].dis ) < disc ){ disc = Math.round( distinNameArr[i].dis ) ; minName = distinNameArr[i].name ; } } //trace(minName) ; //pathArr.push( minName ) ; //---遞歸調用-- seachPath( minName ); } function getGridInfo(sn:String){ for (var i=0;i<gridArr.length;i++){ if (gridArr[i].name == sn){ return gridArr[i] ; } } } function addZaColor(e:Event){ var mc:MovieClip = e.currentTarget as MovieClip ; for (var i=0;i<gridArr.length;i++){ if ( gridArr[i].x >= mc.x && gridArr[i].x < mc.x +mc.width && gridArr[i].y>=mc.y && gridArr[i].y < mc.y+mc.height ){ gridArr[i].isZhangAi=true ; //var sp:Sprite =sprMap.getChildByName( gridArr[i].name ) as Sprite; getZhangai(gridArr[i].name); } } } function getZhangai(za:String){ var sp:Sprite =sprMap.getChildByName( za ) as Sprite; sp.graphics.clear(); sp.graphics.beginFill(0xff0000,0.5); sp.graphics.drawRect(0,0,gridWH,gridWH); sprMap.addChild(sp ); this.addChild(sprMap); } function changZA(za:String){ for (var i=0;i<gridArr.length;i++){ if (gridArr[i].name==za){ gridArr[i].isZhangAi=true ; trace("hongqianjin"+gridArr[i].name); } } } function getFormatNum(num:int){ if (num<10){ return "0"+num ; }else{ return num ; } } function testInof(){ for (var i=0;i<gridArr.length;i++){ var info:String=""; info += gridArr[i].name +"[" ; for (var m=0;m<gridArr[i].subGrid.length;m++ ){ info += gridArr[i].subGrid[m]+"," ; } info+="]" trace(info) ; } } } } //程序運行,點擊障礙區報錯
49.位圖數據與像素
(1)Bitmap位圖對象,顯示對象,實際位圖在載入後自動把位圖數據填充到這個對象中了,它就是載入完後的內容,即LoaderInfo.contant;
(2)BitmapData位圖數據:就是位圖自己的內容,也就是Bitmap對象的填充物,它不是顯示對象,依靠Bitmap來顯示。
(3)多個Bitmap位圖對象共享一個BitmapData對象,而不會由於每一個顯示對象實例使用一個BitmpaData對象而產生內存開銷,也就是使用效率高。
(4)像素:就是位圖圖像中最小顏色點,多個同顏色的像素挨在一塊兒就是色塊,不顏色的像素就組成了彩色的位圖。對位圖的操做本源就是對像素的操做,而這些像素信息就存放在BitmapData數據中。因此在這個對象中有不少像素級的操做,好比精確的碰撞。
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.PixelSnapping; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; public class lesson28 extends Sprite { var dm:Bitmap; var bmd:BitmapData ; public function lesson28() { // var bmd:BitmapData=new BitmapData(200,200,true,0xffff000); // var bm:Bitmap=new Bitmap(bmd,PixelSnapping.AUTO,true); // this.addChild(bm); var req:URLRequest=new URLRequest("image/scan/bg3.jpg"); var lod:Loader=new Loader(); lod.load(req); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var lodin:LoaderInfo=e.target as LoaderInfo; dm=lodin.content as Bitmap; bmd=dm.bitmapData ; getMapInfo(); }); function getMapInfo(){ // trace(bmd.getPixel(10,10).toString(16)); // trace(bmd.getPixel32(100,100).toString(16)); bmd.setPixel(10,10,0x000000); bmd.setPixel(11,14,0x000000); bmd.setPixel(11,13,0x000000); bmd.setPixel(11,12,0x000000); bmd.setPixel(10,11,0x000000); for(var i=0;i<400;i++){ for(var m=0;m<400;m++){ bmd.setPixel32(i,m+100, bmd.getPixel(i,m)); } } stage.addChild(dm); var bm1:Bitmap=new Bitmap(bmd,PixelSnapping.AUTO,true); bm1.scaleX=0.2; bm1.scaleY=0.2; stage.addChild(bm1); var bm2:Bitmap=new Bitmap(bmd,PixelSnapping.AUTO,true); bm2.scaleX=0.2; bm2.scaleY=0.2; bm2.x=230; stage.addChild(bm2); } } } }
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.net.URLRequest; import flash.utils.Timer; public class lesson28b extends Sprite { var bmd:BitmapData; public function lesson28b() { init(); } function init(){ var req:URLRequest=new URLRequest("image/scan/bg3.jpg"); var lod:Loader=new Loader(); lod.load(req); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var ld:LoaderInfo=e.target as LoaderInfo; ld.content.width=800; ld.content.height=380; }); this.addChild(lod); var req:URLRequest=new URLRequest("image/other/meinv.png"); var lod:Loader=new Loader(); lod.load(req); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var ld:LoaderInfo=e.target as LoaderInfo; var bm:Bitmap=ld.content as Bitmap; bmd=bm.bitmapData; renwu(); }); } function renwu(){ var bm0:Bitmap=new Bitmap(bmd); bm0.x=150; stage.addChild(bm0); var bmd1:BitmapData=new BitmapData(bm0.width,bm0.height,true,0xaa000000); var bm1:Bitmap=new Bitmap(bmd1); bm1.x=bm0.x+150; stage.addChild(bm1); var sp:Sprite=new Sprite(); sp.addChild(bm0); stage.addChild(sp); sp.addEventListener(MouseEvent.CLICK,function(){ var i=0; var tim:Timer=new Timer(10,bmd.width); tim.start(); tim.addEventListener(TimerEvent.TIMER,function(){ for(var m=0;m<bmd.width;m++){ var cor:uint=bmd.getPixel32(i,m); bmd1.setPixel32(i+Math.random()*3,m+Math.random()*5,cor); } i++; }); }); } } }
50.像素級碰撞
(1)AS3概括起來有四種碰撞測試:
(I)對象級碰撞:這個最簡單方便,但很簡單。好比對象邊緣還有很大空白時,也發生碰撞。因此適合較小的(水滴,小石塊等),或者很規則的圖形(矩形,方形)而且邊緣沒空白的圖形等。
(II)對象與點的碰撞:這個適合於對象與某點碰撞,好比與鼠標發生碰撞。或者很小的對象發生碰撞,能夠近似成點。另外這個適合於矢量圖的碰撞,不適合位圖的碰撞。
(III)像素級碰撞:這個最準確的碰撞了,特別適合位圖,和不規則圖形的碰撞。
(IV)第四種:一般經過判斷x,y座標是否與另外一個對象的x,y座標加上高度後的範圍重疊來判斷碰撞。以上三種碰撞就是第四種的簡化版。
package td { import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Shader; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; import tc.bg3; public class lesson29 extends Sprite { public function lesson29() { var bg:tc.bg3=new bg3(); bg.x=100; bg.y=100; stage.addChild(bg); var sp:Sprite=new Sprite(); sp.graphics.lineStyle(2,0xff0000,1); sp.graphics.drawCircle(0,0,50); stage.addChild(sp); var sp1:Sprite=new Sprite(); sp1.graphics.lineStyle(2,0xff0000,1); sp1.graphics.drawCircle(0,0,5); sp1.x=300; sp1.y=20; stage.addChild(sp1); var req:URLRequest = new URLRequest("image/other/hua1.png"); var lod:Loader = new Loader(); lod.load( req ); stage.addChild(lod); var req1:URLRequest = new URLRequest("image/other/hua2.png"); var lod1:Loader = new Loader(); lod1.load( req1 ); lod1.x=400; stage.addChild(lod1); stage.addEventListener(Event.ENTER_FRAME,histest); function histest(){ // lod.x+=5; // if(lod.hitTestObject(lod1)){ // stage.removeEventListener(Event.ENTER_FRAME,histest); // } // if(lod.hitTestPoint(mouseX,mouseY,true)){ // stage.removeEventListener(Event.ENTER_FRAME,histest); // } sp.x+=1; sp1.x-=2; if(sp.hitTestPoint(sp1.x,sp1.y,true)){ stage.removeEventListener(Event.ENTER_FRAME,histest); } } } } }
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import flash.net.URLRequest; import tc.bg3; public class lesson29a extends Sprite { var bm1:Bitmap; var bmd1:BitmapData; var bm2:Bitmap; var bmd2:BitmapData ; public function lesson29a() { var bg:tc.bg3=new bg3(); stage.addChild(bg); var req:URLRequest = new URLRequest("image/other/hua1.png"); var lod:Loader = new Loader(); lod.load( req ); lod.x=0; lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var lodin:LoaderInfo=e.target as LoaderInfo; bm1=lodin.content as Bitmap; bmd1=bm1.bitmapData; stage.addChild(bm1); }); var req1:URLRequest = new URLRequest("image/other/hua2.png"); var lod1:Loader = new Loader(); lod1.load( req1 ); lod1.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var lodin:LoaderInfo=e.target as LoaderInfo; bm2=lodin.content as Bitmap; bm2.x=300; bm2.y+=100; bmd2=bm2.bitmapData; stage.addChild( bm2 ); }); stage.addEventListener(Event.ENTER_FRAME,histest); function histest(){ if(bm1!=null&&bm2!=null){ bm1.x+=1; bm2.x-=5; trace(bm1); // var p1:Point=new Point(bm1.x,bm1.y); var p2:Point=new Point(bm2.x,bm2.y); if(bmd1.hitTest(p1,0xff,bmd2,p2,0xbb)){//像素級碰撞 stage.removeEventListener(Event.ENTER_FRAME,histest); } } } } } }
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import flash.net.URLRequest; import tc.bg3; public class lesson29b extends Sprite { var renwu:Bitmap; var renwuDa:BitmapData; public function lesson29b() { init(); creatOneHua("hua1.png"); creatOneHua("hua2.png"); creatOneHua("hua3.png"); creatOneHua("hua4.png"); creatOneHua("hua1.png"); creatOneRenwu(); } public function init(){ var bg:tc.bg3=new bg3(); bg.x=150; bg.y=180; bg.height=400; stage.addChild(bg); } function creatOneHua(huanName:String){ var req:URLRequest = new URLRequest("image/other/"+huanName); var lod:Loader = new Loader(); lod.load( req ); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var ld:LoaderInfo=e.target as LoaderInfo; var bm:Bitmap=ld.content as Bitmap; bm.x=Math.random()*1000-200; bm.y=Math.random()*500; bm.scaleX=0.5; bm.scaleY=0.5; var bmd:BitmapData=bm.bitmapData; stage.addChild(bm); bm.addEventListener(Event.ENTER_FRAME,funcHitTest); }); } function funcHitTest(e:Event){ var bm:Bitmap=e.currentTarget as Bitmap; var bmd:BitmapData=bm.bitmapData; if(renwu!=null) { var pos1:Point=new Point(bm.x,bm.y); var pos2:Point=new Point(renwu.x,renwu.y); if(bmd.hitTest(pos1,0xff,renwuDa,pos2,0xff)) { bm.y+=5; } } } function creatOneRenwu(){ var req:URLRequest = new URLRequest("image/other/meinv2.png"); var lod:Loader = new Loader(); lod.load( req ); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var ld:LoaderInfo=e.target as LoaderInfo; renwu=ld.content as Bitmap; renwuDa=renwu.bitmapData; renwu.x=200; stage.addChild(renwu); renwu.addEventListener(Event.ENTER_FRAME,function(){ renwu.x+=-5; if(renwu.x<=-10){ renwu.x=500; } }); }); } } }
51.簡單濾鏡
(1)濾鏡:給位圖或顯示對象添加效果:好比模糊,陰影,顏色變化等。注意能夠爲各類顯示對象添加濾鏡,不僅是位圖。實際上顯示對象應用濾鏡後都會緩存成位圖。
(2)簡單濾鏡:
(I)模糊濾鏡(BlurFilter類)
(II)投影濾鏡(DropShadowFiter類)
(III)發光濾鏡(GlowFilter類)
(IV)漸變發光濾鏡(GradientGlowFilter類)
(V)斜角濾鏡(BevelFilter類)
(VI)漸變斜角濾鏡(GradientBevelFilter類)
(3)濾鏡組合使用:都放到同一個數組中
(4)多個顯示對象都放到一個顯示對象中,能夠同時添加濾鏡。
package td { import flash.display.Sprite; import flash.filters.BevelFilter; import flash.filters.BitmapFilterQuality; import flash.filters.BitmapFilterType; import flash.filters.BlurFilter; import flash.filters.DropShadowFilter; import flash.filters.GlowFilter; import flash.filters.GradientGlowFilter; import tc.bg3; public class lesson30 extends Sprite { public function lesson30() { var bg:tc.bg3 = new bg3(); bg.x=150; bg.y=180; bg.height=400; stage.addChild( bg ); var spMorm:Sprite=new Sprite(); stage.addChild(spMorm); var sp:Sprite=new Sprite(); sp.graphics.beginFill(0xff0000,1); sp.graphics.drawCircle(200,150,50); sp.graphics.endFill(); sp.x=-100; spMorm.addChild(sp); var sp1:Sprite=new Sprite(); sp1.graphics.beginFill(0xff0000,1); sp1.graphics.drawCircle(200,150,50); sp1.graphics.endFill(); sp1.x=150; spMorm.addChild(sp1); var filArr:Array=new Array(); // var bl:BlurFilter=new BlurFilter(10,10,1); // bl.blurY=50; // bl.blurY=50; // bl.quality=BitmapFilterQuality.LOW; // var bl:DropShadowFilter=new DropShadowFilter(); // bl.distance=50; // bl.angle=0; // bl.strength=1; // bl.alpha=0.5; // bl.blurX=5; // bl.blurY=15; // bl.color=0xffff00; // bl.hideObject=true; // bl.knockout=true; // bl.inner=true; var bl1:GlowFilter=new GlowFilter(); bl1.alpha=1; bl1.blurX=105; bl1.blurY=105; bl1.color=0xffff00; var bl:BevelFilter=new BevelFilter(); bl.distance=10; bl.angle=45; bl.highlightColor=0xffffff; bl.highlightAlpha=1; bl.shadowAlpha=0.5; bl.shadowAlpha=0.5; bl.blurX=10; bl.blurY=10; filArr.push(bl); filArr.push(bl1); spMorm.filters=filArr; } } }
package td { import flash.display.Sprite; import flash.filters.BitmapFilterType; import flash.filters.GradientBevelFilter; import flash.filters.GradientGlowFilter; import tc.bg3; public class lesson30a extends Sprite { public function lesson30a() { var bg:tc.bg3 = new bg3(); bg.x=150; bg.y=180; bg.height=400; stage.addChild( bg ); var sp:Sprite = new Sprite(); sp.graphics.beginFill(0xff0000,1); sp.graphics.drawCircle(200,150,50); sp.graphics.endFill() ; stage.addChild( sp ) ; var filArr:Array=new Array(); // var bl:GradientGlowFilter=new GradientGlowFilter(); // bl.colors=[0xff0000,0x00ff00,0x0000ff,0xffffff]; // bl.alphas=[0,1,1,1]; // bl.ratios=[0,100,200,255]; // bl.distance=10; // bl.type=BitmapFilterType.OUTER; // bl.blurX=10; // bl.blurY=10; // bl.knockout=true; var bl:GradientBevelFilter=new GradientBevelFilter(); bl.colors=[0xffffff,0xffffff,0xffff00,0x00ff00]; bl.alphas=[1,0,1,1]; bl.ratios=[0,100,200,255]; bl.distance=10; bl.type=BitmapFilterType.INNER; bl.blurX=10; bl.blurY=10; filArr.push(bl); sp.filters=filArr; } } }
package td { import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.BlurFilter; import flash.net.URLRequest; public class lesson30b extends Sprite { public function lesson30b() { init(); } function init(){ creatBitmap("image/scan/bg2.jpg",0,50); creatBitmap("image/scan/bg3.jpg",210,50); creatBitmap("image/other/tree1.png",0,160); creatBitmap("image/other/tree2.png",210,160); } function creatBitmap(bmName:String,x:int,y:int){ var req:URLRequest = new URLRequest(bmName); var lod:Loader=new Loader(); lod.load( req ); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var lodinof:LoaderInfo=e.target as LoaderInfo; lodinof.content.width=200; lodinof.content.height=100; lod.x=x; lod.y=y; stage.addChild( lod ); var fi:BlurFilter=new BlurFilter(5,5,1); lod.filters=[fi]; lod.addEventListener(MouseEvent.MOUSE_MOVE,function(e:Event){ var lod1:Loader=e.currentTarget as Loader; var fll:BlurFilter=lod1.filters[0]; fll.blurX=0; fll.blurY=0; lod1.filters=[fll]; }); lod.addEventListener(MouseEvent.MOUSE_OUT,function(e:Event){ var lod1:Loader=e.currentTarget as Loader; var fll:BlurFilter=lod1.filters[0]; fll.blurX=5; fll.blurY=5; lod1.filters=[fll]; }); }); } } }
(5置換圖濾鏡(DisplacementMapFilter類):用源位圖的位圖數據來置換目標位圖數據,即讓目標圖像上的像素離開各自原始位置必定距離。此濾鏡可用於產生位移、扭曲或斑點效果。進一步解釋就是,須要有一個灰度圖像(也能夠是RBG或RGBA圖像中的一個顏色或alpha通道)做爲置換的源圖,並基於這個原圖的像素對另一個圖像進行扭曲。源圖像中比較亮的像素,目標圖像中對應位置的像素向左上角移動。較暗的像素向右下角移動,中間部分不移動。
(6)源圖像的矩形漸變以及如何把多個漸變合成爲一個位圖。
(I)方式一:用矢量繪製的方式,繪製兩個漸變。用拷貝像素的方式合成,如用、copyChannel()和draw()。
(II)方式二:用PhotoShop等工具繪製一個漸變的圖像,推薦。
注意事項:若是是個園位圖背景必須是灰色的。由於灰色部分不平移像素。
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.Loader; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.filters.DisplacementMapFilter; import flash.geom.Point; import flash.geom.Rectangle; import flash.net.URLRequest; public class lesson33b extends Sprite { public function lesson33b() { init(); } function init(){ var bmds:BitmapData; var req:URLRequest = new URLRequest("image/other/地圖新.jpg"); var lod:Loader=new Loader(); lod.load( req ); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(){ var bm:Bitmap = lod.content as Bitmap; bmds=bm.bitmapData ; }); //stage.addChild( lod ); var sp:Shape = new Shape(); sp.graphics.beginFill(0xff0000,1); sp.graphics.drawCircle(0,0,100); sp.graphics.endFill(); sp.x=300; sp.y=150; var spr:Sprite = new Sprite(); var bmd:BitmapData = new BitmapData(400,200,false,0xff000000); var bm:Bitmap = new Bitmap(bmd) ; bm.x=100; bm.y=50; spr.addChild( bm ); stage.addChild( spr ); spr.mask = sp ; //stage.addChild( sp ); var bmdQiuti:BitmapData ; var req1:URLRequest = new URLRequest("image/other/球體位圖.png"); var lod1:Loader=new Loader(); lod1.load( req1 ); lod1.contentLoaderInfo.addEventListener(Event.COMPLETE,function(){ var bm:Bitmap = lod1.content as Bitmap; bmdQiuti=bm.bitmapData ; //stage.addChild( bm ); }); var df:DisplacementMapFilter=new DisplacementMapFilter(); df.componentX = BitmapDataChannel.RED; df.scaleX = 200; df.mapPoint=new Point(100,0); var rec:Rectangle=new Rectangle(0,0,400,200); var po:Point=new Point(0,0); stage.addEventListener(Event.ENTER_FRAME,function(){ if (lod.content != null && lod1.content != null){ bmd.copyPixels(bmds,rec,po); rec.x ++ ; if (rec.x >= lod.x + lod.width - rec.width ){ rec.x=0; } //--添加濾鏡 df.mapBitmap = bmdQiuti; bm.filters=[ df ]; } }); } } }
52.位圖數據複製
(1)位圖數據複製有多種方式(克隆,拷貝像素,通道複製,繪製圖像draw)。
(II)copyPixels()方法是一種將所有或部分像素從一個BitmapData對象複製到另外一個上。複製時源圖像上可定義複製區域,而後複製到目標圖像上某個區域。好比大頭貼,切圖,圖像分割等。
(III)繪製圖像(draw):就是將源sprite、影片剪輯、視頻或其餘顯示對象中的圖形內容繪製或呈如今新位圖上。這個就很強悍了。如之前作的動畫,視頻,尤爲是矢量圖均可以變成位圖來處理。好比:用像素的方式來繪製個圓就麻煩點,而用矢量的方式畫個圖形而後轉變成位圖就方便多了。
(IV)圖像截取
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.PixelSnapping; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.geom.Rectangle; import flash.net.URLRequest; import tc.bg3; public class lesson32 extends Sprite { var bmdS:BitmapData; var sprS:Sprite = new Sprite(); var spS:Sprite = new Sprite; var bmdTarget:BitmapData =new BitmapData(100,100,true,0xff80ff0000); public function lesson32() { bg(); } function bg(){ var bg:tc.bg3 = new bg3(); bg.x=150; bg.y=180; bg.height=400; stage.addChild( bg ); spS.graphics.lineStyle(1,0x0000000,1); spS.graphics.drawRect(0,0,100,100); spS.x=100; spS.y=10; var req:URLRequest = new URLRequest("image/other/meinv.png"); var lod:Loader=new Loader(); lod.load( req ); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var lodinof:LoaderInfo=e.target as LoaderInfo; var bm:Bitmap=lodinof.content as Bitmap; bmdS=bm.bitmapData; sprS.addChild(bm); sprS.addChild(spS); stage.addChild(sprS); sprS.doubleClickEnabled=true;//啓用雙擊事件 sprS.addEventListener(MouseEvent.DOUBLE_CLICK,function(){ var rec:Rectangle=new Rectangle(spS.x,spS.y,spS.width,spS.height); var po:Point=new Point(0,0); bmdTarget.copyPixels(bmdS,rec,po); }); sprS.addEventListener(MouseEvent.MOUSE_DOWN,function(){ spS.startDrag(); }); sprS.addEventListener(MouseEvent.MOUSE_UP,function(){ spS.stopDrag(); }); }); var bmTarget:Bitmap=new Bitmap(bmdTarget); bmTarget.x=300; bmTarget.smoothing=true; bmTarget.pixelSnapping=PixelSnapping.ALWAYS; stage.addChild(bmTarget); var bmTarget2:Bitmap=new Bitmap(bmdTarget); bmTarget2.smoothing=true; bmTarget2.pixelSnapping=PixelSnapping.ALWAYS; bmTarget2.x=300; bmTarget2.y=bmTarget.y+bmTarget.height+100; bmTarget2.height=150; bmTarget2.width=150; stage.addChild(bmTarget2); } } }
(V)拼圖遊戲
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.geom.Rectangle; import flash.net.URLRequest; public class lesson32a extends Sprite { var bmdS:BitmapData; var gridX:int=3; var gridY:int=3; var targArr:Array=new Array(); public function lesson32a() { cutImage(); } function cutImage(){ var req:URLRequest = new URLRequest("image/other/hehua.png"); var lod:Loader=new Loader(); lod.load( req ); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var lodinof:LoaderInfo=e.target as LoaderInfo; var bm:Bitmap = lodinof.content as Bitmap; bmdS=bm.bitmapData ; var gridW:int=bmdS.width/gridX; var gridH:int=bmdS.height/gridY; var po:Point=new Point(0,0); for(var i=0;i<gridX;i++){ for(var m=0;m<gridY;m++){ var gridBmdS:BitmapData=new BitmapData(gridW,gridH,false,0xffffff); var rec:Rectangle=new Rectangle(i*gridW,m*gridH,gridW,gridH); gridBmdS.copyPixels(bmdS,rec,po); //目標區域-- var bmS:Bitmap=new Bitmap(gridBmdS); var spr:Sprite=new Sprite(); spr.addChild(bmS); spr.alpha=0.1; spr.name="s"+i+m; spr.x=i*gridW; spr.y=m*gridH; stage.addChild(spr); targArr.push(spr); //拖地區域 var bmT:Bitmap=new Bitmap(gridBmdS); var sprT:Sprite=new Sprite(); sprT.addChild(bmT); stage.addChild(sprT); sprT.name="s"+i+m; sprT.x=i*gridW+150*Math.random(); sprT.y=m*gridH+150*Math.random(); sprT.addEventListener(MouseEvent.MOUSE_DOWN,moveFun); sprT.addEventListener(MouseEvent.MOUSE_UP,stopFun); } } }); } function moveFun(e:Event){ var spr:Sprite=e.target as Sprite; stage.setChildIndex(spr,stage.numChildren-1); spr.addEventListener(Event.ENTER_FRAME,checkHit); spr.startDrag(); function checkHit(){ for(var i=0;i<targArr.length;i++){ if(spr.name==targArr[i].name&&spr.x>=targArr[i].x-10&&spr.x<=targArr[i].x+10&&spr.y>=targArr[i].y-10&&spr.y<=targArr[i].y+10){ spr.stopDrag(); spr.x=targArr[i].x; spr.y=targArr[i].y; spr.removeEventListener(Event.ENTER_FRAME,checkHit); break; } } } } function stopFun(e:Event){ var spr:Sprite=e.target as Sprite; spr.stopDrag(); } } }
(VI)視頻截圖
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.MouseEvent; import fl.video.FLVPlayback; import tc.huanBan; public class lesson32b extends Sprite { public function lesson32b() { var flv:FLVPlayback=new FLVPlayback(); flv.source="music/美麗的神話.mp4"; stage.addChild(flv); var hua:tc.huanBan=new huanBan(); hua.width=100; hua.height=50; hua.stop(); hua.x=flv.x+flv.width+20; stage.addChild(hua); var spr:Sprite=new Sprite(); spr.y=flv.y+flv.height+100; stage.addChild(spr); hua.addEventListener(MouseEvent.CLICK,function(){ var bmd:BitmapData=new BitmapData(flv.width,flv.height,false,0xffffffff); bmd.draw(flv); var bm:Bitmap=new Bitmap(bmd); bm.width=200; bm.height=200; if(spr.numChildren>2){ spr.removeChildAt(0); for(var i=0;i<spr.numChildren;i++){ spr.getChildAt(i).x=spr.getChildAt(i).x-bm.width; } } if(spr.numChildren==0){ bm.x=0; bm.y=0; }else{ bm.x=spr.getChildAt(spr.numChildren-1).x+bm.width; //bm.y=spr.getChildAt(spr.numChildren-1).y+bm.height } spr.addChild(bm); }); } } }
53.柏林噪聲
(1)perlinNoise();此方法對位圖圖像的指定區域中的像素應用隨機顏色值。經過顏色的隨機分佈可生產逼真、有機的紋理。如:煙霧,雲彩,水,火或爆炸等圖案。
(2)注意與其餘濾鏡搭配使用:如顏色矩陣濾鏡(ColorMatrixFilter類),置換圖濾鏡(DisplacementMapFilter類),與可與混合模式等。
(3)
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Transform; public class lesson34 extends Sprite { public function lesson34() { var bmd:BitmapData = new BitmapData(300,300,false,0xff000000); var bm:Bitmap = new Bitmap(bmd); stage.addChild( bm ); var channl:uint = BitmapDataChannel.RED ; var po1:Point=new Point(0,0); var po2:Point=new Point(0,0); var po3:Point = new Point(0,0); /* var bm1:Bitmap = new Bitmap(bmd); stage.addChild( bm1 ); bm.x=300; */ stage.addEventListener(Event.ENTER_FRAME,function(){ po1.x += 5; po2.x += -5; po3.y += 5; bmd.perlinNoise(300,300,3,50,true,true,channl,false,[po1,po2,po3]); }); } } }
(4)雲
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.BlendMode; import flash.display.GradientType; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix; import flash.geom.Point; public class lesson34a extends Sprite { public function lesson34a() { skyFun(); } function skyFun(){ var sp:Shape = new Shape(); var max:Matrix = new Matrix(); max.createGradientBox(600,300,Math.PI/2,0,0); sp.graphics.beginGradientFill(GradientType.LINEAR,[0x3333ff,0xeeeeee],[1,1],[0,255],max ); sp.graphics.drawRect(0,0,1000,400); sp.graphics.endFill(); sp.x=-200; addChild( sp ); var bmdSky:BitmapData = new BitmapData(1000,400,false,0x00000000); var bmSky:Bitmap = new Bitmap(bmdSky); addChild( bmSky ); bmSky.x=-200; bmSky.blendMode=BlendMode.OVERLAY; var po1:Point=new Point(0,0); var po2:Point=new Point(0,0); var po3:Point=new Point(0,0); var po4:Point=new Point(0,0); var po5:Point=new Point(0,0); var po6:Point=new Point(0,0); addEventListener(Event.ENTER_FRAME,function(){ po1.x += 2 ; po2.x += 3 ; po3.x += 2 ; po4.x += 1 ; po5.x += 2 ; po6.x += 3 ; bmdSky.perlinNoise(200,100,6,60,true,true,BitmapDataChannel.RED,true,[po1,po2,po3,po4,po5,po6]); }); } } }
(5)流水
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.filters.DisplacementMapFilter; import flash.filters.DisplacementMapFilterMode; import flash.geom.Point; import flash.net.URLRequest; public class lesson34b extends Sprite { var w:int=100; var h:int=100; var bmd:BitmapData ; var lod:Loader=new Loader(); var df:DisplacementMapFilter=new DisplacementMapFilter(); public function lesson34b() { gb(); } function gb(){ var req:URLRequest = new URLRequest("image/scan/bg3.jpg"); lod.load( req ); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(){ lod.content.height=400; w=lod.content.width; h=lod.content.height; bmd=new BitmapData(w,h,false,0xffffff); waterFun(); }); addChild( lod ); lod.x=-180; } function waterFun(){ //var bm:Bitmap=new Bitmap(bmd); //stage.addChild(bm); bmd.perlinNoise(w/10,h/2,3,60,true,false,BitmapDataChannel.RED,false,null); bgWaterFun(); } function bgWaterFun(){ df.mapBitmap=bmd; df.componentX=BitmapDataChannel.RED; df.componentY=BitmapDataChannel.RED; df.scaleX=100; df.scaleY=90; df.mapPoint=new Point(0,0); df.mode=DisplacementMapFilterMode.IGNORE; //df.color=0xff0000; //df.alpha=1; lod.filters=[df]; stageMove(); } function stageMove(){ var po1:Point=new Point(0,0); var po2:Point=new Point(0,0); var po3:Point=new Point(0,0); stage.addEventListener(Event.ENTER_FRAME,function(){ po1.x+=-1; po2.x+=-2; po3.x+=3; bmd.perlinNoise(w/10,h/2,3,60,true,false,BitmapDataChannel.RED,false,[po1,po2,po3]); df.mapBitmap=bmd; lod.filters=[df]; }); } } }
(6)火
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.BlendMode; import flash.display.GradientType; import flash.display.Loader; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.filters.DisplacementMapFilter; import flash.filters.DisplacementMapFilterMode; import flash.geom.Matrix; import flash.geom.Point; import flash.net.URLRequest; import flash.utils.Timer; import flash.utils.setInterval; public class lesson34c extends Sprite { public function lesson34c() { init(); } function init(){ var sp:Shape=new Shape(); var max:Matrix=new Matrix(); max.createGradientBox(300,400,-Math.PI/2,0,0); sp.graphics.beginGradientFill(GradientType.LINEAR,[0xffff00,0xff0000,0x000000],[1,1,1],[0,150,255],max); sp.graphics.drawRect(0,0,300,400); sp.graphics.endFill(); stage.addChild(sp); var bmd:BitmapData=new BitmapData(300,400,false,0x00000000); // var bm:Bitmap=new Bitmap(bmd) // stage.addChild(bm); bmd.perlinNoise(50,200,6,50,true,true,BitmapDataChannel.RED,false,null); var df:DisplacementMapFilter=new DisplacementMapFilter(); df.mapBitmap=bmd; df.componentX=BitmapDataChannel.RED; df.componentY=BitmapDataChannel.RED; df.scaleX=10; df.scaleY=200; df.mapPoint=new Point(0,0); df.mode=DisplacementMapFilterMode.IGNORE; sp.filters=[df]; var po1:Point=new Point(0,0); var po2:Point=new Point(0,0); var po3:Point=new Point(0,0); var po4:Point=new Point(0,0); var po5:Point=new Point(0,0); var po6:Point=new Point(0,0); stage.addEventListener(Event.ENTER_FRAME,function(){ po1.y+=1; po2.y+=2; po3.y+=3; po4.y+=4; po5.y+=5; po6.x+=-1; bmd.perlinNoise(50,200,6,50,true,true,BitmapDataChannel.RED,false,[po1,po2,po3,po4,po5,po6]); sp.filters=[df]; }); } } }
54.補間動畫
(1)tween類(補間動畫):是指使用代碼,在必定時間或幀內移動一個對象或者改變一個對象的屬性。
(2)補間的含義:所謂補間就是根據先後兩個關鍵幀來自動計算中間過渡畫面。補間的幀數和時間長度是徹底可控的,可是在處理複雜運動時,效果不理想,一般須要大量手動修改。
(3)tween類與ENTER_FRAME區別於聯繫:本質上是同樣的,都是基於幀的,只是這個補間類中預先定義了常見的運動方式,好比減速減速,彈性運動等。一些簡單,常見的,局部的動畫可考慮使用tween類動畫,而靈活度高的,負責大局的動畫仍是用EVENT_FRAME 這個類與setInterval,Timer,同樣是作動畫的另外一種方式。
(4)flash自己自帶的tween類並很差用,可參考第三方引擎,好比Tweener,tweenlite等效果更佳一點。
(5)tween的引用:在flash cc中能夠直接引用,但在flash builder中須要構建路徑,添加引用。引用地址:(flash cc安裝目錄)\Common\Configuration\ActionScript3.0\libs\flash.swc
(6)
package td { import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; import fl.transitions.Tween; import fl.transitions.TweenEvent; import tc.huanBan; public class lesson35 extends Sprite { public function lesson35() { var hua:huanBan=new huanBan(); hua.stop(); stage.addChild(hua); var tw:Tween=new Tween(hua,"x",null,0,stage.stageWidth,100,false); tw.change=200; tw.FPS=100; // tw.looping=true; // var ty:Tween=new Tween(hua,"y",null,0,stage.stageHeight,50,false); // ty.looping=true; // var ta:Tween=new Tween(hua,"alpha",null,0,1,50,false); var txStop:TextField=new TextField(); txStop.text="中止"; txStop.x=txStop.x+50; stage.addChild(txStop); txStop.addEventListener(MouseEvent.CLICK,function(){ tw.stop(); }); var txResum:TextField=new TextField(); txResum.text="播放"; txResum.x=txStop.x+50; stage.addChild(txResum); txResum.addEventListener(MouseEvent.CLICK,function(){ tw.resume(); }); var txPlay:TextField=new TextField(); txPlay.text="重播"; txPlay.x=txResum.x+50; stage.addChild(txPlay); txPlay.addEventListener(MouseEvent.CLICK,function(){ tw.start(); }); var txNext:TextField=new TextField(); txNext.text="下一幀"; txNext.x=txPlay.x+50; stage.addChild(txNext); txNext.addEventListener(MouseEvent.CLICK,function(){ tw.nextFrame(); }); var txPre:TextField=new TextField(); txPre.text="上一幀"; txPre.x=txNext.x+50; stage.addChild(txPre); txPre.addEventListener(MouseEvent.CLICK,function(){ tw.prevFrame(); }); var txPre:TextField=new TextField(); txPre.text="上一幀"; txPre.x=txNext.x+50; stage.addChild(txPre); txPre.addEventListener(MouseEvent.CLICK,function(){ tw.prevFrame(); }); var txEnd:TextField=new TextField(); txEnd.text="末端"; txEnd.x=txPre.x+50; stage.addChild(txEnd); txEnd.addEventListener(MouseEvent.CLICK,function(){ tw.fforward(); }); var txBack:TextField=new TextField(); txBack.text="倒着走"; txBack.x=txEnd.x+50; stage.addChild(txBack); txBack.addEventListener(MouseEvent.CLICK,function(){ tw.yoyo(); }); tw.addEventListener(TweenEvent.MOTION_CHANGE,function(){ trace(tw.position); }); tw.addEventListener(TweenEvent.MOTION_FINISH,function(){ //tw.yoyo(); var ty:Tween=new Tween(hua,"y",null,0,stage.stageHeight,50,false) }); } } }
package td { import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.ColorMatrixFilter; import flash.net.URLRequest; import flash.sensors.Accelerometer; import fl.transitions.Tween; public class lesson35a extends Sprite { var isClick:Boolean = false; var orsArr=new Array( 1,0,0,0,-50, 0,1,0,0,-50, 0,0,1,0,-50, 0,0,0,1,0 ); var newArr=new Array( 1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,1,0 ); public function lesson35a() { init(); } function init(){ creatBitmap("image/scan/bg2.jpg",0,50); creatBitmap("image/scan/bg3.jpg",210,50); creatBitmap("image/scan/bg4.jpg",0,160); creatBitmap("image/scan/bg5.jpg",210,160); } function creatBitmap(bmName:String,x:int,y:int){ var req:URLRequest = new URLRequest(bmName); var lod:Loader=new Loader(); lod.load( req ); //------------ var tx:Tween = new Tween(lod,"x",null,x,x,10,false); var ty:Tween = new Tween(lod,"y",null,y,y,10,false); var txS:Tween=new Tween(lod,"scaleX",null,1,1,10,false); var tyS:Tween=new Tween(lod,"scaleY",null,1,1,10,false); var isClick:Boolean = false; lod.addEventListener(MouseEvent.CLICK,function(e:Event){ stage.setChildIndex(lod,stage.numChildren-1); if (isClick == false){ tx.continueTo(0,10); ty.continueTo(0,10); txS.continueTo(2,10); tyS.continueTo(2,10); isClick = true ; }else{ tx.yoyo(); ty.yoyo(); txS.yoyo(); tyS.yoyo(); } }); //----- var cf:ColorMatrixFilter = new ColorMatrixFilter(); cf.matrix = orsArr; lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){ var lodinof:LoaderInfo=e.target as LoaderInfo; lodinof.content.width=200; lodinof.content.height=100; lod.x=x; lod.y=y; stage.addChild( lod ); lod.filters=[cf] ; }); lod.addEventListener(MouseEvent.MOUSE_OVER,function(e:Event){ var lod1:Loader = e.currentTarget as Loader ; var cf:ColorMatrixFilter = lod1.filters[0] ; cf.matrix = newArr; lod1.filters=[cf] ; }); lod.addEventListener(MouseEvent.MOUSE_OUT,function(e:Event){ var lod1:Loader = e.currentTarget as Loader ; var cf:ColorMatrixFilter = lod1.filters[0] ; cf.matrix = orsArr; lod1.filters=[cf] ; }); } } }
package td { import flash.display.Sprite; import fl.transitions.Tween; import tc.jianzhi; public class lesson35b extends Sprite { public function lesson35b() { watch(); } function watch(){ var miao:tc.jianzhi = new jianzhi(); miao.scaleX=0.2; miao.scaleY=0.2; var spMiao:Sprite = new Sprite(); miao.x=miao.width/2; miao.y=miao.height/2;// spMiao.addChild( miao ); spMiao.x=stage.stageWidth/2; spMiao.y=stage.stageHeight/2; stage.addChild(spMiao ) ; //spMiao.rotationZ var tzRo:Tween = new Tween(spMiao,"rotationZ",null,0,360,10,true); tzRo.looping=true; var fenZheng:tc.jianzhi = new jianzhi(); fenZheng.scaleX=0.15; fenZheng.scaleY=0.15; var sprFz:Sprite = new Sprite(); fenZheng.x=fenZheng.width/2; fenZheng.y=fenZheng.height/2; sprFz.addChild( fenZheng ); stage.addChild(sprFz); sprFz.x=stage.stageWidth/2; sprFz.y=stage.stageHeight/2; //sprFz.rotationZ var fzTw:Tween = new Tween(sprFz,"rotationZ",null,0,360,10*12,true); fzTw.looping=true; var shiZheng:tc.jianzhi = new jianzhi(); shiZheng.scaleX=0.1; shiZheng.scaleY=0.1; var sprSz:Sprite = new Sprite(); shiZheng.x=shiZheng.width/2; shiZheng.y=shiZheng.height/2; sprSz.addChild( shiZheng ); stage.addChild(sprSz); sprSz.x=stage.stageWidth/2; sprSz.y=stage.stageHeight/2; //sprFz.rotationZ var szTw:Tween = new Tween(sprSz,"rotationZ",null,0,360,10*12*12,true); szTw.looping = true; } } }
55.緩動
(1)緩動:只要不是勻速運動的均可歸爲緩動,能夠真實地模擬顯示生活中的運動現象。
(2)常見緩動類型:每一種類型都有三種狀況,就是隻影響開始初,結束處,兩端都影響。
(3)緩動不僅是來影響移動,包括大小,旋轉,顏色等,只要是可改變的屬性均可以使用。
(4)Regular線性加減速:如自由落體運動,汽車加減速等
(5)Strong 更強加減速度,以平方的關係加減。如高速運動物體與空氣的阻力,成平方關係。光線衰減也是平方關係。
(6)Elastic 彈簧緩動:如彈弓,彈性的繩子拉動物體,彈簧等。
(7)Bounce反彈:如皮球落地或撞牆。
(8)back:相似於彈簧,但兩端都不固定,至關於從中間彈起。
package td { import flash.display.Sprite; import fl.transitions.Tween; import fl.transitions.easing.Back; import fl.transitions.easing.Bounce; import fl.transitions.easing.Elastic; import fl.transitions.easing.None; import fl.transitions.easing.Regular; import fl.transitions.easing.Strong; import tc.huanBan; public class lesson36 extends Sprite { public function lesson36() { var huaS:huanBan = new huanBan(); huaS.scaleX=0.3; huaS.scaleY=0.3; huaS.stop(); huaS.x=0; huaS.y=100; stage.addChild( huaS ) ; var huaT:huanBan = new huanBan(); huaT.scaleX=0.1; huaT.scaleY=0.1; huaT.stop(); huaT.x=stage.stageWidth-100; huaT.y=100; stage.addChild( huaT ) ; // var eas:Function=fl.transitions.easing.Regular.easeOut; // var tw:Tween=new Tween(huaS,"x",eas,huaS.x,huaT.x,60,false); // var eas:Function = fl.transitions.easing.Back.easeInOut ; var tw:Tween = new Tween(huaS,"x",eas,huaS.x,huaT.x,100,false); } } }
package td { import flash.display.Sprite; import fl.transitions.Tween; import fl.transitions.easing.Bounce; import tc.zhujiao1; public class lesson36a extends Sprite { public function lesson36a() { tantiao(); } function tantiao(){ var zj:zhujiao1 = new zhujiao1(); zj.stop(); zj.x=0; stage.addChild( zj ); var tw:Tween=new Tween(zj,"y",Bounce.easeOut,zj.y,stage.stageHeight-zj.height,50,false); var tx:Tween=new Tween(zj,"x",Bounce.easeOut,zj.x,stage.stageWidth,150,false); } } }
下拉表
package td { import flash.display.Sprite; import flash.events.MouseEvent; import fl.transitions.Tween; import fl.transitions.easing.Bounce; import fl.transitions.easing.Elastic; import tc.bg1; import tc.bg2; import tc.bg3; import tc.huanBan; import tc.zhujiao1; public class lesson36b extends Sprite { var isClick:Boolean = false ; public function lesson36b() { caiduan(); } function caiduan(){ var cdSpr:Sprite = new Sprite(); var cd1:bg1 = new bg1(); cd1.height=50; cd1.width=100; cdSpr.addChild( cd1 ); var cd21:bg2 = new bg2(); cd21.height=50; cd21.width=100; cd21.y=cd1.y+cd1.height; cdSpr.addChild( cd21 ); var cd22:bg3 = new bg3(); cd22.height=50; cd22.width=100; cd22.y=cd21.y+cd21.height; cdSpr.addChild( cd22 ); // // var cd23:zhujiao1= new zhujiao1(); // cd23.height=50; // cd23.width=100; // cd23.y=cd22.y+cd22.height; // cdSpr.addChild( cd23 ); // cdSpr.y=100; stage.addChild(cdSpr); var tw:Tween=new Tween(cd21,"y",Bounce.easeOut,cd1.y,cd1.y,30,false); var tw2:Tween=new Tween(cd22,"y",Bounce.easeOut,cd1.y,cd1.y,30,false); cdSpr.setChildIndex(cd21,0); cdSpr.setChildIndex(cd22,0); var isClick:Boolean=false; cd1.addEventListener(MouseEvent.CLICK,function(){ if(isClick==false) { tw.continueTo(cd1.y+cd1.height,30); tw2.continueTo(cd1.y+cd1.height*2,30); isClick=true; }else{ tw.continueTo(cd1.y,30); tw2.continueTo(cd1.y,30); // tw.yoyo(); // tw2.yoyo(); isClick=false; } }); } } }
56.過渡
(1)過渡:影片剪輯的連接,轉換的方式。好比一張圖片逐漸顯示出來。
(2)過渡共同參數:爲方便使用可經過包名:fl.transitions有提示
(I)type:過渡類型
(II)direction 方向,開始時仍是結束時:fl.transitions.Transition
(III)duration 時長 秒
(IV)easing 緩動
(3)各類過渡類型與參數:多數過渡均可以經過遮罩的方式製做。
(I)Binds 百葉窗,窗簾 numStrips:"遮簾"效果中的遮罩條紋數。建議的範圍是1到50。
(II)Fade 淡入 淡出 無特殊參數
(III)PixelDissolve 棋盤圖案 xSections:一個整數,指示沿水平抽的遮罩矩形部分的數目。建議的範圍是1到50。ySections:一個整數,指示沿垂直軸的遮罩矩形部分的數目。建議的範圍是1到50.
(IV)Fly 從某一指定方向滑入 startPoint:一個指示其實位置的整數,範圍是1到9:左上:1,上中:2,右上:3l;左中:4;中心:5;右中:6;左下:7;下中8;右下:9。
(V)lris 圓形或矩形方式:startPoint:一個起始位置的整數:範圍是1到9:左上:1,上中:2,右上:3l;左中:4;中心:5;右中:6;左下:7;下中8;右下:9。shape:爲fl.transitions.lris.SQUARE(方形)或fl.ransitions.lris.CIRCLE(圓形)的遮罩矩形。
(VI)Photo:像放映照片同樣出現或消失,相似於投影儀。
(VII)Rotate:旋轉 ccw:一個布爾值:對於順時針旋轉爲false;對於逆時針旋轉爲true。degrees:一個整數:指示對象要旋轉的度數。建議的範圍是1到9999。例如,degrees設置爲1080時,會將對象徹底旋轉三次。
(VIII)Squeeze:平或垂直縮放:dimension:一個整數,指示「擠壓」效果應是水平的(0)仍是垂直的(1)
(IX)Wipe 水平移動的某一形狀的動畫遮罩:startPoint:一個起始位置的整數:範圍是1到9:左上:1,上中:2,右上:3l;左中:4;中心:5;右中:6;左下:7;下中8;右下:9。
(X)Zoom 按比例縮放來放大或縮小
(4)PPT
package td { import flash.display.Sprite; import flash.events.TimerEvent; import flash.utils.Timer; import fl.transitions.Blinds; import fl.transitions.Fade; import fl.transitions.Iris; import fl.transitions.Photo; import fl.transitions.PixelDissolve; import fl.transitions.Squeeze; import fl.transitions.Transition; import fl.transitions.TransitionManager; import fl.transitions.easing.Regular; import tc.bg1; import tc.bg2; import tc.bg3; import tc.fangWu; public class lesson37a extends Sprite { public function lesson37a() { init(); } function init(){ var arr:Array = new Array(); var bg_1:tc.bg1=new bg1(); bg_1.width=stage.stageWidth; bg_1.height=stage.stageHeight; bg_1.x=stage.stageWidth/2; bg_1.y=stage.stageHeight/2; arr.push( bg_1 ) ; var bg_2:tc.bg2=new bg2(); bg_2.width=stage.stageWidth; bg_2.height=stage.stageHeight; bg_2.x=stage.stageWidth/2; bg_2.y=stage.stageHeight/2; arr.push( bg_2 ) ; var bg_3:tc.bg3 = new bg3(); bg_3.width=stage.stageWidth; bg_3.height=stage.stageHeight; bg_3.x=stage.stageWidth/2; bg_3.y=stage.stageHeight/2; arr.push( bg_3 ) ; var bg_4:tc.fangWu = new fangWu(); bg_4.width=stage.stageWidth; bg_4.height=stage.stageHeight; bg_4.x=stage.stageWidth/2; bg_4.y=stage.stageHeight/2; arr.push( bg_4 ) ; var arrTr:Array=new Array(); var obj1:Object={ type:fl.transitions.Photo, direction:fl.transitions.Transition.IN, duration:1, easing:fl.transitions.easing.Regular.easeIn } arrTr.push(obj1); var obj2:Object={ type:fl.transitions.Blinds, direction:fl.transitions.Transition.IN, duration:1, easing:fl.transitions.easing.Regular.easeIn }; arrTr.push( obj2 ) ; var obj3:Object={ type:fl.transitions.PixelDissolve, direction:fl.transitions.Transition.IN, duration:1, easing:fl.transitions.easing.Regular.easeIn }; arrTr.push( obj3 ) ; var obj4:Object={ type:fl.transitions.Fade, direction:fl.transitions.Transition.IN, duration:1, easing:fl.transitions.easing.Regular.easeIn }; arrTr.push( obj4 ) ; var obj5:Object={ type:fl.transitions.Squeeze, direction:fl.transitions.Transition.IN, duration:1, easing:fl.transitions.easing.Regular.easeIn }; arrTr.push( obj5 ) ; var obj6:Object={ type:fl.transitions.Iris, direction:fl.transitions.Transition.IN, duration:1, easing:fl.transitions.easing.Regular.easeIn }; arrTr.push( obj6 ) ; var tim:Timer=new Timer(3000,arr.length); tim.start(); tim.addEventListener(TimerEvent.TIMER,function(){ stage.addChild(arr[tim.currentCount-1]); var tr:TransitionManager=new TransitionManager(arr[tim.currentCount-1]); tr.startTransition(arrTr[Math.floor(Math.random()*arrTr.length)]); if(stage.numChildren>arr.length){ stage.removeChildAt(1); } }); tim.addEventListener(TimerEvent.TIMER_COMPLETE,function(){ tim.reset(); tim.start(); }); } } }
57.聲音
(1)聲音的使用主要有兩個過程:先加載,後播放聲音。針對以上兩個(加載,播放)過程對應的幾個類。
(I)flash.media.Sound 加載過程。可獲得聲音文件的原始信息,好比時長,字節,做者,專輯等信息。播放,關閉等。
(II)flash.meida.SoundChannel 播放階段,取得相應階段的信息,經過SoundTransform控制某個聲音音量和平移。
(III)SoundTransform 加載和播放階段均可以用聲音變換SoundTransform類包含控制聲音和平移的屬性(左右聲道)。
(IV)flash.media.SoundMixer SoundMixer類包含SWF文件中所有聲音控制的靜態屬性和方法。因爲動畫中同時播放多個聲音,這個就是統一控制的,SoundChannel是單個控制的。
注意事項:只支持mp3格式,其餘格式須要轉換成MP3
package td { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.ProgressEvent; import flash.events.TimerEvent; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.media.SoundTransform; import flash.net.URLRequest; import flash.utils.Timer; import fl.controls.Slider; import fl.controls.SliderDirection; import fl.events.SliderEvent; import tc.button; import tc.dizhu; import tc.huanBan; public class lesson38 extends Sprite { public function lesson38() { var totalTime:Number=0; var req:URLRequest=new URLRequest("music/迴夢遊仙.mp3"); var son:Sound=new Sound(req); var str:SoundTransform=new SoundTransform(); str.volume=0.1; str.pan=0; son.addEventListener(Event.COMPLETE,function(){ //son.play(); trace("總時長:秒"+son.length/1000); }); //son.play(0,10,str); son.addEventListener(ProgressEvent.PROGRESS,function(){ trace("加載字節數: "+son.bytesLoaded+" 總字節數:"+son.bytesTotal); trace("已加載:時長毫秒:"+son.length); }); son.addEventListener(Event.ID3,function(){ trace("音樂名稱:"+son.id3.songName); trace("專輯:"+son.id3.album); trace("建立時間:"+son.id3.year); trace("演唱者:"+son.id3.artist); }); var scn:SoundChannel=son.play(); var tim:Timer=new Timer(1000,0); tim.start(); tim.addEventListener(TimerEvent.TIMER,function(){ // trace("當前播放哪裏"+scn.position);//當前播放哪裏? //trace("左聲道:"+scn.leftPeak+"右聲道:"+scn.rightPeak) }); var vo:Number=1; var lr:Number=0; var str:SoundTransform=new SoundTransform(vo,lr); var slVo:Slider=new Slider(); slVo.width=200; slVo.maximum=1; slVo.minimum=0; slVo.x=100; slVo.y=100; slVo.value=vo; slVo.tickInterval=0.1; slVo.snapInterval=0.1; stage.addChild(slVo); var slPan:Slider=new Slider(); slPan.width=200; slPan.maximum=1; slPan.minimum=-1; slPan.x=100; slPan.y=130; slPan.value=vo; slPan.tickInterval=0.1; slPan.snapInterval=0.1; stage.addChild(slPan); slVo.addEventListener(SliderEvent.CHANGE,function(){ str.volume=slVo.value; scn.soundTransform=str; }); slPan.addEventListener(SliderEvent.CHANGE,function(){ str.pan=slVo.value; scn.soundTransform=str; }); var hua1:tc.huanBan=new huanBan(); hua1.stop(); hua1.scaleX=0.3; hua1.scaleY=0.3; hua1.x=100; hua1.y=200; stage.addChild(hua1); var currPos:Number=0; var isClick:Boolean=false; hua1.addEventListener(MouseEvent.CLICK,function(){ if(isClick==false) { trace(isClick); currPos=scn.position; scn.stop(); hua1.gotoAndStop(2); isClick=true; } else{ trace(isClick); scn=son.play(currPos); hua1.gotoAndStop(1); isClick=false; } }); son.addEventListener(Event.COMPLETE,function(){ totalTime=son.length/1000; var slid:Slider=new Slider(); slid.maximum=totalTime; slid.minimum=0; slid.tickInterval=10; slid.snapInterval=1; slid.width=400; slid.x=100; slid.y=180; slid.value=0; stage.addChild(slid); var tim:Timer=new Timer(1000,totalTime); tim.start(); tim.addEventListener(TimerEvent.TIMER,function(){ slid.value=scn.position/1000; }); slid.addEventListener(SliderEvent.CHANGE,function(){ scn.stop(); scn=son.play(slid.value*1000);//重置通道 tim.start(); }); slid.addEventListener(SliderEvent.THUMB_DRAG,function(){ tim.stop(); }); }); var req1:URLRequest=new URLRequest("music/叫地主.mp3"); var son1:Sound=new Sound(req1); var scn1:SoundChannel=son1.play(0,10000); var req2:URLRequest=new URLRequest("music/英雄的黎明.mp3"); var son2:Sound=new Sound(req2); var scn2:SoundChannel=son2.play(); var hua2:tc.huanBan=new huanBan(); hua2.x=300; hua2.y=100; hua2.scaleX=0.5; hua2.scaleY=0.5; hua2.stop(); hua2.gotoAndStop(1); stage.addChild(hua2); var isStop:Boolean=false; hua2.addEventListener(MouseEvent.CLICK,function(){ if(isStop==false) { SoundMixer.stopAll(); isStop=true; }else{ scn=son.play(scn.position); scn1=son1.play(scn1.position); scn2=son2.play(scn2.position); isStop=false; } }); var sldAll:Slider=new Slider(); sldAll.maximum=1; sldAll.minimum=0; sldAll.value=1; sldAll.tickInterval=10; sldAll.snapInterval=0.2; sldAll.direction=SliderDirection.VERTICAL; sldAll.x=50; sldAll.y=100; sldAll.height=100; stage.addChild(sldAll); var trsAll:SoundTransform=new SoundTransform(); sldAll.addEventListener(SliderEvent.CHANGE,function(){ trsAll.volume=sldAll.value; SoundMixer.soundTransform=trsAll; }); } } }
(2)既然是聲音數據,那麼就有聲波大小(聲音高低),頻譜疏密(聲音快慢)。同時兩個聲音都具備波幅和頻譜。
(3)混音器中的computeSpectrum方法可得到聲音波形並將其放在指定的ByteArray對象中。這些值浮點值(範圍爲-1.0到1.0)格式。建立的ByteArray對象的大小固定爲512個浮點值,其中前256個值表示左聲道,後256值表示右聲道。
(4)字節流:是由字節組成的一個連續的字節隊列。AS3中可用數組表示字節流即:ByteArray,並可根據存放的類型取出相應數據。如數組中存放的是整數型數據,就能夠用readInt(),聲音數據信息存放的是-1~1之間的否點型數據,可用readFloat()取出。(這個字節數組與Array普通數組不太同樣,好比字節數組每讀取一個字節會自動遞增一次)。
(5)其中FFTMode:Boolean(default=false):快速傅里葉變換(Fast Fourier Transform),爲true時獲得頻譜,爲false時獲得波幅。根據波幅或頻譜能夠作多種效果,好比音樂噴泉,聲控飛機等聲控遊戲。
(6)stretchFactor:int(default=0) 聲音採樣的分辨率:0,則會按44.1KHz對數據進行採樣,若是值爲1,則按22.05KHz對數據進行採樣,若是值爲2,則按11.025KHz對數據進行採樣。
(7)聲波
package td { import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.media.Sound; import flash.media.SoundMixer; import flash.net.URLRequest; import flash.utils.ByteArray; public class lesson38b extends Sprite { public function lesson38b() { var req:URLRequest=new URLRequest("music/精忠報國.mp3"); var son:Sound=new Sound(req); son.play(); var bitArr:ByteArray=new ByteArray(); var sp:Shape=new Shape(); sp.y=200; stage.addChild(sp); SoundMixer.computeSpectrum(bitArr); stage.addEventListener(Event.ENTER_FRAME,getBoxing); function getBoxing(e:Event){ SoundMixer.computeSpectrum(bitArr); sp.graphics.clear(); sp.graphics.lineStyle(1,0xff0000,1); sp.graphics.beginFill(0xffff00,1); sp.graphics.moveTo(0,0); for(var i=0;i<256;i++){ sp.graphics.lineTo(i*2,bitArr.readFloat()*200); } sp.graphics.lineTo((i+1)*2,0); sp.graphics.endFill(); sp.graphics.moveTo(0,0); sp.graphics.lineStyle(1,0x00ff00,1); sp.graphics.beginFill(0x00ff00,1); for(var m=256;m<512;m++){ sp.graphics.lineTo((m-256)*2,bitArr.readFloat()*200); } sp.graphics.lineTo((m-256+1)*2,0); sp.graphics.endFill(); } } } }
(8)噴泉
package td { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.SoftKeyboardTrigger; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.net.URLRequest; import flash.utils.ByteArray; import tc.huanBan; public class lesson38c extends Sprite { public function lesson38c() { init(); } function init(){ var req:URLRequest=new URLRequest("music/精忠報國.mp3"); var son:Sound=new Sound(req); son.play(); var byArr:ByteArray=new ByteArray(); var sumSon:Number=0; var avgSonSpeed:Number=0; stage.addEventListener(Event.ENTER_FRAME,function(){ SoundMixer.computeSpectrum(byArr); for(var i=0;i<512;i++) { sumSon+=byArr.readFloat(); } avgSonSpeed=sumSon/512; for(var i=0;i<10;i++){ createOne(avgSonSpeed*20); } }); } function createOne(spY:Number){ var hua:huanBan=new huanBan(); hua.scaleX=0.1; hua.scaleY=0.1; hua.x=stage.stageWidth/2-hua.width/2; hua.y=stage.stageHeight/2-10; //hua.stop(); hua.gotoAndPlay(Math.round(Math.random()*5)); //---自定義屬性 hua.speedY=spY; hua.speedX=Math.random()*10-5; hua.speedZ=Math.random()*10-5; hua.speedAdd=0; //---------- stage.addChild(hua); hua.addEventListener(Event.ENTER_FRAME,moveFun); function moveFun(){ hua.speedAdd+=0.2; hua.y+=-hua.speedY+hua.speedAdd; hua.z+=-hua.speedZ; hua.x+=-hua.speedX; if(hua.y>stage.stageHeight||hua.x<-200||hua.x>stage.stageWidth+200||hua.z>600||hua.z<-300){ hua.removeEventListener(Event.ENTER_FRAME,moveFun); stage.removeChild(hua); hua=null; } } } } }
(9)聲音的輸入可分幾種狀況
(1)外部聲音文件(如mp3文件)加載到SWF中。適合較大的聲音,如背景音樂,歌曲等。
(2)在建立SWF文件時將聲音信息直接嵌入到其中
(I)在用Flash Professional設計動畫把聲音放到了舞臺中。
(II)放到庫面板中而後發佈成組件讓其它應用使用(如flash builder構造路徑),另外注意聲音的繼承類型是flash.media.Sound,圖像(png,jpg,gif等)繼承類型是flash.display.BitmapData,影片剪輯天然就是flash.dispaly.MovieClip。
(III)放到庫面板中而後導出swf資源庫,讓其它應用使用。
(IV)這幾種方式適合小數數據量的聲音,好比按鈕生,爆炸聲,雷聲等剪短的。另外不是mp3格式的而且文件較小的音頻,可經過此方法自動轉換。不如wav....固然對於大的wav可用其餘軟件轉換。
(V)使用鏈接到用戶計算機的麥克風來獲取音頻。
(10)從服務器流式傳輸音頻
(11)動態生成音頻
(12)注意事項:使用麥克風錄音並播放時,必定要消除迴環,這樣狀況會好點,但也不完全,尤爲是放大麥克風時,迴音特別強。通常狀況下最好不要邊錄音邊在喇叭中播放,只用來合成數據便可。或者帶耳機時沒有迴音。
(13)麥克風
package td { import flash.display.Sprite; import flash.events.SampleDataEvent; import flash.events.StatusEvent; import flash.media.Microphone; import flash.media.Sound; import tc.doudizhu; import tc.jiaodizhu; public class lesson38d extends Sprite { public function lesson38d() { var son:Sound=new jiaodizhu(); son.play(); var mic:Microphone = Microphone.getMicrophone(); mic.gain=60; mic.setUseEchoSuppression(true); trace( mic.name ) ; mic.setLoopBack(true); mic.addEventListener(SampleDataEvent.SAMPLE_DATA,function(e:SampleDataEvent){ for (var i:int=0;i<256;i++){ trace( e.data.readFloat() ) ; } }); } } }
(14)
package td { import flash.display.Sprite; import flash.events.Event; import flash.events.SampleDataEvent; import flash.media.Microphone; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.net.URLRequest; import flash.utils.ByteArray; import tc.huanBan; public class lesson38e extends Sprite { var speed:Number=1; public function lesson38e() { init(); } function init(){ var mic:Microphone = Microphone.getMicrophone(); mic.gain=80; mic.addEventListener(SampleDataEvent.SAMPLE_DATA,function(e:SampleDataEvent){ speed = e.data.readFloat()*100 ; }); var req:URLRequest = new URLRequest("music/精忠報國.mp3"); var son:Sound = new Sound(req); var conCh:SoundChannel= son.play(); var byArr:ByteArray = new ByteArray(); var sumSon:Number = 0; var avgSonSpeed:Number =0; addEventListener(Event.ENTER_FRAME,function(e:Event){ SoundMixer.computeSpectrum(byArr ) ; for (var i=0;i<512;i++){ sumSon += byArr.readFloat() ; } avgSonSpeed = sumSon/512 ; for (var i=0;i<10;i++){ createOne(speed + avgSonSpeed) } }); } function createOne(spY:Number){ var hua:huanBan = new huanBan(); hua.scaleX=0.1; hua.scaleY=0.1; hua.x=500/2 - hua.width/2 ; hua.y=400-100; //hua.stop(); hua.gotoAndStop( Math.round( Math.random()*5 ) ); //------自定義屬性-- hua.speedY = spY; hua.speedX = Math.random()*10-5; hua.speedZ = Math.random()*10-5; hua.speedAdd=0; //------ addChild( hua ) ; hua.addEventListener(Event.ENTER_FRAME,moveFun); function moveFun(){ hua.speedAdd += 0.2 ; hua.y += -hua.speedY+hua.speedAdd; hua.x += hua.speedX ; hua.z += hua.speedZ ; //|| hua.y < -1000可不加這個,因有重力,終究會落下的 if (hua.y >400 || hua.x<-200 || hua.x > 1000+200 || hua.z >600 || hua.z<-800 ){ hua.removeEventListener(Event.ENTER_FRAME,moveFun); removeChild( hua ); hua = null ; } } } } }
58.swf文件載入
(1)加載swf文件常見3個應用場景
(I)隨着程序愈來愈多,規模愈來愈大,就須要把一個大的場景分紅幾個小的場景,一個場景一個swf文件,而後在根據須要載入相應的swf場景。通常略大些的遊戲,mtv等都是多個場景根據狀況載入的。打完一關再載入下一關。
(II)設計師已經設計好了場景,程序員沒有必要再去用代碼再設置一遍,而是直接將設計好的swf文件載入,而後再作相應的動畫或其餘命令。swf一但載入到主場景,那麼它就成爲主場景中loader對象的子對象,這時就像操做其它對象同樣。另外,子場景也能夠經過父對象向上尋找主場景中的對象。
(i)
(ii)卸載swf文檔。載入後的子對象不用時必定要卸載,與顯示對象同樣只從舞臺中移除,swf還會在內存中存儲,尤爲是正在執行的聲音,監聽等很消耗資源。因此必定要清除。用unloadAndstop,再加上null值,比較完全乾淨。 unload ,unloadAndStop
(iii)鍵盤事件:鍵盤事件能夠添加到任何交互性對象上,好比影片剪輯,精靈等,但同時焦點在哪一個對象上,哪一個對象就監聽鍵盤。舞臺時特殊的影片剪輯,而且默認狀況下焦點就落在舞臺上,因此給舞臺添加鍵盤事件很常見。但有時也須要給其餘對象添加舞臺,事件,好比文檔對象,影片剪輯等,這時就須要把默認的焦點設置到相應的對象上。即焦點從舞臺放到其它對象上。stage.fouce=相應對象。
(iv) stage.focus = hua;//舞臺焦點轉移
(III)共享資源庫:在多個場景或不一樣項目中都須要使用相同的內容而且有不大就能夠把swf做爲共享資源,好比花,草,樹木,武器裝備等把他們放到一個swf文件中動態調用。能夠載入場景前先載入swf,而後主場景或子場景均可以使用,提升總體效率,這就是預加載。
到目前爲止,咱們將3種載入。
(i)組件方式:優勢:簡單方便,直接new個新實例就可使用,而且顯示速度最快。缺點:佔內存較大,項目中用不用都會預先載入,這也是顯示快的緣由。 通常第三方空間經常用組件方式載入。好比一些報表組件,UI組件等。
(ii)Loader方式:優勢:不會預先載入,根據須要載入,天然不用時也不載入內存。缺點:須要敲的代碼較多,加載沒有其餘兩個快,因沒有載入。 通常用一個較大的圖像,聲音,swf文件等。好比背景音樂,背景圖像等,一個場景就只加載一次,沒有必要放到組件或swf資源庫中,不載如也不佔用內存時。
(iii)swf共享資源庫: 優勢:可預先載入,但第一次慢與loader方式相似,之後調用時就快與組件方式 相似。代碼量比組件多,比loader少。優缺點並存,通常大些遊戲動畫用此方法。 通常較小的圖像,聲音,動畫,而且常常反覆使用的用此法。好比主角,道具,花花草草,打架聲,各種碰撞聲等。
(2)注意事項:載入swf時,只有一個stage舞臺對象,其它子swf中的各個顯示對象須要掛在相應的文檔中。最簡單的方法就是直接打addChild().即不是stage.addChild(),也不是this.addChild();由於this的指向會根據代碼的位置變化,而stage是指舞臺,這裏不用。什麼都不加就是指文檔對象,也就是本文檔的根。
(3)舞臺(stage)->文檔對象(與文檔名稱相同的類)->(1)其餘對象1 (2)其它對象2
(4)應用程序域:一個SWF文件至關於一個應用程序域,若是兩個swf文件合成在一塊兒就會出現衝頭。好比A.swf有個花瓣的類名稱爲:huaban,而另外一個B.swf文件中也有一個實例化花瓣類,名稱也爲huaban,若是沒有應用程序域的話,就產生衝突了。好比在實例化花瓣時:var hh:huaban=new huaban();就問題了,程序不知道是A.swf中的仍是B.swf中的。幸虧as在載入時已經默認使用應用程序域了。好比在A.swf文件中加載B.swf,這是A就成了父域,B就成爲子域。這是再實例化花瓣時就能夠用域來分隔,如訪問A中的花瓣:var hh:huaban=new A域.huaban();訪問B中時:var hh:huaban=new A域.B域.huaban();
(5)注意事項:應用程序域列表與顯示列表是兩個概念
(I)應用程序域:是代碼級別,類庫與類庫,代碼與代碼間的父子或樹形關係。
(II)顯示列表:是顯示對象級別的,多數是指能在舞臺上顯示的對象之間的父子或樹形關係。
(6)swf的場景獲取所需的元素
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; import flash.system.ApplicationDomain; import tc.huanBan; public class lesson39a extends Sprite { public function lesson39a() { var req:URLRequest = new URLRequest("libs/newLibs.swf"); var lod:Loader = new Loader(); lod.load( req ); trace( ApplicationDomain.currentDomain, ApplicationDomain.currentDomain.parentDomain) ; //--------- lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(){ trace(lod.contentLoaderInfo.applicationDomain,lod.contentLoaderInfo.applicationDomain.parentDomain); var app:ApplicationDomain=lod.contentLoaderInfo.applicationDomain; trace( app.getDefinition("tn.mc.horse")); var horse:Class=app.getDefinition("tn.mc.horse") as Class;//newLibs.swf中馬中的鏈接 var hr:MovieClip=new horse(); addChild(hr); hr.addEventListener(Event.ENTER_FRAME,function(){ hr.x+=5; }); var hua:Class=app.getDefinition("tn.plant.hua1") as Class;//newLibs.swf中花中的鏈接 var bmd:BitmapData=new hua(); var bm:Bitmap=new Bitmap(bmd); addChild(bm); var majiao:Class=app.getDefinition("tn.sond.horse") as Class;//newLibs.swf中馬叫聲中的鏈接 var mjs:Sound=new majiao(); mjs.play(); }); } } }
(7)萬馬奔騰案例
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.media.Sound; import flash.net.URLRequest; import flash.system.ApplicationDomain; import flash.utils.Timer; import tc.map; public class lesson39b extends Sprite { var app:ApplicationDomain; public function lesson39b() { createScan(); init(); } function init(){ var req:URLRequest=new URLRequest("libs/newLibs.swf"); var lod:Loader=new Loader(); lod.load(req); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(){ app=lod.contentLoaderInfo.applicationDomain; appContent();//馬 laoYing();//老鷹 }); } // function createScan(){ var req:URLRequest=new URLRequest("newSrc/背景/bg4.jpg"); var lod:Loader=new Loader(); addChild(lod); lod.load(req); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(){ lod.content.width=lod.content.width*0.9; lod.content.height=lod.content.height*0.9; lod.x-=200; }); lod.addEventListener(Event.ENTER_FRAME,function(){ lod.x-=2; if(lod.x<=-200-lod.width/2){ lod.x-=200; } }); } function appContent(){ var cy:Class=app.getDefinition("tn.caodi.caoyuan1")as Class var cy1:BitmapData=new cy(); var bm:Bitmap=new Bitmap(cy1); addChild(bm); bm.x-=120; bm.y=320; bm.addEventListener(Event.ENTER_FRAME,function(){ bm.x+=-10; if(bm.x<=-200-bm.width/2){ bm.x=-200; } }); var horse:Class= app.getDefinition("tn.mc.horse") as Class; for(var i=0;i<5;i++) { var hor:MovieClip=new horse(); addChild(hor); hor.gotoAndPlay(Math.floor((Math.random()*4))); // hor.stop(); hor.y=stage.stageHeight-500; hor.x=Math.random()*stage.stageWidth-100; hor.z=Math.random()*20; } } function laoYing(){ var ying:Class=app.getDefinition("tn.mc.ying") as Class; var yn:MovieClip=new ying(); addChild(yn); var tim:Timer=new Timer(1000,0); tim.addEventListener(TimerEvent.TIMER,function(){ yn.y=Math.random()*200; }); tim.start(); yn.gotoAndPlay("yr1"); yn.x=100; //yn.stop(); var maPao:Class=app.getDefinition("tn.sond.hoursMv") as Class; var mp:Sound=new maPao(); mp.play(0,1000); var maJiao:Class=app.getDefinition("tn.sond.horse") as Class; var mj:Sound=new maJiao(); var yingjiao:Class=app.getDefinition("tn.sond.ying") as Class; var yj:Sound=new yingjiao(); var tims:Timer=new Timer(2000,0); tims.addEventListener(TimerEvent.TIMER,function(){ tims.delay=Math.random()*100000; yj.play(); mj.play(); }); tims.start(); } } }
59.3D旋轉
(1)Matrix3D即3D矩陣:這個至關於顯示對象的影子,顯示對象一但設置了z座標或者旋轉等,就自動生成了Matrix3D。這個對象中就記錄了顯示對象的位置,角度等,能夠取出直接用,如:transform.getRelativeMatrix3D(父對象):注意這個父對象是相對的,常見是文檔或舞臺對象。若是對象一直在變化中,包括z座標,這時用Matrix3D對象來處理就方便了。
(2)一張圖片的旋轉
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import flash.net.URLRequest; import flash.system.ApplicationDomain; import tc.bg3; public class lesson41 extends Sprite { var app:ApplicationDomain; public function lesson41() { //transform.perspectiveProjection.projectionCenter=new Point(0,100); var bg:tc.bg3 = new bg3(); addChild( bg ); bg.height=400; bg.x=150; bg.y=200; var req:URLRequest = new URLRequest("libs/newLibs.swf") ; var lod:Loader = new Loader(); lod.load( req ); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(){ app=lod.contentLoaderInfo.applicationDomain; //----------- page(); //----------- }); } function page(){ var p1:Sprite=getBmp("tn.bg.fg1"); var p2:Sprite=getBmp("tn.bg.fg2"); p1.x=stage.stageWidth/2; p1.y=stage.stageHeight/2; p1.z=0; p2.x=stage.stageWidth/2; p2.y=stage.stageHeight/2; p2.z=0; addEventListener(Event.ENTER_FRAME,function(){ p1.rotationY+=1; p2.rotationY+=1; if(p1.rotationY>=90){ setChildIndex(p1,numChildren-1); } if(p1.rotationY>=270){ setChildIndex(p2,numChildren-1); } if(p1.rotationY>=360){ p1.rotationY=0; p2.rotationY=0; } }); addChild(p1); addChild(p2); } function getBmp(nameBg:String){ var cls:Class=app.getDefinition(nameBg) as Class; var bmd:BitmapData=new cls(); var bm:Bitmap=new Bitmap(bmd); var spr:Sprite=new Sprite(); bm.x=-bm.width/2; bm.y=-bm.height/2; spr.addChild(bm); return spr; } } }
(3)旋轉的魔方
package td { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import flash.net.URLRequest; import flash.system.ApplicationDomain; import tc.bg3; public class lesson41a extends Sprite { var app:ApplicationDomain; var xCenter:int = 0; var yCenter:int = 0; var arrZsort:Array = new Array(); public function lesson41a() { transform.perspectiveProjection.fieldOfView=60; //transform.perspectiveProjection.projectionCenter=new Point(0,0); var bg:tc.bg3 = new bg3(); addChild( bg ); bg.height=400; bg.x=150; bg.y=200; var req:URLRequest = new URLRequest("libs/newLibs.swf") ; var lod:Loader = new Loader(); lod.load( req ); lod.contentLoaderInfo.addEventListener(Event.COMPLETE,function(){ app = lod.contentLoaderInfo.applicationDomain ; //----------- creatBox(); //----------- }); } function creatBox(){ var box:Sprite = new Sprite(); addChild( box ); box.x=stage.stageWidth/2; box.y=stage.stageHeight/2; var sprBoot:Sprite = getBmp("tn.bg.fg5"); box.addChild( sprBoot ); sprBoot.x=xCenter; sprBoot.y=yCenter+100; sprBoot.rotationX=-90; sprBoot.z=0; arrZsort.push( sprBoot ) ; var sprBack:Sprite = getBmp("tn.bg.fg4"); box.addChild( sprBack ); sprBack.x=xCenter; sprBack.y=yCenter; sprBack.z=100; arrZsort.push( sprBack ) ; var sprTop:Sprite = getBmp("tn.bg.fg1"); box.addChild( sprTop ); sprTop.x=xCenter; sprTop.y=yCenter-100; sprTop.rotationX=-90; sprTop.z=0; arrZsort.push( sprTop ) ; var sprLeft:Sprite = getBmp("tn.bg.fg2"); box.addChild( sprLeft ); sprLeft.width=200; sprLeft.height=200; sprLeft.x=xCenter-150; sprLeft.y=yCenter; sprLeft.rotationY=-90; sprLeft.z=0; arrZsort.push( sprLeft ) ; var sprRight:Sprite = getBmp("tn.bg.fg3"); box.addChild( sprRight ); sprRight.width=200; sprRight.height=200; sprRight.x=xCenter+150; sprRight.y=yCenter; sprRight.rotationY=-90; sprRight.z=0; arrZsort.push( sprRight ) ; var sprFor:Sprite = getBmp("tn.bg.fg6"); box.addChild( sprFor ); sprFor.x=xCenter; sprFor.y=yCenter; sprFor.z=-100; arrZsort.push( sprFor ) ; box.addEventListener(Event.ENTER_FRAME,function(){ box.rotationY += 2; for (var i=0;i<arrZsort.length;i++){ arrZsort[i].name = arrZsort[i].transform.getRelativeMatrix3D(arrZsort[i].parent.parent).position.z ; } arrZsort.sortOn("name",Array.NUMERIC | Array.DESCENDING ); for ( var i=0;i<arrZsort.length;i++ ){ box.setChildIndex( arrZsort[i],i ) ; } //trace( sprFor.transform.getRelativeMatrix3D(box.parent).position.z ) ; }); } function getBmp(nameBg:String){ var cls:Class = app.getDefinition(nameBg) as Class; var bmd:BitmapData = new cls(); var bm:Bitmap = new Bitmap(bmd) ; bm.width=300; bm.height=200; var spr:Sprite = new Sprite(); bm.x=-bm.width/2; bm.y=-bm.height/2; spr.addChild( bm ); return spr ; } } }
60.網絡與通信
(1)flash自己是個客戶端程序不能直接與遠程的其它用戶通信,必須通過服務器中轉。web版的flash,常見兩種服務器:
(I)web服務器http服務,主要負責網頁瀏覽,後者程序(php)的運行,文件存取等。常見服務程序有 微軟的IIS internet信息服務,Apache Web服務器軟件。前者簡單易用,後最各平臺通用。
(II)流媒體服務器:視頻或音頻以流方式在網絡中傳播。流方式就是把一段大的視頻分隔小份,一段一段的傳輸,用戶播放時就不用等所有加載完畢後再播放。由於視頻文件通常都很大,互聯網慢因此採用流傳輸,用戶體驗好點。另外還能夠實時傳輸,文件共享,動態流,P2P等。這三個但是作及時遊戲,視頻聊天以及根據網絡帶寬自動調整視頻的清晰度(標清,高清,超清等),改善網絡帶寬的關鍵內容。
(2)典型的流媒體服務器。每一中方案都有前段播放器和後端服務器之分,好比
(I)微軟的WindowsMeida Service(WMS),它採用MMS協議接收、傳輸視頻,採用Windows Media Player(WMP)做爲前段播放器;
(II)RealNetworks公司的Helix Server,採用RTP/RTSP協議接收、傳輸視頻,採用Real Player做爲播放前端。
(III)Adobe公司的Flash Media Server,採用RTMP(RTMPT/RTMPE/RTMPS)協議接收、輸出視頻,採用Flash Player做爲播放前端。這個功能強,簡單易用。
(IV)開源免費的Red5,就是Flash Media Server的仿版。
(3)D:\Program Files\Adobe\Adobe Media Server 5\applications\lessonVod這個目錄與同比的vod是兄弟。D:\Program Files\Adobe\Adobe Media Server 5\conf\ams.ini中這個ams.ini文件中
VOD_DIR = D:\Program Files\Adobe\Adobe Media Server 5\applications\vod\media下添加
VOD_DIR = D:\Program Files\Adobe\Adobe Media Server 5\applications\lessonVod\media這一句配置。
61.視頻點播
(1)視頻點播:就是服務器端已經作好的視頻,用戶直接點擊觀看。
(2)[web 服務器、FMS服務器對視頻進行分割打包]->經過rtmp,http等協議傳輸 ->flv播放器或者其餘播放器播放。
(3)傳輸方式有:rtmp實時流,http流傳輸,http動態流式傳輸。另外還有一種是http動態流和rtmp實時流混合傳輸。
(4)對於點播來講:3種均可以,但rtmp與http動態傳輸更有優點,緣由都能調節寬帶和性能,而http漸進下載不能。在rtmp動態流與http動態流之間,http動態流佔優點,緣由http動態流可緩存,另外視頻一但下載完就關閉鏈接,節省帶寬。而rtmp就是長鏈接,視頻播放完後不自動關閉,直到用戶關閉客戶端。以上分析是通常狀況,不能定論,好比有些要求安全性高,就可能用rtmp,有些要求只要高清不要動態調整,那麼http漸進下載好點。最後若是是作同步通信,及時通信的必須是rtmp,好比遊戲對戰,視頻聊天等。
(5)實時流傳輸常見幾種協議:
(I)RTMP:RTMP是Real—Time Messaging Protocol(實時消息傳送協議)的縮寫,它是Adobe Systems公司爲Flash播放器和服務器之間音頻、視頻和數據傳輸開發的協議。這是一個標準的,未加密的實時消息傳送協議,默認端口是1935;
(II)RTMPE:RTMP的變種,RTMPE是一個加密版本的RTMP,和RTMPS不一樣的是RTMPE不採用SSL加密,RTMPE加密快於SSL,而且不須要認證管理。若是沒有指定RTMPE端口,Flash播放器將像RTMP協議同樣依次掃描下列端口:1925(RTMPE)443(RTMPE)80(RTMPE)80(RTMPTE)
(III)RTMFP:這個是P2P播放關鍵,只有把rtmp改爲rtmfp便可,RTMFP是Adobe公司開發的一套新的通訊協議,該協議可讓使用Adobe Flash Player的終端用戶之間進行直接通訊。RTMFP將減小直播、實時聊天方案的帶寬消耗,例如音視頻聊天和多人遊戲。由於RTMFP的數據在終端用戶之間流動,而不是和服務器,因此此方案很適合於大範圍的部署,小範圍就沒有必要,由於同一視頻沒幾我的看,而看的人網絡上行帶寬就不富裕,因此看的人少做用就不大。
注意:直接使用rtmfp並不能進行p2p點播。p2p直播。
(6)fms服務器把你要看的視頻地址直接掛到其餘正在播放相同視頻的用戶地址上。
(7)視頻客戶端:FLVPlayback,FLVPlayback擴展了VideoPlayer對象。相對來講比原生的VideoPlayer功能要強。肯定是比VideoPlayer略大。
(8)播放地址是:rtmp://fms 服務器地址/應用程序名稱。
(9)直播
package te { import flash.display.Sprite; import flash.events.Event; import fl.video.FLVPlayback; import fl.video.MetadataEvent; import fl.video.VideoAlign; import fl.video.VideoEvent; public class lesson43 extends Sprite { public function lesson43() { init(); } function init(){ var flv:FLVPlayback=new FLVPlayback(); addChild(flv); // flv.source="rtmp://localhost/lessonVod/mp4:荷塘月色.mp4"; //flv.source="rtmp://localhost/lessonVod/mp3:迴夢遊仙"; // flv.source="rtmp://localhost/lessonVod/仙劍四片尾動畫"; //flv.source="rtmp://localhost/lessonVod/"+getName("仙劍四片尾動畫.flv"); flv.source="rtmfp://localhost/lessonVod/"+getName("荷塘月色.mp4"); /* flv.addEventListener(VideoEvent.READY,function(){ trace("read:"+flv.totalTime); }); flv.addEventListener(MetadataEvent.METADATA_RECEIVED,function(){ trace("metada:"+flv.totalTime); }); flv.addEventListener(Event.ENTER_FRAME,function(){ trace(flv.playheadTime); }); flv.seek(150);*/ //-------- flv.skin="file/MinimaSilverAll.swf"; flv.skinAutoHide=true; flv.width=stage.stageWidth; flv.height=stage.stageHeight-50; flv.align=VideoAlign.TOP_LEFT; //---------- var oldSour:String=flv.source; var currTime:Number=0; flv.addEventListener(Event.ENTER_FRAME,addPop); function addPop(e:Event){ if(flv.metadata!=null){ if(flv.playheadTime>=flv.totalTime/2){ currTime=flv.playheadTime; flv.source="rtmfp://localhost/lessonVod/"+getName("仙劍四片尾動畫.flv"); flv.addEventListener(VideoEvent.COMPLETE,endPop); } } } function endPop(e:Event){ flv.removeEventListener(VideoEvent.COMPLETE,endPop); flv.removeEventListener(Event.ENTER_FRAME,addPop); flv.source=oldSour; flv.seek(currTime); } } function getName(oldName:String){ var newName:String=""; var name:String=oldName.substr(oldName.length-4,4); if(name==".mp4")//取後四位 { newName="mp4:"+oldName; } if(name==".mp3")//取後四位 { newName="mp3:"+oldName.substr(0,oldName.length-4); } if(name==".flv"){ newName=oldName.substr(0,oldName.length-4); } return newName; } } }
(10)順序流:也就是HTTP漸進下載,只須要web服務器便可。邊下載邊播放,也能夠按暫停鍵,多下載會兒,在播放更流暢。另外下載完後自動關閉鏈接,而不用等用戶關閉窗口後才關閉鏈接。因爲成本低(不用流媒體服務器),技術簡單(就和普通網頁鏈接同樣,播放器直接鏈接到視頻上便可),缺點是:視頻大時,用戶拖動進度時體驗很差,另外延時比rtmp要長几秒,因此在中小型規模,每一個視頻沒那麼大,http點播方面比rtmp實時流有優點,固然對於大規模來講,http動態流(非普通的漸進下載)和P2P更有優點。
(11)注意:在安裝fms服務器時,fms自己內置了個web服務器,須要關閉掉。可使用專門的Apache服務器來提供http流,若是不關閉fms內置的就會與專門的Apache端口號衝突,致使aphache啓動不了。
(12)動態流:rtmp實時流傳輸,與http漸進流傳輸,兩種協議各有各的優缺點,好比http協議在第二次觀看的時候會直接使用緩存文件進行播放,速度也比較快,但不能任意跳轉,而RTMP協議必須保持源源不斷送出「流」,也就是長鏈接,同時本地也無緩存,消耗服務器資源,但能夠任意跳轉。爲了既要播放快,又要任意跳轉,就須要今天的http動態流,全名HTTP Dynamic Streaming,簡寫HDS。也就是說HTTP Dynamic Streaming是對兩種協議的優勢進行了一個組合,達到了兩個協議取長補短的服務平臺。其經過對來自RTMP端的流「進行包賺處理,轉化成HTTP流「提供給客戶端解析,用戶不用下載整個文件,同時又能使用HTTP協議進行快速觀看視頻。
注:fms流媒體服務器經過rtmp協議吧大塊文件分割,而後再使用web服務器http協議傳輸。
(13)f4m文件:其實就是記錄某個視頻的播放列表,經常把一個高質量的視頻爲了適應不一樣碼率的播放速度,壓縮成幾個不一樣質量視頻來播放,而每個視頻在播放時都會進行rtmp分割http傳輸。
(14)碼率、比特率同一個概念:是指每秒傳送的比特數。單位爲bps(Bit Per Second),比特率越高,傳送數據速遞越快,越能看高質量的視頻。這是個動態值,有時網絡很差,碼率就笑,傳輸速度就慢,視頻就卡。
(15)帶寬是個固定值,在安裝寬帶時就肯定了。
(16)OSMF(Open Source Media Framework):是一個用於基於Flash的媒體播放器的開源開發框架,其目標是爲了簡化多媒體應用程序的構建,特別是音頻和視頻。osmf開源免費,沒有版權紛爭,多數公司也會在此基礎上再次開發。
(17)OSMF支持格式
(I)流媒體格式的音頻,包括mp3,AAC*,Speex和Nellymoser格式
(2)流媒體格式的視頻,包括FLV,F4V,MPEG-4的MP4,F4V和3GPP
(3)漸進式音頻,就是MP3
(4)漸進式視頻,包括FLV,F4V,MP4,MP4V-ES,M4V,3GPP,3GPP2,QuickTime
(5)動態流f4m文件。RTMP和HTTP streaming,RTMP and HTTP Dynamic Streaming,已經RTMP和HTTP live(直播)。
(18)一個播放器要應付多種播放方式:
(I)Rtmp實時流播放:緩衝不緩存,一個大的視頻分割成無數個碎片,每一個碎片又特別小。同時用戶又能夠隨意選擇進度。就難以定位已經加載了多少字節以及總字節。
(II)http 順序流:緩存,播放時也緩衝。字節是順序加載的,因此此方式很容器達到已加載的字節和終字節。
(III)http+rtmp動態流播放:具備http順序流特徵,但內部又是rtmp加載的,狀況更復雜,能夠取得大塊的http字節,但難取得總字節,由於都分塊了,用戶又能夠隨意跳轉。
(IV)http+http動態流:都是順序流播放,但大塊裏邊套小塊。因此也複雜。
(19)動態流直播
(I)動態流直播的必要性:因爲每一個客戶端的網絡情況不一樣,使用的終端不一樣,致使接收數據的速度不一樣,若是都用同一碼率的直播就不合適了。因此直播就須要根據用戶網絡情況選擇一個合適的清晰度。
62.服務器端:
服務器端主要起中轉信息的做用。經常使用的類有:
(1)Application類:表明服務器端的一個應用。好比咱們在FMS安裝目錄下的applications目錄中新建一個文件夾lessonServ,這個lessonServ就是一個應用,Application類就表明這個應用。
(2)Application經常使用方法
(I)Application.acceptConnection()接受一個來自客戶機的至一個應用程序的鏈接。
(II)Application.disconnect()從服務器斷開一個客戶機的鏈接。
(III)Application.rejectConnection()拒絕至一個應用程序的鏈接。
(IV)Application.shutdown()卸載應用程序實例。
(V)Application.broadcastMsg()向全部鏈接的客戶機廣播一條消息。
(3)經常使用屬性
(I)Application.clients一個對象,該對象包含了當前鏈接到這個應用程序的全部客戶的列表
(4)經常使用事件:
(I)Application.onAppStart當這個應用程序被服務器裝載時調用。當第一個客戶鏈接時。自動啓動,一般在這個事件中作一些。
(II)Application.onConnect當客戶機鏈接到這個應用程序時調用。
(III)Application.onDisconnect當一個客戶機從這個應用程序斷開鏈接時調用。
(IV)Application.onAppStop當這個應用程序被服務器卸載時調用。當第最後一個客戶斷開時,自動關閉。
63.服務器端Client類:服務器客戶端,這個類表明鏈接到服務器上的一個客戶端,每個鏈接到服務上的客戶端,服務器自動建立相應client實例,可經過此實例知道客戶端的信息,如客戶的Ip地址等。
(1)Client類經常使用方法
(I)Client.call()在Flash客戶機上異步的執行一個方法,並把值從Flash客戶機返回到服務器。
(II)Client.readAccess()發送一個「ping」消息至客戶機。若是客戶機響應了,則這個方法返回true;不然,返回false。
(2)經常使用屬性
(I)Client.ip 只讀;Flash客戶機的IP地址
(II)Client.protocol只讀;客戶機用來鏈接到服務器的協議。
(III)Client.referrer只讀;發起這個鏈接的SWF文件或服務器的URL。
64.真實客戶端:
(1)主要負責發送消息,接收信息與用戶交互等。經常使用類NetConnection網絡鏈接,Responder響應器等。
(2)NetConnection類讓客戶端與服務器上的應用程序實例之間創建雙向鏈接。
(3)Responder類:取得異步調用的結果
(4)NetConnection類經常使用方法
(I)connect(command:String,...arguments):void 在Flash Player和Flash Media Server應用程序之間建立雙向鏈接。注意:arguments是可選參數的意思。在發起鏈接時,能夠把相關參數一同發往服務器端。好比把:用戶名和密碼發往服務器,服務器驗證後返回結果。
(II)call(command:string,responder:Responder,...arguments):void 在Flash Media Server或運行Flash Remoting的應用程序服務器上調用一個命令或方法。注意:responder。
(5)NetConnection類經常使用屬性
(I)client屬性:指示應對其調用回調方法的對象。默認值爲此NetConnection實例。若是將client屬性設置爲另外一個對象,則將對該對象調用回調方法。
(6)NetConnection類經常使用事件
(I)netStatus:在NetConnection對象報告其狀態或錯誤條件時調度。netStatus事件包含一個info屬性,該屬性是一個包含事件特定信息(例如:鏈接嘗試成功仍是失敗)的信息對象。
(7)Responder類經常使用方法
(I)Responder(result:Function,status:Function=null):建立一個新的Responder對象。能夠將Responder對象傳遞給NetConnection.call(),以處理來自服務器的返回值。能夠爲兩個參數之一或兩個參數都傳遞null。參數:result:function 若是對服務器的調用成功並返回結果,則此函數被調用。status:Function(default=null):若是服務器返回一個錯誤,則此函數被調用。
65.文本聊天室
(1)綜合使用Application,Client,ShareObject等對象。
(2)須要共享的地方:
(I)用戶聊天的內容,用文本的形式存放在ShareObject對象data屬性中的context(本身定義的)
(II)用戶列表,用數組的形式存放在放在ShareObject對象的data屬性中userlist(本身定義的)
(3)注意事項:既然咱們知道須要創建哪些共享對象,因此直接在服務器端創建好,有客戶鏈接上時就直接使用了。但要注意與客戶端對象有基礎不一樣,但含義是同樣的。
(I)服務器端:Get("名稱","是否永久保存") 客戶端:getRemote("名稱".路徑,是否永久保存) 做用:取得共享對象,若是沒有就自動創建。
(II)服務器端:getProperty(屬性名稱) 客戶端:data."屬性名稱" 做用:取得共享對象的某個屬性,也就是數據存放的地方。
(III)共同部分:setProperty(「屬性名稱」,值):都是設置共享對象的屬性,並同步更新客戶端。
66.視頻播放器
(1)媒體類(media):視頻類(Video),聲音類(Sound)。以及與他們相關的硬件設備,好比:攝像頭(Camera),麥克風(Microphone)等有關的類庫都放在了媒體類中了。
(2)視頻顯示類:
(I)FLVPlayback播放器:FLVPlayback擴展了Sprite類幷包裝VideoPlayer對象。這個VideoPlayer對象,也擴展了Video類。Video類是最基層的一個視頻顯示對象,功能相對較少,但使用視頻捕獲,攝像時仍是要用Video類的。簡單理解還能夠認爲FLVPlayback具備皮膚外觀,好比播放,中止,跳轉等功能,用來播放視頻很合適。而Video類沒有皮膚外觀,但他有視頻頭,麥克風等捕獲獲視頻或聲音的方法,能夠用來製做發佈端。
(II)基於OSMF框架的播放器:功能比FLVPlayback播放器更增強大。但主要仍是用來作視頻播放,不用來作視頻發佈。
(III)對比結果:在視頻聊天還用不到FLVPLayback,OSMF等播放器參與播放。只用Video類就能夠了。
(3)Video類是顯示對象,把視頻顯示到界面上。攝像頭捕獲的視頻得經過顯示對象顯示,才能看到。經常使用方法:
(I)Video(width:int=320,height:int=240) 建立新的Video實例
(II)attachCamera(camera:Camera):void 顯示的來自攝像頭的視頻流
(III)attachNetStream(netStream):void 顯示的視頻流。
(4)Camera類:能夠捕獲攝像頭中的視頻。並可以使用NetConnection和NetStream類可將視頻傳輸到Flash Media Server。FMS能夠將視頻流發送其它客戶端廣播此視頻流。
(5)經常使用方法:getCamera(name:String=null):Camera 靜態方法。能夠直接使用,沒必要實例化。
(6)NetStream:NetStream類再Flash Player和Flash Media Server之間或者Flash Player和本地文本系統之間打開單向流鏈接。NetStream對象是NetConnection對象中的一個通道。也就是說一個NetStream流對象要麼接收,要麼發送,不能同時放生。若是要同時發生,就建兩個NetStream流一個用來發送,一個用來接收,這也就是通道的意思,一個鏈接能夠有多個通道,每一個通道負責一件事情,不如:接收視頻或發佈視頻。
(7)此通道可使用NetStream publish()發佈流,也可使用NetStream.play()訂閱發佈的流並接收數據。
67.聊天大廳
(1)既然你們都能看到,那就使用ShareObject共享對象。把各個客戶端發佈的流名稱用數組的形式存儲到共享對象的data屬性中。
(2)流名稱不要重複,確保惟一。嚴格的話用client.ID來確保惟一,不嚴的話用隨機數代替。
(3)發佈視頻時,鏈接對象netconnet,流對象netstream,攝像頭,麥克風等都作爲全局變量使用,避免出錯。接收視頻時,不須要用全局變量。
(4)爲了方便多個視頻展現,使用了TileList控件,可自動排列。
(5)既然知道了須要創建共享對象和數組了,那麼咱們就在服務器端創建好,客戶端直接使用。反正都要建,我的以爲把公用的對象,在服務器端創建思路順點。
(6)作好後,發佈到web服務器上,這樣就能夠多人共享視頻了。
68.ShareObject中data屬性能夠存聽任何對象是不對的,精靈和影片剪輯不行。簡單的數據類型,數組和對象{name:SSS}能夠。
69.同步時間:SyncEvent.SYNC:是同步時間。即不管服務器端仍是客戶端只要使用了setProperty方法後,就會通知服務器該屬性的值已更改,而服務器上的ShareObject一變化,各個客戶端就出發這個同步事件。
70.AS3與js交互無非兩種狀況
(1):AS3調用js函數
(I)Externallnterface(functionName:,arguments)://AS3Code
(II)注意事項:調用時js函數應該先準備好
(2)JS調用as3.0函數
(I)註冊JS中調用的函數名(第一個參數),Externallnterface(functionName:closure:)
(II)寫對應的處理函數(第二個參數)
(III)JS部分:設置頁面中SWFObject的ID屬性
(IV)調用window.ID.functionName(Paraments...)。
(V)注意事項:JS調用AS3.0時須要確保SWF已成功加載
(3)Externallnterface類是外部API,這是一個在ActionScript和Flash Player容器之間實現直接通訊的應用程序編程接口,例如,包含JavaScript的HTML頁。Adobe建議使用Externallterface實現JavaScript與ActionScript之間的全部通訊。