Компилировать XML в Java - PullRequest
       4

Компилировать XML в Java

2 голосов
/ 05 октября 2011

У меня сложная задача. Я думаю о создании простой игры, и в этой игре я собираюсь применить систему баффов ( читайте здесь для получения дополнительной информации ).

Итак, допустим, я хочу создать бафф:

<buff name="Life Steal">
  <afterAttack>
    <heal target="attacker">$damage$ * 0.2</heal>`
  </afterAttack>
</buff>

В этом тезисе будет получен следующий вывод:

public class Life_Steal extends Buff {

    @Override
    public void afterAttack(Object attacker, Object defender, int damageDone) {
        heal(attacker, damageDone * 0.2);
    }
}

Возможно ли это? Если так, есть ли какой-нибудь инструмент, который позволяет мне делать что-то подобное?


EDIT

Я обнаружил, что смешивание Javascript и XML было бы хорошим способом сделать это.

<buff name="Life Steal>
  <onattach>
    <javascript>
      attacker.hp += damage * 0.2;
    </javascript>
  </onattach>
</buff>

Это лучшее решение, которое я мог придумать. У кого-нибудь есть лучший?

Ответы [ 8 ]

4 голосов
/ 05 октября 2011

Я не оправдываю этот проект, но он соответствует тому, что вы делаете. Jelly - Исполняемый файл XML . Самый безболезненный способ загрузки XML - это JAXB .

Тем не менее, реальный язык сценариев был бы намного лучшим выбором.

  1. Javascript по умолчанию включен в качестве языка механизма сценариев (Rhino)
  2. Lua - хороший выбор в качестве выделенного встроенного языка сценариев
  3. Jython очень популярен
  4. JRuby также доступен

В любом случае, прежде чем идти дальше, прочитайте Создание сценариев для платформы Java и Руководство по программированию сценариев Java .

Если вам просто нужно использовать XML по какой-то причудливой причине, смесь JAXB со сценариями, встроенными в XML, может быть другим путем.

1 голос
/ 09 января 2012

Хотя XStream может использоваться для анализа XML, вам лучше придерживаться языковых сценариев.

1 голос
/ 06 октября 2011

Если вы хотите поддерживать только ограниченную выразительную мощь в своих выражениях, использование выражений XPath, встроенных в XML, является хорошим выбором, и самый простой способ оценить их - преобразовать XML в XSLT.

Если вы хотитечтобы поддерживать более богатую алгоритмическую мощь, затем используйте полнофункциональный язык программирования вместо того, чтобы придумывать свой собственный.

1 голос
/ 05 октября 2011

не используйте xml и, возможно, что-то вроде:

import java.util.*;
enum Stats {
    health, mana
}
class Character {
    EnumMap<Stats, Integer> stats = new EnumMap<Stats, Integer>(Stats.class) {
        {
            for (Stats stat : Stats.values())
                put(stat, 10);
        }
    };
    int getStat(Stats stat) {
        int value = stats.get(stat);
        List<Buff> timedOut = new LinkedList<Buff>();
        for (Buff buff : buffs)
            if (System.currentTimeMillis() - buff.t0 > buff.duration) timedOut.add(buff);
            else if (buff.stat.equals(stat)) value += buff.value;
        buffs.removeAll(timedOut);
        return value;
    }
    List<Buff> buffs = new LinkedList<Buff>();
}
class Buff {
    Buff(Stats stat, int value, int duration) {
        this.stat = stat;
        this.value = value;
        this.duration = duration;
    }
    final Stats stat;
    final int value;
    final int duration;
    final long t0 = System.currentTimeMillis();
}
public class Main {
    public static void main(String[] args) throws Exception {
        Character character = new Character();
        character.buffs.add(new Buff(Stats.health,1,1000));
        System.out.println(character.getStat(Stats.health));
        Thread.sleep(2000);
        System.out.println(character.getStat(Stats.health));
    }
}
1 голос
/ 05 октября 2011

Взгляните на Apache Jelly .Это самое близкое совпадение, которое я могу придумать к тому, что вы просите (которое, я полагаю, позволяет не кодерам создавать игровой контент).

1 голос
/ 05 октября 2011

IMO, вам лучше всего реализовать такие вещи с помощью DSL или просто использовать более динамический язык, такой как JRuby или Groovy, даже если остальная часть системы находится на Java.

1 голос
/ 05 октября 2011

Похоже, вы действительно жаждете программировать на xml, что будет очень неприятно, если у вас есть сто или тысяча таких.Тем не менее, здесь определенно есть некоторая конфигурация, которую вы можете записать в xml, чтобы ваш xml был обработан в граф объектов Buff, и у вас есть метод атаки, который принимает набор баффов vararg.

Тогда вы можете оставить алгоритм в java, но сделать всю нерфинг в xml.

обновить, чтобы попытаться ответить на вопрос с кодом -

Если бы я собиралсярекомендую для этого методику, я бы сказал, что вы, вероятно, можете оставить свой xml в покое и использовать парсер JAXB, который, как мне кажется, упакован с более поздней версией jvm.

// java like pseudocode.
JAXBContext.newInstance(Buff.class);
Unmarshaller u = ctx.createUnmarshaller()
List<Buff> buffs = u.unmarshal(loadedXmlFile)

теперь вы можете использовать настройки баффов и читатьих введите безопасно в качестве конфигурации.

1 голос
/ 05 октября 2011

Я думаю, вы могли бы проделать довольно долгий путь с XSLT.Выражения произвольной формы внутри, например, элемента <heal> могут быть хитрыми.

В общем, это довольно простая проблема.Возьмите парсер - я бы порекомендовал парсер SAX или StAX, а не парсер DOM - и выводил соответствующий код Java для каждого элемента / атрибута, с которым вы сталкиваетесь.Используя что-то вроде Javassist, вы можете даже скомпилировать этот код прямо в байт-код без необходимости выводить исходный код на диск и вызывать компилятор отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...