經典的雪花飄落效果升級版!使用 ActionScript 3.0 物件導向架構,建立動態粒子系統,實現雪花大小、透明度、飄落速度、水平飄移的隨機變化,效能優於 AS2 版本,支援無限量雪花生成。
舞台 550×400px,深藍背景,雪花從畫面上方隨機生成,大小不一、透明度變化、自然飄落並逐漸消失。


xh_mc(基類自動為 flash.display.MovieClip)新增圖層「AS」,第 1 幀開啟動作面板(F9),貼上:
package {
import flash.display.MovieClip;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class SnowScene extends MovieClip {
private var spawnTimer:Timer;
public function SnowScene() {
// 隨機間隔 100-400ms 生成一顆雪花,共生成 100 顆後停止
spawnTimer = new Timer(Math.random() * 300 + 100, 100);
spawnTimer.addEventListener(TimerEvent.TIMER, onSnowSpawn);
spawnTimer.start();
}
private function onSnowSpawn(e:TimerEvent):void {
var snowflake:xh_mc = new xh_mc();
addChild(snowflake);
// 隨機初始位置(畫面上方區域)
snowflake.x = Math.random() * 550;
snowflake.y = Math.random() * 200;
// 隨機外觀屬性
snowflake.alpha = Math.random() * 0.8 + 0.2; // 0.2-1.0
snowflake.scaleX = snowflake.scaleY = Math.random() * 0.5 + 0.5; // 0.5-1.0
// 每顆雪花獨立幀事件驅動飄落
snowflake.addEventListener(Event.ENTER_FRAME, onSnowFall);
}
private function onSnowFall(e:Event):void {
var flake:MovieClip = e.currentTarget as MovieClip;
// 垂直飄落 + 水平隨機飄移
flake.y += 2 + Math.random() * 3; // 下落速度 2-5px/幀
flake.x += (Math.random() - 0.5) * 2; // 左右飄移 -1~1px
// 旋轉增加自然感
flake.rotation += (Math.random() - 0.5) * 4;
// 超出畫面底部移除
if (flake.y > stage.stageHeight + 50) {
flake.removeEventListener(Event.ENTER_FRAME, onSnowFall);
if (flake.parent) flake.parent.removeChild(flake);
}
}
}
}
| 技術點 | 說明 |
|---|---|
| Timer 觸發生成 | 比 EnterFrame 更精確控制生成頻率,避免幀率波動影響 |
| 動態建立實例 | new xh_mc() 即時建立,無需預先放置舞台 |
| 屬性隨機化 | alpha、scale、速度、旋轉全隨機,打破機械感 |
| 獨立 ENTER_FRAME | 每顆雪花自管飄落邏輯,主程式只負責生成 |
| 記憶體清理 | 離開畫面即移除事件監聽並移除顯示清單,防記憶體洩漏 |