当前位置:主页>FLASH AS 编程>AS基础篇>AS 3.0>文章内容
  • 随机运动的瓢虫(AS3)
  • 来源:Flash博客 作者:humorguy 2008-02-29 【
FlashAs作品发表>>我要投稿 | FlashAs讨论区>>AS论坛
Flash Media Server学习站>>www.FMScn.com


 所有随机运动的功能,都在瓢虫类(RandomAirPort)中,只要在舞台添加一个“瓢虫”,它就可以在舞台中随机的运动,改变右下方数字框的内容,可以添加或者删减舞台中“瓢虫”的数量,瓢虫”数目超过30以后,player的运行速度就明显减慢了,主要问题在哪里呢?
这个类的代码如下:

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

    public class RandomAirPort extends MovieClip {
        private const changeDirectSpeed:Number = 2000;//瓢虫随机转换方向的频率,单位:毫秒
        private const updateSpeed:Number = 30;//刷新瓢虫位置的频率,单位:毫秒
        private var airWalkSpeed:Number = 1;//瓢虫移动速度,单位:像素
        private const PI:Number = Math.PI;
        private const updateRefreshAngleSpeed:Number = 20;//刷新速度,单位:毫秒
        private const refreshAngleSpeed:Number = 0.01;//转换角度的速度
        private const zero:Number = 0.001;//自定义接近零的数据
        private const stageWidth:Number = 550;
        private const stageHeight:Number = 400;
        private var updateTimer:Timer = new Timer(updateSpeed);
        private var changeDirectTimer:Timer = new Timer(changeDirectSpeed);
        private var refreshAngleTimer:Timer = new Timer(updateRefreshAngleSpeed);//实现瓢虫转向缓动公式
        private var directAngle:Number;//瓢虫移动角度,单位:角度
        private var directRadin:Number;//瓢虫移动角度,单位:弧度
        private var myWidth:Number = 28;

        public function RandomAirPort():void {
            init();
        }
        private function init():void {
            changeDirectTimer.addEventListener(TimerEvent.TIMER, changeDirect);
            changeDirectTimer.start();
            updateTimer.addEventListener(TimerEvent.TIMER, airPortMove);
            updateTimer.start();
            refreshAngleTimer.addEventListener(TimerEvent.TIMER, refreshAngle);
            airWalkSpeed = getRandom(0.5,2);
        }
        private function changeDirect(evt:TimerEvent):void {
            getAngle();
            refreshAngleTimer.start();//开始转换角度,缓动效果
        }
        private function airPortMove(evt:TimerEvent):void {//瓢虫匀速运动
            this.x += airWalkSpeed*Math.cos(this.rotation*PI/180);
            this.y += airWalkSpeed*Math.sin(this.rotation*PI/180);
            if (this.x > (stageWidth+myWidth)) {
                this.x = 0;
            } else if (this.x < -myWidth) {
                this.x = stageWidth+myWidth;
            }
            if (this.y > (stageHeight+myWidth)) {
                this.y = 0;
            } else if (this.y < -myWidth) {
                this.y = stageHeight+myWidth;
            }
        }
        private function refreshAngle(evt:TimerEvent):void {
            var distOfAngle = Math.abs(directAngle - this.rotation);
            if (distOfAngle <= zero) {
                refreshAngleTimer.stop();
                this.rotation = directAngle;
            } else {
                var angleDist = refreshAngleSpeed*(directAngle - this.rotation);
                this.rotation += angleDist;
            }
        }
        private function getAngle() {
            directAngle = getRandom(-180,180);
            directRadin = directAngle*PI/180;
        }
        private function getRandom(startPara:Number,endPara:Number):Number {
            var R:Number = Math.random();
            var result:Number = startPara + R*(endPara - startPara);
            return result;
        }
    }
}

Flash动画:
 




上一篇:As3 模拟As2.0 LoadVars传参   下一篇:AS3与Red5之间的参数传递
  • 用户名:新注册) 密码: 匿名评论
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)

Copyright © 2006-2008 flashas.net All Rights Reserved.
网站内容咨询: admin#flashas.net (#为@) 联系QQ:40777822 浙ICP备06033001号
(本网站最佳浏览解析度为1024*768, 建议使用IE 6.0或以上版本浏览器。)