我正在做一个使用django的RPG,并且正在考虑实现技能系统的不同选项。
假设我有一个基本技能等级,比如:
class Skill (models.Model):
name = models.CharField()
cost = models.PositiveIntegerField()
blah blah blah实现特定技能的一些方法是什么?我想到的第一个选项是:
1)每个技能扩展技能等级并覆盖特定功能:
不确定这在django中是如何工作的。似乎每个技能都有一个db表,这太夸张了。当技能类有一个条目时,子类可以是抽象的吗?听起来不太对劲。使用代理类怎么样?
还有其他一些选择吗?我希望避免使用纯django方法的脚本化方法。
发布于 2009-12-03 13:28:21
也许你可以考虑分离一个技能和它的关联效果。更有可能的是,技能最终将具有一个或多个与其相关的效果,并且该效果可能会被多个技能使用。
例如,一个效果可能是“N个霜对当前目标造成伤害”。这种效果可以被技能“暴雪箭”、“霜爆”和“冰新星”所使用。
models.py
class Skill(models.Model):
name = models.CharField()
cost = models.PositiveIntegerField()
effects = models.ManyToManyField(Effect)
class Effect(models.Model):
description = models.CharField()
action = models.CharField()
# Each Django model has a ContentType. So you could store the contenttypes of
# the Player, Enemy, and Breakable model for example
objects_usable_on = models.ManyToManyField(ContentType)
def do_effect(self, **kwargs):
// self.action contains the python module to execute
// for example self.action = 'effects.spells.frost_damage'
// So when called it would look like this:
// Effect.do_effect(damage=50, target=target)
// 'damage=50' gets passed to actions.spells.frost_damage as
// a keyword argument
action = __import__(self.action)
action(**kwargs)effects\spells.py
def frost_damage(**kwargs):
if 'damage' in kwargs:
target.life -= kwargs['damage']
if target.left <= 0:
# etc. etc.发布于 2009-12-03 09:15:55
我有点累了(在瑞典很晚),所以如果我误解了,我很抱歉,但我脑海中出现的第一件事是extra fields on many-to-many relationships。
发布于 2009-12-03 11:56:03
我会设立一些继承权。
class BaseSkill(models.Model):
name = models.CharField()
cost = models.PositiveIntegerField()
type = models.CharField()
....
class FireSkill(BaseSkill):
burn_time = models.PositiveIntegerField()
def save():
self.type = 'fire_skill'
return super(FireSkill, self).save()
class IceSkill(BaseSkill):
freeze_time = models.PositiveIntegerField()
def save():
self.type = 'ice_skill'
return super(IceSkill, self).save()这样做的好处是,当您只想列出所有使用BaseSkill类所需的球员技能时。如果供应商在销售技能,您只需要在BaseSkill类中列出价格。当你需要一项技能的更详细的属性时,很容易获取类型来访问它。例如,如果你有: skill = BaseSkill.objects().get(pk=1),你可以通过执行skill.ice_skill.freeze_time或者更一般的get_attribute( skill,skill.type).field_name来访问ice skill
https://stackoverflow.com/questions/1836881
复制相似问题