幕:Undo 系統(tǒng)與 QA 自動(dòng)校驗(yàn)架構(gòu)是如何煉成的)
Bladecoder Adventure Engine 編輯器內(nèi)幕Undo 系統(tǒng)與 QA 自動(dòng)校驗(yàn)架構(gòu)是如何煉成的【免費(fèi)下載鏈接】bladecoder-adventure-engineClassic point and click adventure game engine and editor項(xiàng)目地址: https://gitcode.com/gh_mirrors/bl/bladecoder-adventure-engineBladecoder Adventure Engine 是一套經(jīng)典的指點(diǎn)式Point Click冒險(xiǎn)游戲引擎與可視化編輯器讓你幾乎不寫代碼就能做出可跨 Android、iOS 與桌面平臺(tái)發(fā)布的互動(dòng)敘事游戲。而真正讓編輯器敢讓人隨便改的是背后兩套不起眼卻扎實(shí)的架構(gòu)Undo 撤銷系統(tǒng)與QA 自動(dòng)校驗(yàn)。本文面向新手帶你快速看懂這兩塊內(nèi)幕是如何煉成的 ? 先搞懂編輯器到底在改什么整個(gè)項(xiàng)目分為兩個(gè)子工程見 README.mdadventure-editor/圖形化編輯器負(fù)責(zé)搭建場景、角色、動(dòng)詞與動(dòng)作blade-engine/運(yùn)行時(shí)引擎負(fù)責(zé)把這些數(shù)據(jù)跑成游戲。編輯器所有操作最終都落在同一個(gè)游戲模型上World世界→ Scene場景→ Actor角色/物品→ Verb動(dòng)詞→ Action動(dòng)作。Undo 系統(tǒng)與 QA 系統(tǒng)本質(zhì)上都是圍繞這個(gè)模型做的保護(hù)罩。 Undo 系統(tǒng)每次修改都留了后悔藥極簡骨架一個(gè)接口 一個(gè)棧Undo 系統(tǒng)的核心只有兩個(gè)類代碼極短但思路經(jīng)典UndoOp.java只有undo()一個(gè)方法的接口任何可撤銷操作都實(shí)現(xiàn)它UndoStack.java基于ArrayDeque的棧add()入棧、undo()出棧執(zhí)行并在日志里打印UNDO: ...方便排查。這就是典型的命令模式先把怎么撤回打包成一個(gè)對(duì)象再統(tǒng)一交給棧管理。19 種撤銷操作與模型改動(dòng)一一對(duì)應(yīng)在 undo 目錄 下每個(gè)可撤銷操作都有獨(dú)立類可按用途分成三組分組操作類場景舉例 創(chuàng)建類UndoCreateScene/UndoCreateActor/UndoCreateSound新建場景、角色、音效? 刪除類UndoDeleteScene/UndoDeleteActor/UndoDeleteVerb/UndoDeleteDialog/UndoDeleteOption/UndoDeleteAction/UndoDeleteAnimation/UndoDeleteSound刪除模型元素時(shí)恢復(fù)原狀?? 編輯類UndoPosition/UndoRefPosition/UndoScale/UndoRotation/UndoDepthVector/UndoBboxPointPos/UndoEditActor/UndoEditScene拖動(dòng)位置、縮放、旋轉(zhuǎn)、改屬性以 UndoScale.java 為例構(gòu)造時(shí)記下角色的舊縮放值undo()時(shí)調(diào)a.setScale(...)還原并調(diào)用setModified()標(biāo)記項(xiàng)目已修改。一個(gè)類只干一件事擴(kuò)展新操作時(shí)互不干擾。撤銷棧如何接入編輯器 UI撤銷棧由項(xiàng)目對(duì)象統(tǒng)一持有Project.java 中聲明undoStack并對(duì)外提供getUndoStack()各 UI 面板在每次模型改動(dòng)后立刻入棧例如 SceneList.java、ActionList.java、ActorList.java 等重新加載項(xiàng)目時(shí)調(diào)用undoStack.clear()避免跨項(xiàng)目撤銷的詭異行為。? QA 自動(dòng)校驗(yàn)給游戲模型做一次體檢訪問者模式ModelWalker 遍歷整個(gè)世界ModelWalker.java 是 QA 的巡線員。它內(nèi)部維護(hù) 8 種訪問者列表——SceneVisitor、ActorVisitor、VerbVisitor、ActionVisitor、DialogVisitor、DialogOptionVisitor、StartVisitor、EndVisitor然后按固定路徑把整個(gè)世界走一遍開始回調(diào) → 逐場景 → 逐角色 → 逐動(dòng)詞 → 逐動(dòng)作 → 逐對(duì)話 → 逐選項(xiàng) → 結(jié)束回調(diào)每條檢查規(guī)則只需實(shí)現(xiàn)它關(guān)心的訪問者接口遍歷邏輯一行都不用動(dòng)——這就是訪問者模式的威力。四條內(nèi)置檢查規(guī)則QA.java 里注冊(cè)了 4 條規(guī)則全部位于 qa/rules 目錄規(guī)則類檢查什么Stats.java統(tǒng)計(jì)項(xiàng)目規(guī)模如場景數(shù)量輸出概覽CheckInteractionVerbs.java可交互角色必須有l(wèi)ookat且至少要有pickup或talkto物品欄角色應(yīng)有use動(dòng)詞精靈角色至少要有一個(gè)動(dòng)畫CheckDesc.java檢查角色描述等文本內(nèi)容是否完整CheckCutmodeEnd.java動(dòng)詞如果開啟了 cutmode結(jié)束前必須關(guān)掉否則游戲會(huì)卡死在過場這些規(guī)則抓的正是玩家最容易碰上的體驗(yàn)問題。比如移動(dòng)端幫助畫面引擎自帶模板里演示的 examine / action / inventory 交互如果一個(gè)角色漏配了lookatCheckInteractionVerbs會(huì)直接在日志里報(bào)出場景.角色的 ID新手定位問題不再靠逐幀試。一條命令跑完所有檢查QA 通過 EditorCommandExecutor.java 暴露為編輯器控制臺(tái)命令qa()方法取出當(dāng)前項(xiàng)目的 World 交給QA執(zhí)行。同文件里還附帶了checkI18N檢查多語言缺失鍵、printUnusedSounds找出未使用的音效等同類體檢命令構(gòu)成編輯器內(nèi)置的輕量質(zhì)量門禁。 新手可以借鑒的三個(gè)設(shè)計(jì)點(diǎn)一個(gè)操作一個(gè)類UndoOp 19 個(gè)操作類新增功能時(shí)零耦合測試也簡單遍歷與規(guī)則分離ModelWalker 負(fù)責(zé)去哪Visitor 負(fù)責(zé)看什么加檢查規(guī)則不用碰遍歷代碼質(zhì)量檢查前置到編輯器把動(dòng)詞缺失cutmode 沒還原這類錯(cuò)誤在制作階段就暴露出來而不是等玩家上線后才崩潰。寫在最后Bladecoder Adventure Engine 的 Undo 系統(tǒng)與 QA 自動(dòng)校驗(yàn)并不炫技卻把命令模式 訪問者模式這兩個(gè)經(jīng)典設(shè)計(jì)講得明明白白撤銷棧讓編輯零風(fēng)險(xiǎn)模型巡檢驗(yàn)證讓錯(cuò)誤早發(fā)現(xiàn)。如果你想深入源碼從 undo 目錄 與 qa 目錄 這兩個(gè)小模塊入手一兩個(gè)小時(shí)就能讀透 【免費(fèi)下載鏈接】bladecoder-adventure-engineClassic point and click adventure game engine and editor項(xiàng)目地址: https://gitcode.com/gh_mirrors/bl/bladecoder-adventure-engine創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考