Bitmap粒子特效

      Bitmap粒子效果弄得好可以有非常意外的效果,我曾经在一个外国博客上看到运用于3D的Bitmap粒子特效,可以说是让整个画面都活了起来。

      乍看起来这是非常消耗计算机资源的事情,其实的确挺耗资源的。可是这个耗资源的点与我以前认为的完全不同,在这必须声明一个事实:Bitmap粒子特效中每个粒子并不是一个单独的对象,整个过程中只有一个BitmapData对象在被改变,而那些粒子只是BitmapData里面的单个像素,怎么做到这一切呢?一切都归功于BitmapData类中的几个像素操作函数,例如getPixels()和setPixels()等等.....。

      这里有几个问题需要注意的。

      之一是对每个像素点操作是一个极大的工作量,一个200*200的图片就有40000个像素,就是说每个循环里需要操作40000次,这里有一个技巧:巧妙的设置背景色,例如一张黑色居多的图片我们应该选择黑色作为图片背景,这样我们可以省去黑色像素点的操作。

      再来是如何控制像素点的运动,我们要凭空控制像素是很难的,我们需要一些记录,所以一般人的做法都是自己建立一个保存像素点信息的类,在主文件里定义一个该类的数组用于保存需要操作的点,这样就会有章可循。

      其三,要是每操作一个像素点就刷新一次显示,那么相像一下对200*200的图片所有像素点操作一次需要刷新40000次显示,这可不是一件好玩的事情。幸好我们在API里面可以找到BitmapData2个有用的函数lock()和unlock()。怎么用呢?这么说吧,当我使用了lock()函数后,我队该BitmapData像素进行任何操作都不会显示出来,而unlock悄悄相反,强制刷新显示的意思,所以前辈们告诉我们在每次循环开始前调用lock,每次循环结束后调用unlock。这的确是个正确的做法,只是有个问题,当在电脑配置较低,图片较大的时候,每次刷新都会显得略卡。所以我的建议是不必每次循环结束后才调用unlock,对于40000像素的图片我们可以操作10000个像素后unlock一次,当然这个值是由我们自己设置。

//之前内容省略
var bmpData:BitmapData = XXXXXXXX;   //获取图片BitmapData
_getPixels();                //获取bmpData像素数据到自定义像素控制类里面

//设置显示用bmpData的宽、高和颜色。
//请注意该bmpData一定要比获取的图片大,否则像素无操作性
var newBmpData = new BitmapData(width, height, color);
var bmp:Bitmap = new Bitmap(newBmpData);
addChild(bmp);

//添加每帧刷新显示事件
addEventListener(Event.ENTER_FRAME, _upadte);

//中间内容再次省略

private function _getPixels():void
{
      //遍历加载的BMP图片的每个像素,把需要操作的像素信息保存到一个数组中
      //需要注意的是像素信息,而不是像素
      //自定义类与像素点所包含数据需相似,可自行添加其他数据(如方向、速度)
}

private function _update(e:Event):void
{
      newBmpData.lock();

      //遍历像素信息数组,根据信息对newBmpData的像素进行操作
      //在适当的时候调用newBmpData.unlock()函数
}
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值