漂亮的雪花飘落和堆积效果

源码: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位置(为了雪花堆积均匀)

}

其他要点在代码中有注释了,源文件在上头有。

原文地址:https://www.cnblogs.com/flash3d/p/2332236.html