漂亮的雪花飘落和堆积效果
源码:https://files.cnblogs.com/flash3d/snow.rar
这个是落落班长布置的作业:我想看雪花飘落!!
这次的效果,技术上没什么新意,效果漂亮与否主要看是否抓住了雪花在空中的感觉。
效果在展现雪花在空中的感觉主要从以下几个方面:
1.雪花是飘落不是冰雹砸落,所以雪花在空中一定会有变化,在风的带动下,雪花会在空中无规律的起舞(这个词好娘。。)
所以,在展现效果上,雪花需要得到一个纵向和横向的随机旋转力
ln.rotationX += Math.random() * 10;
ln.rotationY += Math.random() * 10;
2.雪花存在空间中,而不是平面上,由于近大远小,所以在屏幕上的雪花不能一样大。我们在初始化的时候,就给雪花一个随机缩放。
ln.scaleX = ln.scaleY = Math.random() * 0.3 + 0.1;
3.由于近大远小的规律,所以每个雪花下落一定是不一样快的(近快远慢。。看看飞机就知道了),他应该和缩放值成正比
_indexes[ln] = { vy:Math.random() * ln.scaleY * 8 + 4, iniy:ln.y };
4.雪花落地要慢慢堆积,到达地面会使地面升高,所以要加上雪花堆积效果。这里的到地面的碰撞检测分为两个步骤,第一步是粗检测,雪花超过指定范围,才进行像素级检测,提高了碰撞检测的效率,也保证了堆积的雪的效果。
//如果雪花到达堆积检测高度,则检测堆积
if (ln.y >= _plie[int(ln.x)])
{
//如果检测发现没有碰撞而且没有越界,就退出,否则就堆积
if (!_plieImg.hitTest(new Point(0, 0), 0, new Point(ln.x, ln.y)) && ln.y < STAGEHEIGHT - DENSITY) return;
_shut.addChild(ln);//添加到容器,然后拍照
_plieImg.draw(_shut);
addChild(ln);//拍照完了重新添加回当前显示对象
_plie[int(ln.x)] = ln.y - DENSITY < _plie[int(ln.x)]?ln.y - DENSITY:_plie[int(ln.x)];//堆积检测高度增加
ln.y = _indexes[ln].iniy;//初始化y位置
ln.x = Math.random() * STAGEWIDTH;//随机获得x位置(为了雪花堆积均匀)
}
其他要点在代码中有注释了,源文件在上头有。