※ 引述《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减伤的计算吧