Actionscript 3 - получить значение переменной по имени строки - PullRequest
0 голосов
/ 10 мая 2018

Я нашел вопрос, похожий на этот, но приведенные ответы не работают в моей ситуации.
Позвольте мне объяснить:

Я работаю над создателем текстовых полей в визуальном романе. Основные функции: чтение текста из динамического текстового поля 'dialogText', сохранение его в виде строки, очистка текстового поля и добавление сохраненного символа строки для символа. Это работает отлично, но я хочу, чтобы функциональность заменяла текст между двойными скобками, например ((playerName)), со значением переменной, указанной в скобках. Сохранение того, что находится между скобками в виде строки, также работает, но мне еще нужно найти способ напечатать значение переменной, указанной в скобках.

Пример:

var playerName:String = "Anon";

function playFrame(frame:String):Function {
   return function(evt:Event = null):void{
      ...
      dialogueLine = dialogueText.text;
      for(var i:int = 0; i < dialogueLine.split("((").length - 1; i++){
         var dialogueVar:String = dialogueLine.substring(dialogueLine.indexOf("((") + 2, dialogueLine.indexOf("))"));
         //dialogueVar now contains whatever variable name is specified between (( ))   
         dialogueLine = dialogueLine.split("((" + dialogueVar + "))").join(***);
         //In join, *** has to be something that uses dialogueVar to look up a variable with name 'dialogueVar' (e.g. playerName), and then give it's value (which in this case would be 'Anon')
      }
      dialogueText.text = "";
      ...
   }
}

Мне порекомендовали использовать этот [dialogVar] для этого, но при использовании trace () для проверки я получаю 'undefined'. У кого-нибудь есть опция, которая не жестко программирует оператор switch для каждой возможной переменной?

1 Ответ

0 голосов
/ 11 мая 2018

Я пытался this[dialogueVar] ... но после используя trace() для проверки, я получаю: " undefined ".

Если ваш код находится внутри класса (например: не написан на Действия панель), простое решение - сначала объявить переменные (как public или private vars), то можете использовать их внутри других функций без ошибок.

//# declare public variables (before using inside any later functions)
public var playerName :String = "";
public var dialogueLine :String ="";

Я хочу, чтобы функциональность заменяла текст в двойных скобках, например ((playerName)), со значением переменной, указанной в скобках.

С вышеуказанным исправлением ваша попытка кода должна работать. Тест join вот так:

dialogueLine = dialogueLine.split("((" + dialogueVar + "))").join( this[dialogueVar] + "...!!");

Помните, что любое значение, полученное с помощью dialogueVar =, должно существовать как открытая или закрытая переменная.

Наконец, ваш пример кода должен выглядеть примерно так:

//# declare public variables (before using inside any functions)
public var playerName :String = "";
public var dialogueLine :String ="";

//# inside some fuction, update playerName with expected "Anon"...
playerName  = "Anon";

//# your problematic function now works like this...
function playFrame(frame:String):Function 
{
    return function(evt:Event = null):void
    {
        ...
        dialogueLine = dialogueText.text;
        //dialogueLine = "hello there, I see your name is ((playerName))";

        for(var i:int = 0; i < dialogueLine.split("((").length - 1; i++)
        {
            var dialogueVar:String = dialogueLine.substring(dialogueLine.indexOf("((") + 2, dialogueLine.indexOf("))"));
            dialogueLine = dialogueLine.split("((" + dialogueVar + "))").join( this[dialogueVar] + "...!!");

        }
        dialogueText.text = "";
        ...
    }
}

PS: Если ваш код находится на временной шкале (Действия), протестируйте этот код, чтобы получить представление:

var playerName :String = "Anon";
var dialogueLine :String ="";
var str_Output :String = "";

dialogueLine = "hello there, I see your name is ((playerName))";

var dialogueVar:String = dialogueLine.substring(dialogueLine.indexOf("((") + 2, dialogueLine.indexOf("))"));

str_Output = dialogueLine.split("((" + dialogueVar + "))").join( this[dialogueVar] + "...!!");
trace ("str_Output : " + str_Output); //# check if expected...
...