Эта модель определения сущности слишком многословна? - PullRequest
1 голос
/ 11 сентября 2011

Я занимаюсь разработкой видеоигры, и мне бы хотелось, чтобы она была очень изменяемой. В настоящее время вся моя игровая логика определена в Python, моя логика движка в C ++, а мои данные в XML. Я хотел бы объяснить вам, как сущность определяется в моей игре, и послушать, что вы думаете; например, это слишком многословно?

Сначала немного фона:

  • Сущности состоят из компонентов (модель сущностей на основе компонентов).
  • Компоненты могут быть двух типов: атрибуты и поведения.
  • Атрибуты являются просто «тупыми» данными. Это такие вещи, как здоровье, скорость и т. Д.
  • Поведения определяют, как сущность взаимодействует со своими Атрибутами, миром, другими сущностями.

Определение атрибута

Я пройдусь по этой части за частью. Сначала я объясню, как определить атрибут. В Python и атрибут может выглядеть примерно так:

class Life(Attribute):
    def __init__(self):
        # Default values
        self.health = 100
        self.toxicity = 0 

Довольно простой. Теперь в XML-файле каждому полю в Атрибуте может быть присвоено различное значение для каждой определяемой нами сущности:

<Attribute>
    <Name>life</Name>
    <Class>hero.attributes.Life</Class>
    <Field>
        <Name>health</Name>
        <Value>100</Value>
    </Field>
    <Field>
        <Name>toxicity</Name>
        <Value>78</Value>
    </Field>
</Attribute>
  • Name & mdash; идентификатор для атрибута (вроде как объекты в Python). Будет полезно, когда мы определим поведение.
  • Class & mdash; класс Python этого атрибута.
  • Field & mdash; поле атрибута.
  • Field.Name & mdash; должно быть таким же, как поле Python («self.health» & rarr; «health»).
  • Field.Value & mdash; значение этого поля.

Определение поведения

Как я уже говорил ранее, Поведения взаимодействуют с Атрибутами сущности. Например, приведенное ниже поведение Damage должно знать об атрибуте Life .

class Damage(Behavior):
    def __init__(self):
        self.life = None

Код XML для настройки поведения похож на код атрибута, но не идентичен:

<Behavior>
    <Class>hero.behaviors.Damage</Class>
    <Attribute>
        <Field>life</Field>
        <Link>life</Link>
    </Attribute>
</Behavior>
  • Class & mdash; Класс поведения Python;
  • Attribute.Field & mdash; поле Поведения, где должна быть размещена ссылка на Атрибут
  • Attribute.Link & mdash; на какой атрибут ссылаться. Должно быть одним из значений в тегах Name атрибутов, определенных выше.

1 Ответ

1 голос
/ 11 сентября 2011

Рассматривали ли вы использовать json вместо XML?Это менее многословно, более читабельно и может быть преобразовано в готовую к использованию структуру данных Python:

Например:

import json

x='''{"Field": [{"Name": "health", "Value": 100}, {"Name": "toxicity", "Value": 78}],
    "Name": "life",
    "Class": "hero.attributes.Life"}'''

attribute=json.loads(x)

# {u'Class': u'hero.attributes.Life',
#  u'Field': [{u'Name': u'health', u'Value': 100},
#             {u'Name': u'toxicity', u'Value': 78}],
#  u'Name': u'life'}

И преобразовать dict обратно в json,

attr=json.dumps(attribute)
...