源碼:http://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位置(為了雪花堆積均勻) }
其他要點在代碼中有注釋了,源文件在上頭有。
本欄目