战斗系统之属性设计(一)

一切属性均为属性

在战斗系统中,包含不同种类的属性。
比如:血量、攻击力、防御力、暴击率、格挡率、格挡系数等常规属性
再如:是否被眩晕、是否物理免疫、是否无敌等状态属性
三如:标记死亡、标记出生、技能CD缩减等逻辑属性
四如:当前位置、召唤者、召唤单位等对象属性

我们在常规的设计中往往只对常规属性做统一处理,部分也会统一处理状态属性,但很少的会把其他的属性也纳入进来。在此,我们不讨论对错,只对比2者的实现便捷性。

单独管理

local M = cclass("PropertyObject", import(".tableobject"))

function M:ctor()
	self._isBorned = false
end

function M:getBorned()
	return self._isBorned
end

function M:setBorned(borned)
	self._isBorned = borned or true
end

统一管理

define = {}
define.eDATT_Borned                  = 501       -- 是否已经出生完毕

local M = cclass("PropertyObject", import(".tableobject"))

function M:ctor()
	self._dynamicAttributes = {}
end

function M:getDynamicAttribute(key)
    return self._dynamicAttributes[key] or 0
end

function M:setDynamicAttribute(key, value)
	self._dynamicAttributes[key] = value
end

当只有一个属性时我们看上去好像统一管理的更复杂,这时我们再加一个属性看看结果。

单独管理

local M = cclass("PropertyObject", import(".tableobject"))

function M:ctor()
	self._isBorned = false
	self._isDeaded = false
end

function M:getBorned()
	return self._isBorned
end

function M:setBorned(borned)
	self._isBorned = borned or true
end

function M:getDeaded()
	return self._isDeaded
end

function M:setDeaded(deaded)
	self._isDeaded = deaded or true
end

统一管理

define = {}
define.eDATT_Deaded                  = 500       -- 角色已死亡
define.eDATT_Borned                  = 501       -- 是否已经出生完毕

local M = cclass("PropertyObject", import(".tableobject"))

function M:ctor()
	self._dynamicAttributes = {}
end

function M:getDynamicAttribute()
    return self._dynamicAttributes[key] or 0
end

function M:setDynamicAttribute(borned)
	self._dynamicAttributes[key] = value
end

显而易见,统一管理的方式只加了一行定义而已,这时有的看官会说你默认值不是true/false、但是我们用if ins:getDynamicAttribute(define.eDATT_Deaded) > 0 then end语句判断也是可以的嘛,并且能使我们的代码更内聚,代码量更少,何乐而不为!


版权声明:本文为Feng0_0zi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。