在遊戲恢復初期我們收到很多玩家回報故事無法閱讀的問題,不過當時測試除了 ActionScript 會跳出一些錯誤訊息外,就是看到故事應該是在畫面上用捲動的方式來呈現,但是後續的故事並沒有繼續捲動。
原本我們評估是因為一些數值設定上的錯誤,以公牌顯示處理程式 src/view/scene/game/DeckArea.as 這個檔案為例子,我們會在原始碼中發現很多類似下方的漸變動畫(Tween)處理。
public function incrementThread(wait:Number):Thread { _num += 1; var sExec:SerialExecutor = new SerialExecutor(); sExec.addThread(new TweenerThread(_label, { _text:_num.toString(), delay:wait*_INC_WAIT+0.01} )); sExec.addThread(new ClousureThread(_deck.inc)); return sExec; }
動畫漸變的對象 _label 是 ActionScript 的 Label 物件,身上有一個叫做 text 的屬性用來表示要顯示出來的文字,不過在這段漸變程式中,卻使用的是 _text 因此讓我們懷疑是否是原始碼上的問題。
不過在客戶端的原始碼中有很多地方都使用了 _text 來製作動畫,雖然保持疑惑但是還是先嘗試將 _text 修改為 text 來進行測試,以結果來說公牌的計數也從 0 變成了 52 開始正確呈現。
不過,經過測試後卻發現其他將 _text 修改為 text 的地方卻出現了 NaN 的訊息,這表示我們這樣的處理可能是有問題的,此時也將故事的顯示修正完畢,雖然可以正常運作但是卻需要手動製作補丁,這讓我們開始懷疑這樣的修正是否正確。
經過追蹤,我們注意到漸變套件在動畫處理上有一個叫做 Special Property 的設定。
var pv:Number; for (pName in tTweening.properties) { if (tTweening.properties[pName].isSpecialProperty) { // It's a special property, tunnel via the special property function if (Boolean(_specialPropertyList[pName].preProcess)) { tTweening.properties[pName].valueComplete = _specialPropertyList[pName].preProcess(tScope, _specialPropertyList[pName].parameters, tTweening.properties[pName].originalValueComplete, tTweening.properties[pName].extra); } pv = _specialPropertyList[pName].getValue(tScope, _specialPropertyList[pName].parameters, tTweening.properties[pName].extra); } else { // Directly read property pv = tScope[pName]; } tTweening.properties[pName].valueStart = isNaN(pv) ? tTweening.properties[pName].valueComplete : pv; } mustUpdate = true; tTweening.hasStarted = true;
這表示 _text 其實是一個 Special Property 但是目前他並沒有正確的生效,而我們同時也在故事的腳本中找到了相同的 Special Property 設定。
// 特定行までスクロールするスレッド public function getScrollLineThread(line:int):Thread { // 移動量 var lineNum:int = Math.abs(_infoLines[line][0] - _maskBitmap.scrollRect.y); log.writeLog(log.LV_FATAL, this, "Scrolling to ",line,lineNum,_infoLines[line][0]); return new TweenerThread(_maskBitmap, {_scrollRect_y: _infoLines[line][0], transition:"easeOutCirc", time:0.0005*lineNum+0.0002}) }
因此我們將目標轉向 Special Property 是否正確的方向來檢查,很快就發現了 Unlight 目前釋出的原始碼裡面並沒有進行所謂的「登記」動作,因此動畫套件是無法正確的讀取設定,也造成了公牌、故事無法正常的播放動畫。
目前版本的補丁已經在 Open Unlight 的 GitHub Repository 上,我們透過在遊戲起動時補上登記 Special Property 的方式讓整個動畫能夠正常運行。這段補丁修正預計會在之後以 Pull Request (合併請求)的方式發送回給 CPA 來修正原始專案,或者提出疑問請 CPA 確認這段程式的設計是否有問題或者依舊有缺少的檔案沒有上傳。