重庆幸运农场中奖金额|重庆幸运农场官网
MyException - 我的異常網
當前位置:我的異常網» Flash » Flash/Flex學習札記(21):粒子效果

Flash/Flex學習札記(21):粒子效果

www.h0f1.com  網友分享于:2013-10-17  瀏覽:6次
Flash/Flex學習筆記(21):粒子效果

粒子爆炸:

仍然要用到以前的小球類,不過稍加改造


package {

import flash.display.Sprite;

//小球 類

public class Ball extends Sprite {


public var radius:uint;//半徑

public var color:uint;//顏色


public var vx:Number=0;//x軸速度

public var vy:Number=0;//y軸速度

public function Ball(r:Number=50,c:uint=0xff0000) {

this.radius=r;

this.color=c;

init();

?
}

private function init():void {

graphics.beginFill(color);

?
graphics.drawCircle(0,0,radius);

?
graphics.endFill();

?
}

?
}

?
}

增加了x,y軸的速度,其它沒變

原理:在舞臺的某一區域放置大量小球實例,然后在某個時刻讓其向四面八方運動即可(即改變每個小球在x,y軸上的坐標)

問題:效率!讓CPU在每幀對于大量對象進行重繪是很耗資源的,所以當小球跑出舞臺邊界時,得想辦法通知CPU:這些小球不需要再處理了(反正也看不見)!否則純屬折騰CPU,下面的代碼用一個數組存放所有對象實例的引用,然后在EnterFrame事件中不斷檢測,一旦有對象跑出邊界了,就將其清除,不再理會了.

import fl.controls.Label;

?
import flash.text.TextFieldAutoSize;

?
stage.scaleMode=StageScaleMode.NO_SCALE;

?
stage.align=StageAlign.TOP_LEFT;

?
var Count:Number=1500;

?
var Radius:uint=30;

?
var CenterX:uint=stage.stageWidth/2;

?
var CenterY:uint=stage.stageHeight/2;

var ArrBall:Array=new Array(Count);


//讓小球呈圓形隨機分布

?
for (var i=0; i<ArrBall.length; i++) {

?
ArrBall[i]=new Ball(Math.random() * 5,Math.random() * 0xff0000);

?
var angle:Number=Math.random()*Math.PI*2;

var RadiusRnd:Number=Math.random()*Radius;

?
ArrBall[i].x=CenterX+Math.cos(angle)*RadiusRnd;

ArrBall[i].y=CenterY+Math.sin(angle)*RadiusRnd;


addChild(ArrBall[i]);

?
}

?
var lbl1:Label = new Label();

?
lbl1.text="點擊鼠標引爆這個球";

?
lbl1.autoSize=TextFieldAutoSize.CENTER;

?
lbl1.x=stage.stageWidth/2-lbl1.width/2;

?
lbl1.y=50;

Mouse.cursor=MouseCursor.BUTTON;

?
addChild(lbl1);

?
stage.addEventListener(MouseEvent.MOUSE_MOVE,MouseMoveHandler);

?
stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler);

?
//文件鼠標跟隨

?
function MouseMoveHandler(e:MouseEvent):void {

?
lbl1.x=mouseX+15;

?
lbl1.y=mouseY+15;


}

?
function MouseDownHandler(e:MouseEvent):void {

?
//點擊一次后,取消鼠標跟隨,并移除lbl1,同時也取消鼠標點擊事件(即本事件僅觸發一次)

?
Mouse.cursor=MouseCursor.ARROW;

?
stage.removeEventListener(MouseEvent.MOUSE_MOVE,MouseMoveHandler);


lbl1.visible=false;

?
removeChild(lbl1);

?
stage.removeEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler);

?
InitVelocity();//初始化粒子速度

?
addEventListener(Event.ENTER_FRAME,EnterFrameHandler);

?
}

?
function InitVelocity() {

?
for (var i=0; i<ArrBall.length; i++) {

?
ArrBall[i].vx = (Math.random()*2-1) * 30 ;//注意這里的小技巧: Math.random()*2-1即得到一個在-1到1之間分布的隨機小數,即小球隨機向左或向右的初始速度,然后再放大N倍,得到x軸最終速度

?
ArrBall[i].vy = (Math.random()*2-1) * 30;


}

?
}

?
function EnterFrameHandler(e:Event):void {

?
for (i=ArrBall.length-1; i>=0; i--) {

var ball:Ball = ArrBall[i];?????


ball.x += (ball.vx );

?
ball.y += (ball.vy );???????


//檢測邊界,如果超出屏幕則移除該對象(注:從舞臺上移除不再使用的對象,能使CPU占用率有效降低)???????

?
if (ball.x < -ball.width/2 || ball.x > stage.stageWidth + ball.width/2 || ball.y< -ball.height/2 || ball.y > stage.stageHeight + ball.height/2){????????

?
removeChild(ball);


ArrBall.splice(i,1);

?
}

?
//如果數組已經為空,則清除EnterFrame事件

?
if (ArrBall.length==0){

?
removeEventListener(Event.ENTER_FRAME,EnterFrameHandler);

?
}

?
//trace(ArrBall.length);

?
}

?
}

粒子噴射:

如果看過上篇Flash/Flex學習筆記:運動學原理 并動手實踐過"自由落體運動"的朋友,對于這種粒子效果可能比較容易理解。

原理:將所有粒子聚集于屏幕上某點(本例中為屏幕底部中心點),然后賦給一個隨機向上的速度(這樣就能向上噴射出),同時為了更效果更自然,還要加入隨機的x軸方向速度(以實現噴射過程中的擴散),最后再加入重力加速度,以實現粒子的自由回落。

效率:為了能最大限度的利用現有對象,當粒子跑出舞臺邊界時,重新用代碼將其定位到發射點,以便下次繼續噴射。

交互:本例中為增強交互性,用鼠標的x軸位置模擬了風力影響。(在水平方向移動鼠標可看到噴射方向略有變化)


package {

?
import flash.display.Sprite;

import flash.display.StageAlign;


import flash.display.StageScaleMode;

import flash.events.Event;


public class Fountain extends Sprite {


private var count:int=3000;

?
private var wind:Number=0.0;

?
private var gravity:Number=0.3;

?
private var balls:Array;

public function Fountain() {

init();


}

private function init():void {

?
stage.scaleMode=StageScaleMode.NO_SCALE;

?
stage.align=StageAlign.TOP_LEFT;

?
balls = new Array();

?
for (var i:int = 0; i < count; i++) {


var ball:Ball=new Ball(1,0xffffff);

?
ball.x=stage.stageWidth/2;


ball.y=stage.stageHeight;

?
ball.vx = (Math.random()*2-1) * 1.5 + wind;

?
ball.vy=-5+Math.random()*-10;


addChild(ball);

?
balls.push(ball);

?
}

?
addEventListener(Event.ENTER_FRAME, onEnterFrame);

}

?
private function onEnterFrame(event:Event):void {

?
wind = -1*(mouseX - stage.stageWidth/2)/200;


for (var i:Number = 0; i < balls.length; i++) {

?
var ball:Ball=Ball(balls[i]);

?
ball.vy+=gravity;

?
ball.x+=ball.vx;

?
ball.y+=ball.vy;

?
if (ball.x > stage.stageWidth + ball.radius || ball.x < -ball.radius || ball.y >stage.stageHeight + ball.radius || ball.y<-ball.radius) {

?
ball.x=stage.stageWidth/2;

?
ball.y=stage.stageHeight;

?
ball.vx = (Math.random()*2-1) * 1.5 + wind;

?
ball.vy=-5+Math.random()*-10;

?
}

?
}

?
}

?
}

?
}

粒子跟隨:

除了利用邊界檢測移除粒子外,在實際開發中也經常利用時間來判斷,比如一個對象在舞臺上存活幾秒后,便將其干掉。

stage.addEventListener(MouseEvent.MOUSE_MOVE,MouseMoveHandler);

?
function MouseMoveHandler(e:MouseEvent):void{

?
var ball:Ball = new Ball(Math.random()*3,0x00ff00);

?
ball.x = mouseX;


ball.y = mouseY;

?
ball.vx = (Math.random()*2-1)*3;

?
ball.vy = (Math.random()*2-1)*3;


addChild(ball);

?
ball.addEventListener(Event.ENTER_FRAME,EnterFrameHandler);

?
}

?
function EnterFrameHandler(e:Event):void{

?
var ball:Ball = e.target as Ball;


ball.x += ball.vx;

ball.y += ball.vy;

?
ball.count ++;

?
if (ball.count>=50){

ball.removeEventListener(Event.ENTER_FRAME,EnterFrameHandler);

?
removeChild(ball);??????

?
}

?
}

注:需要先在Ball類中增加一個public var count:uint=0;變量(用來輔助計時),上面的代碼中用 if ball.count>=50做判斷,相當于每個小球只讓其播放50幀對應的時間就壽終正寢

模擬布朗運動:

var Count:Number=200;

?
//初始化

?
for (var i:Number=0; i<=Count; i++) {

?
var ball:Ball=new Ball(Math.random()*3,0x00ff00);

?
ball.x=Math.random()*stage.stageWidth;

?
ball.y=Math.random()*stage.stageHeight;


ball.vx=ball.vy=0;

?
addChild(ball);

ball.addEventListener(Event.ENTER_FRAME,EnterFrameHandler);

?
}

?
function EnterFrameHandler(e:Event):void {

?
var ball:Ball=e.target as Ball;

?
//每一幀讓其速度隨機變化一點點

?
ball.vx += (Math.random()*2-1)*2;

?
ball.vy += (Math.random()*2-1)*2;

?

ball.x+=ball.vx;

?
ball.y+=ball.vy;


//超出邊界后,先讓其反向運動一次(即:退回原處),然后速度反向

?
if (ball.x>stage.stageWidth-ball.width/2||ball.x<ball.width/2) {

ball.x-=ball.vx;

?
ball.vx*=-1;

}


if (ball.y>stage.stageHeight-ball.height/2||ball.y<ball.height/2) {

?
ball.y-=ball.vy;

?
ball.vy*=-1;

?
}

?
//加入摩擦力因子,看起來更自然

?
ball.vx=ball.vx*0.9;

ball.vy=ball.vy*0.9;

?
}

文章評論

漫畫:程序員的工作
漫畫:程序員的工作
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
如何區分一個程序員是“老手“還是“新手“?
如何區分一個程序員是“老手“還是“新手“?
如何成為一名黑客
如何成為一名黑客
程序員的一天:一寸光陰一寸金
程序員的一天:一寸光陰一寸金
程序員最害怕的5件事 你中招了嗎?
程序員最害怕的5件事 你中招了嗎?
要嫁就嫁程序猿—錢多話少死的早
要嫁就嫁程序猿—錢多話少死的早
Web開發者需具備的8個好習慣
Web開發者需具備的8個好習慣
10個幫程序員減壓放松的網站
10個幫程序員減壓放松的網站
聊聊HTTPS和SSL/TLS協議
聊聊HTTPS和SSL/TLS協議
當下全球最炙手可熱的八位少年創業者
當下全球最炙手可熱的八位少年創業者
團隊中“技術大拿”并非越多越好
團隊中“技術大拿”并非越多越好
看13位CEO、創始人和高管如何提高工作效率
看13位CEO、創始人和高管如何提高工作效率
程序員眼里IE瀏覽器是什么樣的
程序員眼里IE瀏覽器是什么樣的
60個開發者不容錯過的免費資源庫
60個開發者不容錯過的免費資源庫
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
不懂技術不要對懂技術的人說這很容易實現
不懂技術不要對懂技術的人說這很容易實現
為什么程序員都是夜貓子
為什么程序員都是夜貓子
編程語言是女人
編程語言是女人
代碼女神橫空出世
代碼女神橫空出世
寫給自己也寫給你 自己到底該何去何從
寫給自己也寫給你 自己到底該何去何從
程序員周末都喜歡做什么?
程序員周末都喜歡做什么?
十大編程算法助程序員走上高手之路
十大編程算法助程序員走上高手之路
老程序員的下場
老程序員的下場
什么才是優秀的用戶界面設計
什么才是優秀的用戶界面設計
我跳槽是因為他們的顯示器更大
我跳槽是因為他們的顯示器更大
Web開發人員為什么越來越懶了?
Web開發人員為什么越來越懶了?
5款最佳正則表達式編輯調試器
5款最佳正則表達式編輯調試器
程序員和編碼員之間的區別
程序員和編碼員之間的區別
旅行,寫作,編程
旅行,寫作,編程
Java 與 .NET 的平臺發展之爭
Java 與 .NET 的平臺發展之爭
為啥Android手機總會越用越慢?
為啥Android手機總會越用越慢?
 程序員的樣子
程序員的樣子
“懶”出效率是程序員的美德
“懶”出效率是程序員的美德
中美印日四國程序員比較
中美印日四國程序員比較
一個程序員的時間管理
一個程序員的時間管理
程序員的鄙視鏈
程序員的鄙視鏈
做程序猿的老婆應該注意的一些事情
做程序猿的老婆應該注意的一些事情
親愛的項目經理,我恨你
親愛的項目經理,我恨你
我是如何打敗拖延癥的
我是如何打敗拖延癥的
初級 vs 高級開發者 哪個性價比更高?
初級 vs 高級開發者 哪個性價比更高?
10個調試和排錯的小建議
10個調試和排錯的小建議
Java程序員必看電影
Java程序員必看電影
每天工作4小時的程序員
每天工作4小時的程序員
鮮為人知的編程真相
鮮為人知的編程真相
軟件開發程序錯誤異常ExceptionCopyright © 2009-2015 MyException 版權所有
重庆幸运农场中奖金额 彩票数据中心 六码的层进式倍投法 捕鱼来了稳定上分设置 双色球蓝球高%比公式 极速快三怎么判断大小单双 飞禽走兽游戏机说明书网上 ag金拉霸老虎机压分 3d开奖号 pk10最牛稳赚前五公式 30天100元9码滚雪球图 股票行情大盘走势直播 足球比分直播90vs 大乐透规则及中奖规则 真人街机捕鱼游戏 黑马股票推荐分析 澳洲幸运8开奖现场