雨滴從天空落下,擊中地面產生水波擴散,雨量可控、自然隨機。考試高頻考點,核心技術:**影片剪輯嵌套**、**遮罩限制區域**、**duplicateMovieClip 粒子系統**、**setInterval 定時生成**。
stop()(間隔期,控制雨密度)mc新增圖層「AS」,第 1 幀:
c = 1;
第 2 幀插入空白關鍵幀(F7),貼上:
function ee() {
duplicateMovieClip("mc", "mc" + c, c);
setProperty("mc" + c, _x, random(550));
setProperty("mc" + c, _y, random(200));
updateAfterEvent();
c++;
if (c > 300) {
clearInterval(kk);
}
}
kk = setInterval(ee, 120); // 每 120ms 生成一顆雨滴,共 300 顆
| 程式碼 | 功能 |
|---|---|
duplicateMovieClip("mc", "mc"+c, c) | 複製實例 mc,新名稱 mc1/mc2...,層級遞增 |
setProperty(..., _x, random(550)) | 隨機 X 座標(舞台寬 550) |
setProperty(..., _y, random(200)) | 隨機 Y 座標(上方 200px 範圍,雨從天降) |
updateAfterEvent() | 強制立即重繪,提高滑鼠/定時器回應流暢度 |
c > 300 清除定時器 | 限制總雨滴數,防記憶體洩漏/效能下降 |
setInterval(ee, 120) | 每 120ms 執行一次 ee 函式 |
package {
import flash.display.*;
import flash.events.*;
import flash.utils.Timer;
import flash.utils.getTimer;
public class RainScene extends Sprite {
private var rainDrops:Array = [];
private var spawnTimer:Timer;
private const MAX_DROPS:int = 300;
private const STAGE_W:Number = 550;
private const STAGE_H:Number = 400;
public function RainScene() {
spawnTimer = new Timer(120, MAX_DROPS);
spawnTimer.addEventListener(TimerEvent.TIMER, spawnDrop);
spawnTimer.start();
addEventListener(Event.ENTER_FRAME, updateRain);
}
private function spawnDrop(e:TimerEvent):void {
var drop:RainDropMC = new RainDropMC(); // 庫中連結類別
drop.x = Math.random() * STAGE_W;
drop.y = -Math.random() * 200; // 從畫面上方外開始
addChild(drop);
rainDrops.push(drop);
}
private function updateRain(e:Event):void {
for (var i:int = rainDrops.length - 1; i >= 0; i--) {
var drop:RainDropMC = rainDrops[i];
drop.y += 8 + Math.random() * 4; // 下落速度
drop.x += (Math.random() - 0.5) * 1.5; // 風飄
if (drop.y > STAGE_H + 50) {
drop.removeEventListener(Event.ENTER_FRAME, arguments.callee);
if (drop.parent) drop.parent.removeChild(drop);
rainDrops.splice(i, 1);
}
}
}
}
}
mc、總幀 170c=1、第 2 幀 setInterval 迴圈duplicateMovieClip 三參數:原名、新名、層級random(550) 產生 0-549 隨機整數clearInterval 必須配合變數儲存 ID(kk)