※ 引述《reinforce15 (可魯貝洛斯)》之銘言:
: //
: void DestructibleActor::ReceiveDamage(float sourceDamage)
: {
: //
: auto resolvedDamage = sourceDamage;
: for (const auto& debuf:m_debufs)
: {
: resolvedDamage = debuf.ApplyToDamage(resolvedDamage);
: m_currentHealth -= resolvedDamage
: if (m_currentHealth <= 0.f)
: {
: m_currentHealth = 0.f;
: DestroyMe();
: }
: }
: }
其實這公式怪怪的
看來是一個原始傷害
經過N個debuff後,各自計算增減的傷害
依序把HP扣掉debuf的傷害後作死亡判斷
但問題是
1.這樣原始傷害好像沒計算到?
可能一定有一個debuff傷害是直接*1把原始傷害當debuff傷害修正來計算
2.這樣每次判斷死亡其實沒必要
一次算出debuff後總傷害後去判斷就可以了
3.後面依序使用resolvedDamage來計算
這寫法應該是把resolvedDamage當總傷害計算
還依序用體力去減
這樣好像怪怪的
也就是第一種debuff計算比如加重傷害10%
sourceDamage為100時
(1)以每次記算debuff增加的傷害,那resolvedDamage應該是10
m_currentHealth用resolvedDamage去減是正確的
但第二次ApplyToDamage用resolvedDamage(=10)去算就有問題了
(2)以總傷害來計算的話
ApplyToDamage用resolvedDamage去算是正確的
第一次計算後resolvedDamage=110
但每次迴圈都要m_currentHealth -= resolvedDamage;
那就有問題了
而且DestroyMe();
較安全寫法應該函式內部也要去檢查是不是已經死了
另外這個應該不完全是debuff計算
也包含buff減傷的計算吧