1.跳轉頁面代碼、下載下傳代碼(new URLRequest(下載下傳位址)):
var request1:URLRequest=new URLRequest("http://www.baidu.com/");
navigateToURL(request1);
request1=null;
View Code
2.權限
(1)public :公開權限[類本身+類外部+被繼承]
(2)protected:保護權限[類本身+被繼承]
(I3)private:私有權限[類本身]
3.
(1)子類繼承與父類,子類可以使用父類的public、protected設定的變量和方法。
(2)子類的執行個體化預設調用父類的構造函數
(3)子類通過關鍵字override,可以重寫父類的共有方法。
(4)final關鍵字保證不被繼承。
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);
}
View Code
讀取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);
}
View Code
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();
}
}
}
View Code
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();
}
}
}
View Code
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();
}
}
}
View Code
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;
}
}
}
View Code
單例模式代碼運用
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;
}
}
}
View Code
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 "發起進攻";
}
}
}
View Code
運用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 "發起攻擊";
}
}
}
View Code
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;
};
}
}
View Code
接口
package duixiang.shipeiqi
{
public interface Roles
{
function kill():String;
function say():String;
function judge():String;
function inquire():String;
}
}
View Code
Policeman代碼
package duixiang.shipeiqi
{
public class Policeman extends Adapter
{
public function Policeman()
{
}
override public function inquire():String{
return "問話";
}
}
}
View Code
Assassin代碼
package duixiang.shipeiqi
{
public class Assassin extends Adapter
{
public function Assassin()
{
}
override public function kill():String{
return "刺殺";
}
}
}
View Code
Justicer
package duixiang.shipeiqi
{
public class Justicer extends Adapter
{
public function Justicer()
{
}
override public function judge():String{
return "判斷";
}
}
}
View Code
Villager
package duixiang.shipeiqi
{
public class Villager extends Adapter
{
public function Villager()
{
}
override public function say():String{
return "說話";
}
}
}
View Code
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
}
}
View Code
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();
}
}
}
View Code
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);
}
View Code
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"}]}
View Code
{"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"}]}
View Code
31.點選一個Label跳轉到網頁:
this.Label01.htmlText="<a href=\'http://www.163.com\'><font size=\'30\'color=\'#ff0000\'>4444</font></a>";
View Code
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());//小寫
View Code
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);
View Code
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);
View Code
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 );
}
}
}
View Code
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年以後的毫秒數
View Code
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));//開方
View Code
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 ;
}
}
}
}
View Code
39.向量
(1)弧度=角度*PI/180;
Y=Math.sin(弧度)*大小
X=Math.cos(弧度)*大小
40.碰撞
(1)常見碰撞:形狀間的碰撞,點間碰撞,點與形狀碰撞
(2)
ha1.hitTestPoint(ha2.x+100,ha2.y,false)
View Code
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"] } ) ;
}
}
}
}
}
View Code
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;
}
}
}
View Code
(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);
}
}
}
View Code
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);
}
}
}
View Code
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];
});
}
}
}
View Code
(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);
}
}
}
View Code
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);
}
}
}
View Code
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);
}
}
}
View Code
(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);
}
}
}
View Code
(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);
}
}
}
View Code
(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)畫圓
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiETPwJWZ3ZCMwcTP39zZuBnLENTJENTJ3pVdC5GTx0EVNdXSU50dNpnT0FEROp3YU5UNRR0T3lERNRTQq5EeBpWT0FFVNlXSU9kM4M0T3lFVNdXS6xEMFpWT5tmaOZ3YyI2cKJDT0ljMZVXTzold41WW15UbMFTRE1UeNhlWuZ0ViBXO5xkNNh0YwIFSh9CXt92YuM3YltWas5iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
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);
}
}
}
}
View Code
(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 );
}
}
}
View Code
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);
}
}
}
View Code
(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);
}
}
}
View Code
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) ;
}
}
}
}
//程式運作,點選障礙區報錯
View Code
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);
}
}
}
}
View Code
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++;
});
});
}
}
}
View Code
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);
}
}
}
}
}
View Code
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);
}
}
}
}
}
}
View Code
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;
}
});
});
}
}
}
View Code
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;
}
}
}
View Code
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;
}
}
}
View Code
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];
});
});
}
}
}
View Code
(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 ];
}
});
}
}
}
View Code
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);
}
}
}
View Code
(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();
}
}
}
View Code
(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);
});
}
}
}
View Code
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]);
});
}
}
}
View Code
(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]);
});
}
}
}
View Code
(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];
});
}
}
}
View Code
(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];
});
}
}
}
View Code
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)
});
}
}
}
View Code
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] ;
});
}
}
}
View Code
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;
}
}
}
View Code
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);
}
}
}
View Code
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);
}
}
}
View Code
下拉表
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;
}
});
}
}
}
View Code
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();
});
}
}
}
View Code
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;
});
}
}
}
View Code
(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();
}
}
}
}
View Code
(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;
}
}
}
}
}
View Code
(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() ) ;
}
});
}
}
}
View Code
(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 ;
}
}
}
}
}
View Code
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();
});
}
}
}
View Code
(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();
}
}
}
View Code
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;
}
}
}
View Code
(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 ;
}
}
}
View Code
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;
}
}
}
View Code
(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之間的所有通信。