Я делаю текстовую RPG, и вы можете сказать да или нет на каждом экране, и мне нужна помощь в удалении EventListener - PullRequest
0 голосов
/ 18 апреля 2019

Итак, у меня есть функция, которая проверяет, нажали ли вы «n» или «y», когда вы нажимаете «n», фигура атакует вас, после того как она должна удалить слушателя события, а затем дает вам шанс чтобы выиграть бой, но перед этим есть экран, который говорит, нажмите любую клавишу, чтобы продолжить, но этот экран не отображается. Помощь

Я работал над этим некоторое время, и он просто не работает, он не удаляет прослушиватель событий.

Это код начального экрана, после именования вашего персонажа и прочего

document.body.innerHTML = "<h4>As you are walking to the bar at a pub, a dark, hooded figure, pulls you aside to a corner: 'Listen, I have a job for you...'</h4><h2>Press 'Y' to accept, and 'N' to turn back to the bar</h2><img id='hoodedFigure' src='https://render.fineartamerica.com/images/rendered/default/print/6.125/8.000/break/images-medium/the-hooded-figure-kayleigh-semeniuk.jpg'>";

// Затем добавляется прослушиватель событий:

var event1 = window.addEventListener("keydown", checkKeyPressed, false);

// Это функция, которую она вызывает:

        {if (evt.keyCode == "89") {
        changeContentOnPressY(1);
    } if (evt.keyCode == "78") {
changeContentOnPressN(1);
    }}}```

//Then it calls this function to change the screen:

```function changeContentOnPressN(num) {
        if (num == 1) {
    window.removeEventListener("keydown", checkKeyPressed, false);
    document.body.innerHTML = "The strange figure draws his weapons and agresses on you. You draw your small blade, and attempt to slash his stomach.<h3 style='text-align:center;'>Press any key to continue...</h3>";
            window.addEventListener("keydown", chance(1), false);
        } if(num == 2) {
window.addEventListener("keydown", checkKeyPressed2, false);
document.body.innerHTML = ""; // for 2nd n path}}```

//This is the part that is not working:

```window.removeEventListener("keydown", checkKeyPressed, false);```

This is the chance() function:

```function chance(num) {
    if (num == 1) {
        var chance = Math.random(0.1, 1);
 if (chance >= 0.80) {
 document.body.innerHTML = "Suddenly a swaggering figure walks towards you he says intrduces himself as Jean-Jacques le Tourment des Ombres, Grand Connoisseur of the Ombres House, he says 'You made the right choice, he was not to be trusted. I too dont like the Sabbath Family. Together we can get revenge'. Press Y to accept and N top refuse";
 } else {
 document.body.innerHTML = "He quickly slits your right wrist, and collects the blood spilled in a barrel. Soon nobles will enjoy this aged red. <br> <h1 style='text-align:center;'>GAME OVER<h1><br><h3 style='text-align:center;'>Press any key to continue...</h3>";
 window.addEventListener("keydown", startGame1, false);}}}}```

1 Ответ

0 голосов
/ 18 апреля 2019

В вашем вопросе происходит много всего, и я сосредоточусь на том, что я предполагаю пропустить на экране. Насколько я могу судить, следует удалить прослушиватель событий.

В вашем коде есть этот сегмент, который должен ждать, пока игрок нажмет любую клавишу.

window.addEventListener("keydown", chance(1), false);

Проблема в том, что вы вызываете функцию "случайности" немедленно, вместо ожидания.

Если вы хотите снова отменить привязку этой функции, у вас есть

function waitForChance() {
    chance(1)
}

window.addEventListener("keydown", waitForChance, false);

Тогда вы можете отменить это позже с

window.removeEventListener("keydown", waitForChance, false);

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

// every state has 2 properties text and options
// text is what is displayed on the screen
// options contain the functions that are executed when the user presses a key
// if you want to bind a specific just bind enter that key in lower case
// if you want to accept any key add a function on anyKey 

//---------------- STATES --------------------------
let startState = {
  text: `<h4>As you are walking to the bar at a pub, a dark, hooded figure, pulls you aside to a corner: 'Listen, I have a job for you...'</h4><h2>Press 'Y' to accept, and 'N' to turn back to the bar</h2><img id='hoodedFigure' src='https://render.fineartamerica.com/images/rendered/default/print/6.125/8.000/break/images-medium/the-hooded-figure-kayleigh-semeniuk.jpg'>`,
  options: {
    y: function() {
      loadState(takeDealState)
    },
    n: function() {
      loadState(ambushState)
    }
  }
}

let takeDealState = {
  text: `What ever happend when you take the deal  (for now i reload the game on anykey)`,
  options: {
    /*Your options when you take the deal for now I just reset the game*/
    anyKey: function() {
      loadState(startState)
    }
  }
}

let ambushState = {
  text: `The strange figure draws his weapons and agresses on you. You draw your small blade, and attempt to slash his stomach.<h3 style='text-align:center;'>Press any key to continue...</h3>`,
  options: {
    anyKey: function() {
      var chance = Math.random(0.1, 1)
       if (chance >= 0.80) {
        loadState(successfullAmbush)
       } else {
        loadState(failedAmbush)
       }
    }
  }
}

let successfullAmbush = {
  text: `Suddenly a swaggering figure walks towards you he says intrduces himself as Jean-Jacques le Tourment des Ombres, Grand Connoisseur of the Ombres House, he says 'You made the right choice, he was not to be trusted. I too dont like the Sabbath Family. Together we can get revenge'. Press Y to accept and N top refuse`,
  options: {
    y: function() {
      console.log("accept")
    },
    n: function() {
      console.log("decline")
    }
  }
}

let failedAmbush = {
  text: `He quickly slits your right wrist, and collects the blood spilled in a barrel. Soon nobles will enjoy this aged red. <br> <h1 style='text-align:center;'>GAME OVER<h1><br><h3 style='text-align:center;'>Press any key to continue...</h3>`,
  options: {
    anyKey: function() {
      loadState(startState)
    }
  }
}

///---------------- LOGIC show and handle keypresses ---------------------------------- 
let currentState;

function loadState(state) {
  // set the state as the current state, so it can 
  currentState = state;
  // let the state descibe the scene
  document.body.innerHTML = state.text;
}

function keyHandler(event) {
  if(currentState.options.anyKey) {
    // handle anykey
    currentState.options.anyKey(event.key)
  } else if(currentState.options[event.key]) {
    // handle other key presses such as y/n
    currentState.options[event.key](event.key)
  }
}

window.addEventListener("keypress", keyHandler, true)

// start the game
loadState(startState)
...