Не удается получить доступ к ключу объекта внутри функции объекта? - PullRequest
2 голосов
/ 20 июня 2020

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

В моей игре я разрешаю пользователю выбирать перки в начале игры.

Одно из этих умений - «смазка».

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

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

Вот код для двух вопросов, один из которых имеет функцию.

function addRadiatedStatus() {
  character.radiated = true;
}

const textNodes = [
  {
    id: 1,
    text: "Do you want to help this person?",
    options: [
      {
        text: "Yes",
        nextText: 2,
      },
      {
        text: "No",
        nextText: 2,
      },
    ],
    faction: "Greaser",
  },
  {
    id: 2,
    text: "It was a trap, do you run or kill them?",
    options: [
      {
        text: "Run",
        nextText: 3,
        damage: 0,
      },
      {
        text: "Kill",
        nextText: 5,
        damage: 8,
        moneyDrop: 20,
        radiationDamage: 2,
        function: function update() {
          if (character.greaser == true && textNodes[1].faction == "greaser") {
            console.log("greaser check worked");
          }
          console.log("upadte function worked");
          character.health -= this.damage;
          character.cash += this.moneyDrop;
          character.radiationLevel += this.radiationDamage;
          character.maxHP -= this.radiationDamage;
          if (this.radiationDamage >= 1) {
            addRadiatedStatus();
          }
          console.log("character HP" + " " + character.health);
          console.log("character maxHP" + " " + character.maxHP);
          console.log("moneyDrop " + " " + this.moneyDrop);
          console.log("character cash" + " " + character.cash);
          console.log("radiation level" + " " + character.radiationLevel);
          console.log("character Raditated?" + " " + character.radiated);
        },
      },
    ],
    faction: "Greaser",
  },
];

textNodes[1].options[1].function();

Как видите, я Я жестко кодирую textNodes[1].faction, что станет очень раздражающим, когда у меня появятся сотни вопросов / вариантов.

Я ищу способ сказать что-то вроде `textNodes [textNodes.id] .faction ', что позволит мне t повторное использование кода и отсутствие необходимости в жестком коде.

Я также не понимаю, как я могу также автоматически вызывать любую функцию в рамках выбора / ответа вопроса, потому что в настоящее время я жестко кодирую вызов функции в нижней части моя страница выглядит так textNodes[1].options[1].function().

Я хочу иметь возможность делать 2 вещи ...

  1. Вызывать эту функцию автоматически всякий раз, когда игрок делает выбор

  2. Динамически добавляйте идентификатор textNode к проверке if / else на наличие «greaser».

Я новичок в javascript и не конечно, почему у меня возникают проблемы с получением ключа «id» из моей функции.

* 1 035 * Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Измените объявление вашей функции обратного вызова. Вы используете:

function: function update(){

, а для его вызова вы используете:

textNodes[1].options[1].function();

Вместо этого вы можете написать это так:

update: () => { 

и называть его как это:

textNodes[1].options[1].update();

Кроме того, если вы не хотите ничего жестко кодировать, вы можете изменить объект символа, и вместо логического character. greaser вы можете создать строку character. faction со значением greaser, тогда вы можете просто сделать это

if (character.faction == this.faction) {
      console.log("greaser check worked");
}

Вы также можете попробовать передать id в качестве аргумента функции update().

update: (id) => { // pass id in update function

if (character.faction == textNodes[id].faction) { // check is done
      console.log("greaser check worked");
}

textNodes[1].options[1].update(1); //  this could help in case you want to also check values of other textNodes
0 голосов
/ 20 июня 2020

Добавьте еще одну функцию, чтобы найти нужный текстовый узел. Затем вызовите функцию для этого textNode как

function findTextNode(){
   if(character.greaser == true){
   var textNode=textNodes.filter(textNode => textNode.faction === "Greaser") 
   if(textNode){ 
     return textNode
   }
   return null;
}
var textNode=findTextNode();
if(textNode && textNode.update){// if textNode not null and have update function 
  textNode.update();
}

//Then update function will be as

update: function update(){
... function body goes here ...
   }
...