粒子运动效果的模拟
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; } }
我将影片背景色设置为黑色,因为粒子是白的,这样比较舒服。
截图如下:
相关文章推荐
- ANDROID模拟火花粒子的滑动喷射效果
- ANDROID模拟火花粒子的滑动喷射效果
- ANDROID模拟火花粒子的滑动喷射效果
- canvas 模拟小球上抛运动的物理效果
- Unity利用粒子系统模拟下雪积雪效果
- Java模拟八大行星运动效果
- 动态模拟粒子溃堤效果
- [js高手之路]html5 canvas动画教程 - 边界判断与小球粒子模拟喷泉,散弹效果
- 粒子运动模拟 - Verlet积分算法简介
- 模拟流体粒子运动
- 一步一步学Repast 第五章——模拟粒子运动,了解Schedule
- 使用计算着色器(Compute Shader)模拟粒子效果【OpenGL】【GLSL】
- 模拟真实物体运动的js动画库插件-Anima
- 九 手游开发神器 cocos2d-x editor 之粒子效果(ParticleEditor)
- 模拟弹出窗口效果,关闭层之前,不能选择后面的页内容
- Android 模拟一个电子画板同屏的效果
- JavaScript模拟鼠标右键菜单效果
- 原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
- 层展开/关闭 运动缓冲效果
- 鼠标移动而散开的粒子效果