- 最后登录
- 2018-5-18
- 注册时间
- 2013-3-26
- 阅读权限
- 100
- 积分
- 58013
- 纳金币
- 12582
- 精华
- 186
|
pstatus"> 本帖最后由 lut_456 于 2013-5-2 16:08 编辑
是一个粒子由中间向四周螺旋发射的效果。
利用三角函数和不断递增的半径实现螺旋运动。
原理相同,代码重新实现(源代码看得我阵阵蛋痛,可能是编程习惯不同吧)。
- package {
- import flash.display.*;
- import flash.events.*;
- import flash.geom.*;
- /**
- * 参考 http://wonderfl.net/c/wk4T
- * @author http://www.ssnangua.com
- */
- [SWF(width=465, height=465)]
- public class ParticleBulletMain extends Sprite
- {
- private var canvas_bd:BitmapData;
- private var ctf:ColorTransform = new ColorTransform( 1, 1, 1, 0.9 );//颜色转换:alpha通道*0.9
- private var bulletArr:Array = new Array();
- private var mtx:Matrix = new Matrix();//绘制时使用到的矩阵,用于偏移绘制坐标
-
- public function ParticleBulletMain () {
- canvas_bd = new BitmapData( stage.stageWidth, stage.stageHeight, false, 0x000000 );
- addChild( new Bitmap( canvas_bd ) );
-
- addEventListener( Event.ENTER_FRAME, enterFrameEvt );
- }
-
- private function enterFrameEvt( e:Event ):void {
- //不断添加Bullet
- for ( var i:int = 0; i < 3; i++ ) {
- var bullet:Bullet = new Bullet(stage.stageWidth/2, stage.stageHeight/2);//舞台中间
- bulletArr.push(bullet);//添加到数组
- }
-
- //绘制前锁定BitmapData
- canvas_bd.unlock();
- //绘制
- for (var j:int = 0; j < bulletArr.length; j++) {
- var bullet:Bullet = bulletArr[j] as Bullet;
- bullet.update();//更新bullet
-
- //如果bullet超出画布范围,移除bullet,不进行绘制
- if (canvas_bd.rect.contains(bullet.x, bullet.y) == false) {
- var index:int = bulletArr.indexOf(bullet);
- if (index != -1) {
- bulletArr.splice(index, 1);
- }
- continue;
- }
-
- mtx.identity();
- mtx.tx = bullet.x;
- mtx.ty = bullet.y;
- canvas_bd.draw( bullet, mtx );//绘制bullet
- }
- //应用颜色转换,降低BitmapData透明度
- canvas_bd.colorTransform( canvas_bd.rect, ctf );
- //绘制完成解锁BitmapData
- canvas_bd.lock();
- }
-
- }
-
- }
- import flash.display.Shape;
- class Bullet extends Shape
- {
- private var v:Number;//速度
- private var a:Number;//加速度
- private var r:Number;//运动半径
- private var vx:Number;//x速度
- private var vy:Number;//y速度
- private var vr:Number;//半径速度
-
- public function Bullet(x:Number, y:Number):void {
- this.x = x;
- this.y = y;
-
- v = 3 * Math.random();//随机速度
- r = 2 * Math.PI * Math.random();//随机初始半径
- a = 0.1;
- vr = 0.03;
-
- draw();//绘制
- }
- private function draw():void {
- var size:Number = 1 + 4*Math.random();//随机大小
- var color:uint = 0xffffff * Math.random();//随机颜色
- this.graphics.beginFill(color);
- this.graphics.drawCircle(0, 0, size);
- this.graphics.endFill();
- }
-
- //更新
- public function update():void {
- v += a;
- r += vr;
- vx = v * Math.cos( r );
- vy = v * Math.sin( r );
- x += vx;
- y += vy;
- }
- }
复制代码 |
|