
你有沒有遇到過這樣的情況在 Scratch 里想讓角色動起來也學會了用“移動10步”和“重復執行”來畫個正方形但一旦想讓角色根據分數變化速度或者讓障礙物隨機出現就感覺無從下手代碼塊堆了一堆角色要么一動不動要么亂跑一通完全不受控制。這背后缺失的關鍵一環往往不是“運動”本身而是如何用“變量”去指揮運動。很多人把 Scratch 的變量理解成一個“存數字的盒子”和運動模塊是兩套獨立系統。但實際上變量是 Scratch 里連接邏輯與表現、實現動態交互的“神經中樞”。把變量和運動結合起來你寫的就不再是預設好的動畫而是能根據玩家操作、游戲狀態實時變化的、真正有“生命”的交互程序。今天我們不談復雜的算法就聚焦一個核心如何用最基礎的“變量”模塊去徹底解鎖 Scratch 中“運動”的潛力。你會發現一旦掌握了這個結合點從自動追蹤的敵人、隨難度增加的速度到物理模擬的小球很多看似復雜的創意其底層邏輯都變得異常清晰。1. 重新理解 Scratch 的“變量”它不只是存數字的盒子在深入結合之前我們必須先打破對 Scratch 變量的一個常見誤解。新手常常只在顯示分數、記錄生命值時才會創建變量把它當作一個靜態的“記錄板”。這種用法只發揮了變量10%的能力。1.1 變量的三種核心角色數值容器、狀態標志與動態參數在 Scratch 中一個設計得當的變量至少可以扮演三種關鍵角色動態參數生成器這是變量與運動結合最直接的方式。運動模塊如“移動10步”、“面向90方向”、“將x坐標增加10”里那些固定的數字都可以被替換成變量。比如將移動 10 步改為移動 (速度) 步。此時變量“速度”就從一個存儲單元變成了控制角色行為的“旋鈕”。你通過改變“速度”的值比如在吃到加速道具時將 [速度 v] 增加 5就能實時改變角色的運動表現。程序狀態的中樞神經變量可以標識游戲或程序處于哪個階段。例如創建一個叫“游戲狀態”的變量用數字1代表“進行中”2代表“暫停”3代表“游戲結束”。那么控制角色運動的循環腳本就可以加上條件判斷重復執行直到 (游戲狀態) [3]。這樣你通過修改變量這一個點就能協調整個程序中所有角色的行為實現全局控制。臨時計算的中轉站很多復雜的運動效果需要中間計算。比如你想讓角色朝鼠標指針平滑移動每次只轉向鼠標方向的一半角度。直接寫很難但用變量就很簡單將 [目標方向 v] 設為 (面向 [鼠標指針 v] 的方向) 將 [當前方向 v] 設為 (方向) 將 [轉向角度 v] 設為 (((目標方向) - (當前方向)) / (2)) 右轉 (轉向角度) 度這里“目標方向”、“當前方向”、“轉向角度”這些變量就像草稿紙幫你把一步到位的復雜計算拆解成多個清晰、可調試的步驟。1.2 變量類型的選擇適用于運動場景的決策Scratch 變量有“適用于所有角色”和“僅適用于當前角色”兩種。這個選擇在運動編程中至關重要適用于所有角色全局變量當這個變量需要被多個角色共享和響應時使用。典型例子游戲速度所有敵人、子彈、障礙物的移動速度基準。重力在平臺跳躍游戲中影響所有可下落物體的統一參數。游戲狀態如“是否開始”、“是否暫停”需要所有角色同步感知。僅適用于當前角色局部變量當這個變量只描述某個角色獨有的屬性時使用。典型例子個人血量每個敵人或玩家有自己的血量。獨立運動狀態某個角色特有的“是否正在跳躍”、“蓄力時間”等。路徑點索引用于控制單個角色沿特定路徑移動的計數器。注意濫用全局變量是 Scratch 項目變得混亂的常見原因。如果一個變量只和一個角色有關堅決使用局部變量。這能讓你的代碼邏輯更清晰也避免角色間產生意外的相互干擾。2. 變量驅動基礎運動從“死動畫”到“活交互”理解了變量的多重身份后我們來看如何用它替換運動模塊中的固定數值這是實現動態交互的第一步。2.1 替換移動步數實現可調節的速度這是最直接的應用。不要再用移動 10 步了。創建變量新建一個名為“移動速度”的變量根據角色屬性選擇全局或局部。初始化在游戲開始或角色生成時將 [移動速度 v] 設為一個初始值比如 5。替換與使用將所有移動 [10] 步的模塊替換為移動 (移動速度) 步。動態改變現在你可以在任何需要改變速度的地方修改變量吃到加速道具將 [移動速度 v] 增加 [2]碰到減速區域將 [移動速度 v] 設為 ((移動速度) * [0.8])乘以0.8實現減速20%隨著關卡提升將 [移動速度 v] 增加 [1]這樣一來角色的速度不再是一行寫死的代碼而是一個可以通過游戲邏輯動態調整的屬性。2.2 替換旋轉角度實現平滑轉向與隨機移動讓轉向也“活”起來。平滑追蹤讓角色慢慢轉向鼠標而不是瞬間對準。當 ? 被點擊 重復執行 將 [目標角度 v] 設為 (面向 [鼠標指針 v] 的方向) 將 [當前角度 v] 設為 (方向) 將 [轉向步長 v] 設為 (((目標角度) - (當前角度)) / [5]) // 每次轉1/5的差值實現平滑 右轉 (轉向步長) 度 end這里的“轉向步長”變量決定了追蹤的“粘滯感”或“靈敏度”。隨機漫步讓角色以隨機的幅度和方向移動。當 ? 被點擊 重復執行 將 [隨機移動量 v] 設為 (在 (-10) 到 (10) 之間取隨機數) 將 [隨機轉向量 v] 設為 (在 (-30) 到 (30) 之間取隨機數) 移動 (隨機移動量) 步 右轉 (隨機轉向量) 度 等待 [0.1] 秒 // 避免移動過快 end2.3 替換坐標變化實現可控的軌跡運動直接操作x、y坐標是制作精確運動軌跡如拋物線、圓周運動的關鍵變量在這里是計算公式的載體。模擬重力跳躍當 ? 被點擊 將 [y速度 v] 設為 [15] // 初始向上速度 將 [重力 v] 設為 [-1] // 重力加速度負值表示向下 重復執行直到 碰到 [地面 v] ? 將y坐標增加 (y速度) 將 [y速度 v] 增加 (重力) // 每幀速度受重力影響減小 end這個簡單的模型用“y速度”和“重力”兩個變量就模擬了起跳、上升、減速、下落的全過程。圓周運動當 ? 被點擊 將 [半徑 v] 設為 [100] 將 [角度 v] 設為 [0] 重復執行 將 [角度 v] 增加 [5] 將x坐標設為 (([sin v] of (角度)) * (半徑)) 將y坐標設為 (([cos v] of (角度)) * (半徑)) end“角度”變量持續增加通過三角函數計算出圓周上每一點的坐標從而實現旋轉。3. 構建運動系統用變量組合實現復雜行為單一變量的控制是基礎將多個變量組合成一個“系統”才能創造出真正智能或有趣的運動。3.1 狀態機用變量管理角色的運動模式這是游戲AI的雛形。通過一個“狀態”變量讓角色在不同行為模式間切換。定義狀態創建變量“敵人狀態”。約定0閑置1巡邏2追擊3攻擊。狀態判斷與切換當 ? 被點擊 重復執行 如果 (敵人狀態) [0] 那么 // 閑置 說 [zzZ...] (2) 秒 否則 如果 (敵人狀態) [1] 那么 // 巡邏 移動 (巡邏速度) 步 如果 碰到邊緣 ? 那么 右轉 [180] 度 結束 否則 如果 (敵人狀態) [2] 那么 // 追擊 面向 [玩家 v] 移動 (追擊速度) 步 結束 結束 結束 end觸發狀態改變在其他腳本中根據條件修改變量。玩家進入視野將 [敵人狀態 v] 設為 [2]玩家離開視野將 [敵人狀態 v] 設為 [1]被攻擊將 [敵人狀態 v] 設為 [3]3.2 物理模擬組合速度、加速度與摩擦力用變量可以構建簡化的物理引擎讓運動更真實。變量設計x速度角色在水平方向的速度。y速度角色在垂直方向的速度用于跳躍、下落。加速度當按下按鍵時速度增加的量。摩擦力每幀速度自然減少的量讓角色松開按鍵后能停下。核心運動循環當 ? 被點擊 將 [x速度 v] 設為 [0] 將 [y速度 v] 設為 [0] 重復執行 // 1. 處理水平輸入和摩擦力 如果 按下 [向右方向鍵 v] ? 那么 將 [x速度 v] 增加 (加速度) 結束 如果 按下 [向左方向鍵 v] ? 那么 將 [x速度 v] 增加 ((0) - (加速度)) // 向左加速是負值 結束 將 [x速度 v] 設為 ((x速度) * (摩擦力)) // 應用摩擦力如0.9 // 2. 處理垂直速度如重力 將 [y速度 v] 增加 (重力) // 3. 應用速度到坐標 將x坐標增加 (x速度) 將y坐標增加 (y速度) // 4. 碰撞檢測與響應例如碰到地面 如果 碰到 [地面 v] ? 那么 將y坐標設為 (碰到地面時的y坐標) // 簡單處理置于地面之上 將 [y速度 v] 設為 [0] 如果 按下 [上移鍵 v] ? 那么 // 允許跳躍 將 [y速度 v] 設為 [15] 結束 結束 end這套系統通過幾個變量的持續運算實現了帶慣性的平滑移動、重力跳躍和地面碰撞手感遠勝于直接修改坐標。3.3 批量與控制用列表變量管理多個運動對象當需要控制大量相同物體如滿天飛的子彈、成群結隊的敵人時為每個角色復制腳本是低效的。此時可以結合列表和克隆用一套腳本變量數據控制所有對象。創建列表存儲屬性創建“子彈X列表”、“子彈Y列表”、“子彈速度列表”。生成克隆體并初始化數據當作為克隆體啟動時 將 [我的編號 v] 設為 (克隆體ID) // 用一個變量記錄自己是第幾個克隆體 在 [子彈X列表 v] 的第 (我的編號) 項前插入 [x坐標] // 初始化位置數據 在 [子彈Y列表 v] 的第 (我的編號) 項前插入 [y坐標] 在 [子彈速度列表 v] 的第 (我的編號) 項前插入 [10] // 初始化速度 重復執行 // 從列表中讀取屬于自己的數據 將 [當前X v] 設為 (子彈X列表的第 (我的編號) 項) 將 [當前Y v] 設為 (子彈Y列表的第 (我的編號) 項) 將 [當前速度 v] 設為 (子彈速度列表的第 (我的編號) 項) // 計算新位置 將 [當前X v] 增加 (當前速度) // 更新列表中的數據 替換 [子彈X列表 v] 的第 (我的編號) 項為 (當前X) // 克隆體移動到新位置 移到 x: (當前X) y: (當前Y) // 邊界檢測如果飛出屏幕則刪除列表項并刪除自己 如果 (當前X) [240] 那么 刪除 [子彈X列表 v] 的第 (我的編號) 項 ... // 刪除其他列表中對應的項 刪除此克隆體 end end主控角色只需要負責在按下空格時創建克隆體并將初始數據加入列表即可。這種方法將運動數據變量與角色實體克隆體分離主循環只需遍歷和計算列表中的數據極大地提升了大量物體運動的效率和可控性。4. 調試、優化與避坑指南將變量與運動結合后項目復雜度上升調試變得至關重要。同時一些細節處理不當會導致奇怪的Bug。4.1 調試讓變量的變化“看得見”Scratch 提供了極佳的調試支持。舞臺顯示對于關鍵的運動變量如速度、狀態在舞臺上勾選變量名前的復選框讓其值實時顯示。這是最直觀的調試方式。“說”出變量在復雜的條件判斷或計算過程中用說 (變量名) (2) 秒來暫停程序并查看某一時刻的變量值比一直顯示更清晰。配合“等待”在懷疑有問題的代碼段前后加入等待 [1] 秒放慢程序運行觀察變量變化和角色運動是否按預期進行。4.2 常見問題與解決方案問題角色運動卡頓、抖動或不流暢。檢查點1循環內的“等待”。重復執行內部如果使用了等待 [0.1] 秒來控制頻率這是正確的。但如果沒用Scratch 會以最高速度運行循環可能導致運動過快或資源占用高。解決方案在運動循環內加入一個極短的等待如等待 [0.01] 秒。檢查點2變量更新與屏幕刷新不同步。在復雜的物理運算中一幀內多次修改坐標可能導致視覺抖動。解決方案確保一幀內對x、y坐標只進行一次最終賦值。將所有速度、位置的計算先存入變量最后再用移到 x: (計算后的X) y: (計算后的Y)一次性更新。問題角色穿過障礙物或邊界。原因運動步長速度值過大。如果角色一幀移動20步而障礙物只有10步寬它就可能“穿越”過去。解決方案降低最大速度。使用更精確的碰撞檢測。在移動前先計算目標位置用在 (x) (y) 碰到 [障礙物 v]積木進行預測判斷。采用“小步推進碰撞檢測”循環將一大步拆成多個小步移動每小步后檢測碰撞。問題變量值出現意外變化如變成極小數或極大數。原因通常是數學運算的累積誤差或未初始化的變量參與計算。解決方案嚴格初始化在任何可能使用變量前用將 [變量 v] 設為 [0]明確其初始值。限制范圍對于有明確范圍的變量如角度0-360血量0-100在改變后立即用將 [變量 v] 設為 (四舍五入 (變量))或條件判斷將其限制在合理區間。檢查運算順序確保除法運算分母不為零。4.3 性能優化建議當運動對象非常多時如上百個克隆體需注意性能。減少舞臺顯示變量只顯示最重要的幾個。大量變量顯示在舞臺上會消耗性能。簡化碰撞檢測如果可能為需要碰撞檢測的角色使用簡單的、顏色統一的造型并勾選“僅允許克隆體碰撞檢測”選項。對于大量物體可以考慮使用基于距離到 [某角色 v] 的距離或網格的粗略檢測代替精確的像素碰撞。及時刪除數據對于使用列表管理的克隆體在克隆體刪除時務必同步刪除列表中對應的數據項防止列表無限膨脹。將變量與運動結合本質上是將程序從“順序播放的磁帶”升級為“可實時調音的合成器”。變量提供了控制的旋鈕和推子讓你能在程序運行時動態地、有邏輯地改變一切。從今天起嘗試在你的每一個 Scratch 運動項目中有意識地創建并使用變量。先從替換一個固定數字開始感受那種“掌控感”。你會發現創意實現的邊界就此被拓寬了。