2009-12-03 4 views
3

저는 장고를 사용하여 RPG를 작업 중이며 스킬 시스템의 일부를 구현하기위한 다양한 옵션을 고려하고 있습니다. 특정 기술을 구현하는 몇 가지 방법이 될 것입니다 무엇Django 기반 스킬 구현

class Skill (models.Model): 
     name = models.CharField() 
     cost = models.PositiveIntegerField() 
     blah blah blah 

:

내가 기본 기술 수준, 즉 같은 것을 가지고 말? 마음에 오는 첫 번째 옵션은 다음과 같습니다

1) 각각의 스킬은 스킬 클래스를 확장하고 재정의 특정 기능을 :

이 장고에 어떻게 작동하는지 확실하지. 각 스킬에 대한 db 테이블을 갖는 것이 과잉이라고 보입니다. 스킬 클래스에 항목이있는 동안 하위 클래스가 추상이 될 수 있습니까? 소리가 나지 않습니다. 프록시 클래스를 사용하는 것은 어떻습니까?

다른 옵션은 무엇입니까? 나는 순수한 장고 접근을위한 스크립트 접근법을 피하고자한다.

+2

각 스킬마다 고유 한 스킬은 얼마나 다른가요? 특수 기술에 고유 한 분야가 있을까요? – Carson

답변

5

아마도 스킬을 분리하고 관련 효과가 있다고 생각할 수 있습니다. 가능성이 더 높을수록 스킬은 그들과 관련된 하나 이상의 효과를 갖게 될 것이며, 그 효과는 여러 스킬에 의해 잠재적으로 사용될 수 있습니다.

예를 들어 효과는 "현재 대상에게 N 서리 손상이 없음"일 수 있습니다. 그 효과는 "Blizzard Bolt", "Frost Blast"및 "Icy Nova"기술에서 사용할 수 있습니다.

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) 

효과 \ spells.py

def frost_damage(**kwargs): 
    if 'damage' in kwargs: 
     target.life -= kwargs['damage'] 

     if target.left <= 0: 
      # etc. etc. 
+0

내가 작업 한 게임에서 각 스킬에 대해 별도의 하위 클래스를 사용하지 않아도됩니다. 보편적 인 정보를 담고있는 일반 스킬 (Skill) 클래스를 사용하면 이와 같은 효과를 얻고 필요에 따라 다양한 효과와 액션을 연결할 수 있습니다. – Kylotan

+0

(이것은 '나는이 대답에 동의한다'는 의미였습니다.) – Kylotan

+0

좋은 반응을 보내 주셔서 감사합니다. 나는 다른 기술 유형, 즉 패시브 vs 능동 기술 등에 대한 상속을 끝내야한다는 것을 알고 있었다. 스킬/효과를 정의하는 모듈/클래스/기능을 가리키는 기본 스킬의 일부로 별도의 필드가있다. 특정 행동은 내가 알아 내려고 시도했던 것의 핵심에 달려 있습니다. – awithrow

1

나는 일종의 피곤하다. (스웨덴에서는 늦다.) 나는 오해하면 미안하지만, 내 머리 속으로 튀어 나온 첫 번째 것은 extra fields on many-to-many relationships이었다.

+0

이것은 좋은 제안이지만이 방법을 사용하여 각 스킬에 대해 추가 모델을 피하는 방법을 생각하는 데 어려움을 겪고 있습니다. – jathanism

1

일부 상속을 설정합니다. 당신은 당신이 모든 BaseSkill 클래스로 작업 할 필요가 플레이어의 기술을 나열 할 때의

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.objects()를 취득 (PK = 1) 당신이 skill.ice_skill.freeze_time 또는 더 일반적으로 get_attribute을 수행하여 얼음 기술에 액세스 할 수 있습니다 (스킬, skill.type는)

을 .field_name
1

필자가 보았을 때, 두 가지 수업이있었습니다. 하나는 추상적 인 인스턴스 (예 : 스웨덴어를 구사하는 기술, Excel 개발의 기술)에 대한 기술이고 다른 하나는 외국인이 소유 한 실제 기술입니다 스킬의 열쇠.

0

또한 하나의 테이블을 사용하고 절인 필드에 내부 모델을 기반으로 객체를 저장할 수 있습니다.