維運紀錄

20190820 故事、公牌動畫修復紀錄

在遊戲恢復初期我們收到很多玩家回報故事無法閱讀的問題,不過當時測試除了 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 確認這段程式的設計是否有問題或者依舊有缺少的檔案沒有上傳。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料