发了两个“说说BitmapData ”帖子之后,一些同学希望能提供源码 。这次我提供了另外一个例子的源码,代码 能很清晰的体现Bitmap Data粒子的基本做法。至于如何从这个基本结构发展成这样那样的效果 ,大家可以自己琢磨下。这里是演示,四万个粒子的自由落体。
http://www.ryan-liu.com/demo/particle/pixel_animation.html
源码中主要分三个部分,BitmapData操作,粒子运算,和之前还没提过的BitmapData特效。BitmapData的像素操作在 之前 介绍过。BitmapData特效我打算以后专门举例讲解,而且这块不难,大家看源码就能理解。这里就简单说说粒子。
粒子运算可以抽离为两个部分,粒子的运动计算和粒子群的管理。粒子的运动就是最基本的物理运动,速度,加速度,动力,阻力。源码中我给出了一个最最简单的二维粒子类,用这个类可以做简单的二维运动计算。
- package com.ryanliu.geom
- {
- /**
- * @author Ryan Liu | www.ryan-liu.com
- * @since 2009-3-19 22:41
- */
- public class SimpleParticle2D
- {
- public var x:Number
- public var y:Number
- public var vx:Number
- public var vy:Number
- public var mass:Number
-
- public function SimpleParticle2D(particleX:Number = 0, particleY:Number = 0, speedX:Number = 0, speedY:Number = 0, pMass:Number = 1)
- {
- x = particleX
- y = particleY
- vx = speedX
- vy = speedY
- mass = pMass
- }
- public function update() {
- x += vx
- y += vy
- }
- }
- }
这个类拥有最基本的五个属性 ,xy坐标,xy轴的速度vx,vy,和粒子的质量mass。质量不是必须的。但如果你想做一个生动的效果,还是留着它。不同的质量才会有不同的加速度嘛。本例中是一个最常规的运动——自由落体。
粒子群的管理也不是什么复杂的事儿,通常情况用数组 保 存,用for来遍历操作就好了。需要注意的是,因为粒子数量是灰常大的,所以粒子计算时有丁点儿不够优化的地方,对执行效率的影响也会很大。有人问过不做 lock和unlock好像执行起来也没影响性能,那是因为操作量不够大。本例里,在600x450的BitmapData上画40000个粒子,你可以 清楚的看出锁和不锁的差别。