萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 軟體知識 >  >> 影像處理 >> Flash 教學

ActionScript 3.0 打造逼真雪花飄落動畫:粒子系統完整實作教學

前言

經典的雪花飄落效果升級版!使用 ActionScript 3.0 物件導向架構,建立動態粒子系統,實現雪花大小、透明度、飄落速度、水平飄移的隨機變化,效能優於 AS2 版本,支援無限量雪花生成。

效果預覽

舞台 550×400px,深藍背景,雪花從畫面上方隨機生成,大小不一、透明度變化、自然飄落並逐漸消失。

步驟一:建立雪花元件

  1. 新建 AS3 文件,舞台 550×400,背景深藍
  2. Ctrl+F8 新建「影片剪輯」元件,命名「雪花」
  3. 進入編輯模式,圖層命名「雪花層」
  4. 橢圓工具畫 2×2px 白圓(無筆觸)→ 放大 800% 用選取工具拉扯邊緣成不規則形
  5. 全選 → 修改 → 形狀 → 柔化填充邊緣:距離 5px、步驟 5、方向「擴展」
  6. 最終尺寸約 7.5×7px → 全選右鍵「轉為影片剪輯」,命名「靜態雪花」

步驟二:建立雪花飛行路徑(引導層動畫)

  1. 在「雪花」元件時間軸第 80 幀插入關鍵幀
  2. 新增「引導層」,舞台縮小 50%,鉛筆工具從上往下畫一條彎曲路徑
  3. 第 80 幀插入幀,鎖定引導層
  4. 選中「雪花層」第 80 幀,將「靜態雪花」拖至路徑底端
  5. 「雪花層」右鍵 → 「建立補間動畫」

步驟三:設定元件連結類別

  1. 資源庫右鍵「雪花」元件 → 「連結」
  2. 勾選「匯出供 ActionScript 使用」
  3. 類別名稱:xh_mc(基類自動為 flash.display.MovieClip)

步驟四:背景圖片佈置

  • 回到場景 1,檔案 → 匯入 → 匯入到舞台,選入雪景圖
  • 調整至 550×400 置中,圖層命名「背景」

步驟五:核心 AS3 程式碼

新增圖層「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);
            }
        }
    }
}

程式碼關鍵點解析

進階擴展建議

  • 風向控制: 加入全域 windForce 變數影響水平位移
  • 滑鼠互動: 滑鼠位置影響局部風場,雪花避開/跟隨滑鼠
  • 多層次雪花: 近景大雪花(高速、高透明)、遠景小雪花(低速、低透明)
  • 效能優化: 使用 cacheAsBitmap = true、對象池複用雪花實例
  • 匯出 GIF/視訊: 發布設定調整幀率與解析度輸出素材

常見問題

  1. 雪花不見: 檢查連結類別名稱是否為 xh_mc、元件是否勾選匯出
  2. 效能卡頓: 降低 Timer 次數上限、啟用 cacheAsBitmap、使用對象池
  3. 雪花穿牆: 邊界檢測邏輯確認 stage.stageWidth/Height 正確
copyright © 萬盛學電腦網 all rights reserved
技術點說明
Timer 觸發生成比 EnterFrame 更精確控制生成頻率,避免幀率波動影響
動態建立實例new xh_mc() 即時建立,無需預先放置舞台
屬性隨機化alpha、scale、速度、旋轉全隨機,打破機械感
獨立 ENTER_FRAME每顆雪花自管飄落邏輯,主程式只負責生成
記憶體清理離開畫面即移除事件監聽並移除顯示清單,防記憶體洩漏