Flash AS3.0 實(shí)例教程 噴泉?jiǎng)赢?huà)特效
發(fā)布時(shí)間:2009-06-12 23:34:26 作者:佚名
我要評(píng)論
在這個(gè)實(shí)例教程中,我們將介紹利用速度向量和重置對(duì)象的技巧來(lái)實(shí)現(xiàn)噴泉效果。所謂向量就是有方向的量。比如一輛車(chē)從東向西以80公里每小時(shí)的速度行駛,那么我們就可以得到汽車(chē)的速度向量,它包括兩個(gè)元素:速度,每小時(shí)80公里,方向,由東向西。
下面我們來(lái)分析一下噴泉
在這個(gè)實(shí)例教程中,我們將介紹利用速度向量和重置對(duì)象的技巧來(lái)實(shí)現(xiàn)噴泉效果。所謂向量就是有方向的量。比如一輛車(chē)從東向西以80公里每小時(shí)的速度行駛,那么我們就可以得到汽車(chē)的速度向量,它包括兩個(gè)元素:速度,每小時(shí)80公里,方向,由東向西。
下面我們來(lái)分析一下噴泉是怎樣形成的。
噴泉是若干個(gè)水珠向上噴射,然后又受重力影響掉回地面。這個(gè)過(guò)程的速度向量有哪些,具體又是怎么的呢?很容易發(fā)現(xiàn)至少的兩個(gè)力,一個(gè)是使水珠向上噴射的外力,一個(gè)是使水珠掉回地面的重力。
外力的速度向量:速度我設(shè)為10-20間的隨機(jī)數(shù),方向是向上的那就一定是y軸上的負(fù)數(shù)了。將這個(gè)速度向量加到水珠上就使水珠向上噴射了。
具體做法是:在ENTER_FRAME事件中這水珠的y 值加上-10到-20間的一個(gè)隨機(jī)數(shù)。
重力的速度向量:速度就比較小了我設(shè)為0.5,方向則是y軸上的正值。同樣加到ENTER_FRAME事件中,這樣水珠在噴射后就會(huì)掉回地上。
還有個(gè)問(wèn)題,因?yàn)樗俣认蛄渴羌釉贓NTER_FRAME事件中的,水珠就可能一直按這些速度向量運(yùn)動(dòng),面遠(yuǎn)離舞臺(tái),那噴泉就不知會(huì)噴到什么地方去了。
要解決這個(gè)問(wèn)題,就要將超出舞臺(tái)邊界的水珠重新定位到噴射口,這樣就形成了不間斷的噴射了。
好了,上面分析了效果產(chǎn)生方法,下面就來(lái)制作。
第一步是要畫(huà)一個(gè)水珠,新建一個(gè)影片剪輯元件,用放射填充畫(huà)一個(gè)橢圓,左色標(biāo)為白色,透明度100%,右色標(biāo)略帶點(diǎn)灰色,透明度50%。在屬性面板中設(shè)置橢圓在寬為2像素,高為5像素。在庫(kù)中右擊該元件,打開(kāi)連接窗口,(cs4打開(kāi)屬性窗口),設(shè)置一個(gè)類(lèi)名,我設(shè)的是 pall。
接下來(lái)回到主場(chǎng)景,打開(kāi)幀動(dòng)作面板,我們來(lái)寫(xiě)代碼。
噴泉是由若干水珠形成的,多少呢?我整了500個(gè):
var count:int = 500;
重力速度向量:
var zl:Number = 0.5;
將這500個(gè)水珠放到一個(gè)數(shù)組中:
var balls:Array;
balls = new Array();
用一個(gè)for循環(huán)來(lái)將500個(gè)水珠放到數(shù)組中:
for (var i:int = 0; i < count; i++) {
var ball:pall = new pall();
將水珠定位到水珠的噴射口:
ball.x = 260;
ball.y = 200;
在x軸方向也設(shè)一個(gè)速度向量,使水珠在x軸的一定范圍內(nèi),并將這個(gè)速度向量存到每個(gè)水珠的自定義屬性vx中:
ball["vx"]= Math.random() * 2 - 1;
下面是y軸方向的速度向量,將它存在自定義屬性vy中:
ball["vy"] = Math.random() * -10 - 10;
將水珠放到舞臺(tái)上,并存到數(shù)組中:
addChild(ball);
balls.push(ball);
接下來(lái)偵聽(tīng)ENTER_FRAME事件,實(shí)現(xiàn)噴泉效果:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
onEnterFrame函數(shù)內(nèi)容:
通過(guò)一個(gè)for循環(huán)為數(shù)組中的水珠加上各個(gè)速度向量:
for (var i:Number = 0; i < balls.length; i++) {
var ball:pall = pall(balls);
首選在噴射速度向量上加上重力速度向量,這樣每一幀的時(shí)間就會(huì)加一次重力,而噴射力卻沒(méi)變,這樣重力就會(huì)逐漸超過(guò)噴射力面使水珠下落:
ball["vy"] += zl;
將x,y軸速度向量加到水珠上:
ball.x +=ball["vx"];
ball.y +=ball["vy"];
接下來(lái)的是看水珠是否超出了舞臺(tái),如果超出了舞臺(tái),則將水珠重新定位到噴射口,并將速度向量設(shè)為初始狀態(tài)。
if (ball.x - ball.width/2> stage.stageWidth ||
ball.x + ball.width/2 < 0 ||
ball.y - ball.width/2 > stage.stageHeight ||
ball.y + ball.width/2 < 0) {
ball.x = 260;
ball.y = 200;
ball["vx"]= Math.random() * 2 - 1;
ball["vy"] = Math.random() * -10 - 10;
完整代碼: var count:int = 500; var zl:Number = 0.5;
var balls:Array;
balls = new Array();
for (var i:int = 0; i < count; i++) {
var ball:pall = new pall();
ball.x = 260;
ball.y = 200;
ball["vx"]= Math.random() * 2 - 1;
ball["vy"] = Math.random() * -10 - 10;
addChild(ball);
balls.push(ball);
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(event:Event):void {
for (var i:Number = 0; i < balls.length; i++) {
var ball:pall = pall(balls[i]);
ball["vy"] += zl;
ball.x +=ball["vx"];
ball.y +=ball["vy"];
if (ball.x - ball.width/2> stage.stageWidth ||
ball.x + ball.width/2 < 0 ||
ball.y - ball.width/2 > stage.stageHeight ||
ball.y + ball.width/2 < 0) {
ball.x = 260;
ball.y = 200;
ball["vx"]= Math.random() * 2 - 1;
ball["vy"] = Math.random() * -10 - 10;
}
}
}
下面我們來(lái)分析一下噴泉是怎樣形成的。
噴泉是若干個(gè)水珠向上噴射,然后又受重力影響掉回地面。這個(gè)過(guò)程的速度向量有哪些,具體又是怎么的呢?很容易發(fā)現(xiàn)至少的兩個(gè)力,一個(gè)是使水珠向上噴射的外力,一個(gè)是使水珠掉回地面的重力。
外力的速度向量:速度我設(shè)為10-20間的隨機(jī)數(shù),方向是向上的那就一定是y軸上的負(fù)數(shù)了。將這個(gè)速度向量加到水珠上就使水珠向上噴射了。
具體做法是:在ENTER_FRAME事件中這水珠的y 值加上-10到-20間的一個(gè)隨機(jī)數(shù)。
重力的速度向量:速度就比較小了我設(shè)為0.5,方向則是y軸上的正值。同樣加到ENTER_FRAME事件中,這樣水珠在噴射后就會(huì)掉回地上。
還有個(gè)問(wèn)題,因?yàn)樗俣认蛄渴羌釉贓NTER_FRAME事件中的,水珠就可能一直按這些速度向量運(yùn)動(dòng),面遠(yuǎn)離舞臺(tái),那噴泉就不知會(huì)噴到什么地方去了。
要解決這個(gè)問(wèn)題,就要將超出舞臺(tái)邊界的水珠重新定位到噴射口,這樣就形成了不間斷的噴射了。
好了,上面分析了效果產(chǎn)生方法,下面就來(lái)制作。
第一步是要畫(huà)一個(gè)水珠,新建一個(gè)影片剪輯元件,用放射填充畫(huà)一個(gè)橢圓,左色標(biāo)為白色,透明度100%,右色標(biāo)略帶點(diǎn)灰色,透明度50%。在屬性面板中設(shè)置橢圓在寬為2像素,高為5像素。在庫(kù)中右擊該元件,打開(kāi)連接窗口,(cs4打開(kāi)屬性窗口),設(shè)置一個(gè)類(lèi)名,我設(shè)的是 pall。
接下來(lái)回到主場(chǎng)景,打開(kāi)幀動(dòng)作面板,我們來(lái)寫(xiě)代碼。
噴泉是由若干水珠形成的,多少呢?我整了500個(gè):
var count:int = 500;
重力速度向量:
var zl:Number = 0.5;
將這500個(gè)水珠放到一個(gè)數(shù)組中:
var balls:Array;
balls = new Array();
用一個(gè)for循環(huán)來(lái)將500個(gè)水珠放到數(shù)組中:
for (var i:int = 0; i < count; i++) {
var ball:pall = new pall();
將水珠定位到水珠的噴射口:
ball.x = 260;
ball.y = 200;
在x軸方向也設(shè)一個(gè)速度向量,使水珠在x軸的一定范圍內(nèi),并將這個(gè)速度向量存到每個(gè)水珠的自定義屬性vx中:
ball["vx"]= Math.random() * 2 - 1;
下面是y軸方向的速度向量,將它存在自定義屬性vy中:
ball["vy"] = Math.random() * -10 - 10;
將水珠放到舞臺(tái)上,并存到數(shù)組中:
addChild(ball);
balls.push(ball);
接下來(lái)偵聽(tīng)ENTER_FRAME事件,實(shí)現(xiàn)噴泉效果:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
onEnterFrame函數(shù)內(nèi)容:
通過(guò)一個(gè)for循環(huán)為數(shù)組中的水珠加上各個(gè)速度向量:
for (var i:Number = 0; i < balls.length; i++) {
var ball:pall = pall(balls);
首選在噴射速度向量上加上重力速度向量,這樣每一幀的時(shí)間就會(huì)加一次重力,而噴射力卻沒(méi)變,這樣重力就會(huì)逐漸超過(guò)噴射力面使水珠下落:
ball["vy"] += zl;
將x,y軸速度向量加到水珠上:
ball.x +=ball["vx"];
ball.y +=ball["vy"];
接下來(lái)的是看水珠是否超出了舞臺(tái),如果超出了舞臺(tái),則將水珠重新定位到噴射口,并將速度向量設(shè)為初始狀態(tài)。
if (ball.x - ball.width/2> stage.stageWidth ||
ball.x + ball.width/2 < 0 ||
ball.y - ball.width/2 > stage.stageHeight ||
ball.y + ball.width/2 < 0) {
ball.x = 260;
ball.y = 200;
ball["vx"]= Math.random() * 2 - 1;
ball["vy"] = Math.random() * -10 - 10;
完整代碼: var count:int = 500; var zl:Number = 0.5;
var balls:Array;
balls = new Array();
for (var i:int = 0; i < count; i++) {
var ball:pall = new pall();
ball.x = 260;
ball.y = 200;
ball["vx"]= Math.random() * 2 - 1;
ball["vy"] = Math.random() * -10 - 10;
addChild(ball);
balls.push(ball);
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(event:Event):void {
for (var i:Number = 0; i < balls.length; i++) {
var ball:pall = pall(balls[i]);
ball["vy"] += zl;
ball.x +=ball["vx"];
ball.y +=ball["vy"];
if (ball.x - ball.width/2> stage.stageWidth ||
ball.x + ball.width/2 < 0 ||
ball.y - ball.width/2 > stage.stageHeight ||
ball.y + ball.width/2 < 0) {
ball.x = 260;
ball.y = 200;
ball["vx"]= Math.random() * 2 - 1;
ball["vy"] = Math.random() * -10 - 10;
}
}
}
相關(guān)文章

flash cs6鼠標(biāo)跟隨效果實(shí)現(xiàn)代碼分享
flash cs6想要實(shí)現(xiàn)鼠標(biāo)跟隨效果?該怎么制作呢?今天我們就來(lái)看看使用as2.0實(shí)現(xiàn)鼠標(biāo)跟隨效果的教程,需要的朋友可以參考下2019-05-19
Flash cs6怎么使用代碼輸入中英文文本?Flash cs6中可以使用文字工具直接輸入文本,也可以使用代碼來(lái)輸入文本,該怎么使用代碼輸入文本呢?請(qǐng)看下文詳細(xì)的教程,需要的朋友2018-03-11
flash as3.0抽象類(lèi)怎么定義? as3.0中有很多抽象類(lèi),該怎么定義抽象類(lèi)和抽象方法呢?下面我們就來(lái)看看簡(jiǎn)單的例子,需要的朋友可以參考下http://www.fzitv.net/softs/408402.2018-02-28
flash cs6中怎么使用ActionScript3.0?
flash cs6中怎么使用ActionScript3.0?flash cs6中想要使用ActionScript3.0功能,該怎么使用呢?下面我們就來(lái)看看詳細(xì)的教程,需要的朋友可以參考下2018-01-25
Flash中怎么實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊決定圖像位置?
本教程給大家分享一個(gè)Flash小教程,教大家在Flash CS6中怎么實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊決定圖像位置?方法很簡(jiǎn)單,感興趣的朋友歡迎前來(lái)一起分享學(xué)習(xí)2018-01-12
Flash中如何用代碼將圖片放在自己想要的舞臺(tái)位置?
本教程教腳本之家的ActionScript教程學(xué)習(xí)者在Flash中如何用代碼將圖片放在自己想要的舞臺(tái)位置,教程講解的詳細(xì),感興趣的朋友歡迎前來(lái)分享學(xué)習(xí)2017-11-20
在Flash CS6中使用with函數(shù)繪制背景圖教程
本教程教腳本之家的ActionScript教程學(xué)習(xí)者如何在Flash CS6中使用with函數(shù)繪制背景圖?教程一步步講解的挺詳細(xì),方法也不難,非常適合Flash新手入門(mén)學(xué)習(xí)2017-11-18
Flash怎么設(shè)置元件坐標(biāo)?flash使用代碼設(shè)置元件的坐標(biāo)的教程
Flash怎么設(shè)置元件坐標(biāo)?flash中導(dǎo)如的元件需要添加坐標(biāo),該怎么定位元件坐標(biāo)呢?下面我們就來(lái)看看flash使用代碼設(shè)置元件的坐標(biāo)的教程,需要的朋友可以參考下2017-10-11
Flash怎么制作來(lái)回?fù)u擺的花朵的動(dòng)畫(huà)?
Flash怎么制作來(lái)回?fù)u擺的花朵的動(dòng)畫(huà)?Flash中想要給花朵制作一段搖擺的動(dòng)畫(huà)效果,該怎么制作呢?下面我們就來(lái)看看詳細(xì)的教程,很簡(jiǎn)單,需要的朋友可以參考下2017-05-23
Flash怎么制作流動(dòng)七彩色的文字?想要讓文字動(dòng)起來(lái),該怎么使用flash給文字制作一個(gè)流動(dòng)七彩色的動(dòng)畫(huà)呢?下面我們就來(lái)看看詳細(xì)的教程,需要的朋友可以參考下2017-04-23











