выполнение кода as3 из строки - PullRequest
1 голос
/ 01 апреля 2011

Я работаю над простым текстовым RPG и храню все свои объекты данных в виде XML-файлов, но мне нужно иметь возможность выполнять некоторые простые операторы для многих вещей.

Я сделалнемного гуглил я не придумал много.

То, что я пытаюсь сделать, это взять простые выражения вроде:

playerhp += 15;

или

if(playerisvampire == 1) {blah blah;}

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

Ответы [ 2 ]

0 голосов
/ 01 апреля 2011

Я не уверен, что понимаю, как вы хотите создать эту идею.

Если вы хотите использовать что-то похожее на eval, то нет никакого собственного способа сделать это.Хотя, вы можете проверить эту библиотеку и посмотреть и пример здесь

Теперь я бы не рекомендовал использовать такую ​​вещь по многим причинам.Подумайте об этом немного больше, и вы сами разберетесь в этом.

Я бы предложил реализовать простой синтаксический анализатор и загрузить команды из вашего xml, а затем просто интерпретировать предоставленные данные и выполнить соответствующую команду:

<command id="hurt" params="-15"/>
0 голосов
/ 01 апреля 2011

ActionScript 3 больше не содержит функцию eval, поэтому это невозможно сделать напрямую. Тем не менее, вы можете свернуть свой собственный простой переводчик, чтобы сделать это вручную. Примерно так:

var item:XML =
    <health_item>
        <action name="hp_change" value="15"/>
    </health_item>;

Проверьте имя действия в ActionScript, найдите соответствующую функцию и вызовите ее с аргументом «значение»:

for each (var action:XML in item.action) {
    var actionName:String = action.@name;

    //switch variant
    switch (actionName) {
        case "hp_change":
            hpChange(action.@value);
            break;
        //and so on for other known actions
    }

    //direct call by name variant
    if (hasOwnProperty(actionName)) {
        this[actionName](action.@value);
    } else {
         //report error
    }
}
...