zoukankan      html  css  js  c++  java
  • 发个简单怡情的粒子随机运动

    源码:https://files.cnblogs.com/flash3d/brownianAdvance.rar

    首先要谢谢大哥大姐门提出的意见,老版本的问题,主要还是执行效率。在粒子爆发的时候,大量的开辟内存,还有长时间执行,粒子数量没有加以控制,造成卡机严重。。

    这里本人用面向对象的方法重写了一遍代码,使用缓存来储存原本消失的粒子。下面是重写后的代码

    Item.as

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

    /**
    * ...
    * @author boycy815
    */

    public class Item extends Shape
    {
    private var fx:Number;
    private var vx:Number;
    private var fy:Number;
    private var vy:Number;
    public function Item():void
    {
    this.graphics.beginFill(0xffffff*Math.random());//随机绘制圆的颜色
    this.graphics.drawCircle(-1,-1,2);//画一个半径2,位置是(-1,-1)的圆,这个圆的圆心正好是注册点
    this.graphics.endFill();//结束绘制
    }

    public function init(setx:Number,setY:Number):void
    {
    fx=0;//x方向的力,也可以理解成加速度
    vx=0;//x方向的速度
    fy=0;//y方向的力
    vy = 0;//y方向的速度
    this.x = setx;

    this.y = setY;//以上两句设置初始位置
    this.addEventListener(Event.ENTER_FRAME,go);//为该对象添加ENTER_FRAME事件监听
    }

    private function go(e:Event):void
    {
    fx=Math.random()*2-1;//随机产生一个x方向的力,随机值范围(-1,1)
    fx-=vx*0.05;//为x方向添加一个阻力,该阻力和x方向速度成正比(这个处理是防止粒子移动过快)
    vx+=fx;//将加速度作用到速度上
    this.x+=vx;//再将速度作用于位移
    if (this.x<1||this.x>549)//边界判断,超出边界,执行一下自杀代码
    {

    if (this.parent != null)
    {
    this.parent.removeChild(this);//告诉自己的妈妈,叫她把自己从舞台删了
    }

    this.removeEventListener(Event.ENTER_FRAME, go);//把这个不断执行的函数也删了
    ShapeMannager.addItem(this);//把自己交给缓存储存
    ShapeMannager.total--;//舞台上的数量减1
    return;//直接跳出这个函数,下面就不执行了
    }

    //以下是y方向,同理
    fy=Math.random()*2-1;

    fy-=vy*0.05;
    vy+=fy;
    this.y+=vy;
    if (this.y<1||this.y>399)
    {
    if (this.parent != null)
    {
    this.parent.removeChild(this);//告诉自己的妈妈,叫她把自己从舞台删了
    }

    this.removeEventListener(Event.ENTER_FRAME, go);
    ShapeMannager.addItem(this);
    ShapeMannager.total--;
    return;
    }
    }
    }

    }

    ShapeMannager.as

    package
    {

    /**
    * ...
    * @author boycy815
    */

    public class ShapeMannager//一个管理缓存的类,从舞台消失的粒子暂时保存在缓存
    {

    private static var _cashe:Array = new Array();//缓存数组
    public static var total:int = 0;//计数在场粒子数量的全局变量
    public static function getItem():Item//获取一个粒子
    {

    if (_cashe.length == 0)//如果缓存空了,那么返回新建的粒子
    {

    return (new Item());
    }
    else//如果缓存不为空,返回缓存末尾的粒子,并从缓存删除
    {

    return _cashe.pop();
    }
    }
    public static function addItem(it:Item):void//往缓存内添加粒子
    {

    _cashe.push(it);
    }
    }

    }

    ParticleStorm.as

    package
    {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    /**
    * ...
    * @author boycy815
    */

    public class ParticleStorm extends MovieClip
    {
    public function ParticleStorm():void
    {
    var timer:Timer=new Timer(1000);//声明并初始化一个1秒发生一次的时间发生器
    timer.addEventListener(TimerEvent.TIMER, addIt);//为时间发生器的Timer事件添加事件,以使每1秒能执行一次addIt
    timer.start();//这句不能忘,时间器需要执行开始,才能运行
    }

    private function addIt(e:Event):void//这个函数每1秒被调用一次,作用是在随机位置为舞台补充随机数量的新粒子
    {

    if (ShapeMannager.total < 256)//这句是新加的,一个全局计数total,用来计数在场的所有粒子,要是在场粒子超过256个,就不执行添加
    {

    var n:int = 0;//用于循环的临时变量
    var it:Item;//用来临时储存和操作粒子的变量
    var initX:Number = Math.random() * 550;//随机发生一个舞台上的位置
    var initY:Number = Math.random() * 400;//同上
    var num:int = int(Math.random() * 512);//确定随机添加的数量
    for(n=0;n<num;n++)//每次发生一次,执行num次循环,每循环一次,将产生一个粒子
    {

    it=ShapeMannager.getItem();//新建或者从缓存提取一个粒子
    it.init(initX,initY);//设定初始位置并初始化
    this.addChild(it);//将粒子添加到舞台
    }

    ShapeMannager.total+=num;//在场计数添加num
    }

    }
    }
    }

    总共三个as文件,其中ParticleStorm.as为文档类


    以下是老版本的代码----------------------------------------------------------------------------------------------------

    http://files.cnblogs.com/flash3d/brownian.rar

    flash会每隔5秒爆发512个粒子,粒子进行无规则的运动,超出运动边界的粒子将会被删除。哈哈,就是这么个效果。代码非常简单,利用了一些牛顿物理学的知识。

    很久没有发表文章了,今天突然兴起,做了这么个东西,谈不上什么高科技,但还算有趣。下面我们就把制作过程和代码讲解下。

    第一步:

    建立一个库元件,影片剪辑类型,进入编辑。在第一帧写下如下代码

    this.graphics.beginFill(0xffffff*Math.random());//随机绘制圆的颜色
    this.graphics.drawCircle(-1,-1,2);//画一个半径2,位置是(-1,-1)的圆,这个圆的圆心正好是注册点
    this.graphics.endFill();//结束绘制

    var fx:Number=0;//x方向的力,也可以理解成加速度
    var vx:Number=0;//x方向的速度
    var fy:Number=0;//y方向的力
    var vy:Number=0;//y方向的速度
    this.addEventListener(Event.ENTER_FRAME,go);//为该对象添加ENTER_FRAME事件监听
    function go(e:Event):void {//事件发生的函数,每1帧周期执行一次
    fx=Math.random()*2-1;//随机产生一个x方向的力,随机值范围(-1,1)
    fx-=vx*0.05;//为x方向添加一个阻力,该阻力和x方向速度成正比(这个处理是防止粒子移动过快)
    vx+=fx;//将加速度作用到速度上
    this.x+=vx;//再将速度作用于位移
    if (this.x<1||this.x>549) {//边界判断,超出边界,执行一下自杀代码
    this.parent.removeChild(this);//告诉自己的妈妈,叫她把自己从舞台删了
    this.removeEventListener(Event.ENTER_FRAME,go);//把这个不断执行的函数也删了
    return;//直接跳出这个函数,下面就不执行了
    }

    //以下是y方向,同理
    fy=Math.random()*2-1;

    fy-=vy*0.05;
    vy+=fy;
    this.y+=vy;
    if (this.y<1||this.y>399) {
    this.parent.removeChild(this);
    this.removeEventListener(Event.ENTER_FRAME,go);
    return;
    }

    第二步:

    退到主场景,在库里面把刚才建立的元件执行链接,链接出来的类名是Item。然后在主场景画一个灰色的和舞台大小相同位置00的矩形作为背景。接下来在主场景第一帧写下如下代码。

    var it:Item;//声明一个Item类型的变量
    var timer:Timer=new Timer(5000);//声明并初始化一个5秒发生一次的时间发生器
    timer.addEventListener(TimerEvent.TIMER,addIt);//为时间发生器的Timer事件添加事件,以使每五秒能执行一次addIt
    function addIt(e:Event):void//这个函数每5秒被调用一次,作用是在随机位置为舞台补充新的粒子
    {

    var n:int=0;//用于循环的临时变量
    var initX:Number=Math.random()*550;//随机发生一个舞台上的位置
    var initY:Number=Math.random()*400;//同上
    for(n=0;n<512;n++)//每次发生一次,执行512次循环,每循环一次,将产生一个粒子
    {

    it=new Item();//新建一个粒子,这个Item就是刚咱们在库里面链接出来的
    it.x=initX;//设定初始位置
    it.y=initY;//同上,这个初始位置是刚随机发生的
    this.addChild(it);//将粒子添加到舞台
    }

    }
    timer.start();//这句不能忘,时间器需要执行开始,才能运行
    addIt(new Event("timer"));//为了打发前五秒无聊的时间,我们可以先把addIt函数运行一遍,注意参数噢。}

    然后测试运行下!恩 效果是不是不错呢O(∩_∩)O!!

  • 相关阅读:
    我决定重新开始搞机器学习啦
    基于问句实体扩展和全局规划的答案摘要方法研究相关论文
    cjson源代码解读(三) 解析字符串、数字、数组、对象
    论文阅读:DeepWalk
    cjson源代码解读 (二)解析流程
    cjson源代码解读 (一)介绍
    DDoS攻击的几种类型
    Nmap扫描二级目录
    一次域环境的渗透
    利用enum4linux 445端口+wordpress插件任意文件上传的一次渗透
  • 原文地址:https://www.cnblogs.com/flash3d/p/2332080.html
Copyright © 2011-2022 走看看