您的位置:首页 > 其它

粒子运动效果的模拟

2011-10-30 16:51 453 查看
今天上网看见一个网站上这个效果,下面还写了一个公式,好像是高二学过的万有引力,没记住,忘了。现在自己模拟一下,主要是粒子与舞台边缘的碰撞检测以及粒子自身之间距离的计算:

代码如下:

package
{
import flash.display.Sprite;
import flash.events.Event;

/**
* ...
* @author aisajiajiao
*/

[SWF(backgroundColor="0x000000",width="800",height="600")]
public class Main extends Sprite
{
private static const RADIUS_MAX:Number = 50;
private static const MIN_DIST = 100;

private var ballArray:Array = [];
private var ballNumber:Number = 100;

public function Main()
{
initBalls();
stage.addEventListener(Event.ENTER_FRAME,moveBalls);
}

private function initBalls():void
{
for(var i:int = 0;i < ballNumber;i++)
{
var ball:Ball = new Ball(RADIUS_MAX*Math.random());
ball.x = stage.stageWidth * Math.random();
ball.y = stage.stageHeight * Math.random();
ball.vx = Math.random() * 10;
ball.vy = Math.random() * 10;
addChild(ball);
ballArray.push(ball);
}
}

private function moveBalls(e:Event):void
{
//每一帧开始时,清除上一帧绘制的线条,提高性能
graphics.clear();
for(var i:int = 0;i < ballNumber;i++)
{
var ball = ballArray[i] as Ball;
ball.move();
}
//冒泡遍历整个数组来进行划线
drawLine();
//检测小球与舞台边远的碰撞
checkCollision();
}

private function drawLine():void
{
for(var i:int = 0;i < ballNumber - 1;i++)
{
for(var j:int = i+1;j < ballNumber;j++)
{
//勾股定理,计算两个小球之间的距离
var dist:Number = Math.sqrt((ballArray[i].x - ballArray[j].x)*(ballArray[i].x - ballArray[j].x) +
(ballArray[i].y - ballArray[j].y)*(ballArray[i].y - ballArray[j].y));
if(dist < MIN_DIST)
{
//两个小球之间相隔越近,线条就要越要明亮,所以需要1 - dist/MIN_DIST
graphics.lineStyle(2,0xffffff,1 - dist/MIN_DIST);
graphics.moveTo(ballArray[i].x,ballArray[i].y);
graphics.lineTo(ballArray[j].x,ballArray[j].y);
}
}
}
}

private function checkCollision():void
{
for(var i:int = 0;i < ballNumber;i++)
{
var ball = ballArray[i] as Ball;
if(ball.x > stage.stageWidth)
{
ball.x = 0;
}
else if(ball.x < 0)
{
ball.x = stage.stageWidth;
}

if(ball.y > stage.stageHeight)
{
ball.y = 0;
}
else if(ball.y < 0)
{
ball.y = stage.stageHeight;
}
}
}
}

}

import flash.display.GradientType;
import flash.display.Sprite;

//包外类
class Ball extends Sprite
{
private var _radius:Number;
private var _vx:Number = 0;
private var _vy:Number = 0;

public function Ball(radius:Number = 30)
{
_radius = radius;
//设置渐变填充,我喜欢这种效果
graphics.beginGradientFill(GradientType.RADIAL,[0xffffff,0xffffff],[1,0],[0,50]);
graphics.drawCircle(0,0,_radius);
graphics.endFill();
}

//更新坐标以产生动画
public function move():void
{
this.x += this.vx;
this.y += this.vy;
}

public function set radius(value:Number):void
{
_radius = value;
}

public function get radius():Number
{
return _radius;
}

public function set vx(value:Number):void
{
_vx = value;
}

public function get vx():Number
{
return _vx;
}

public function set vy(value:Number):void
{
_vy = value;
}

public function get vy():Number
{
return _vy;
}
}


我将影片背景色设置为黑色,因为粒子是白的,这样比较舒服。

截图如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: