Чувствительность в моей игре с использованием setInterval не работает (js) - PullRequest
1 голос
/ 03 августа 2020

Итак, я создаю игру, в которой, если кто-то щелкает значок параметра, открывается панель со слайдом рейнджера (значения: 1 = низкая чувствительность, 2 = средняя чувствительность, 3 = высокая чувствительность). Этот слайд рейнджера определяет скорость, с которой движется мой космический корабль (чувствительность). Однако я столкнулся с проблемой при изменении чувствительности. У моего кода странное поведение (иногда он работает, иногда нет). Есть идеи, почему? Вот код:

Рейнджер слайд:

<input type="range" id="sensibilty" min="1" max="3" value="2">

Js код

const loop = function() {
if (keys[37] || keys[65]) {pos.left -= 10} //THIS IS HOW SPACESHIP MOVES WITH KEYBOARD KEYS
if (keys[39] || keys[68]) {pos.left += 10}
if (keys[38] || keys[80]) {pos.top -= 1}
if (keys[40] || keys[75]) {pos.top += 1}}
let sens = setInterval(loop, 1000 / 40) //INITIAL SENSIBILITY

function validateSens() {
let sensibilty = document.getElementById("sensibilty").value
if (sensibilty == 1 || sensibilty == "1") {clearInterval(sens); setInterval(loop, 1000 / 30)} 
//DIFFERENT SENSIBILITY BASED ON RANGER SLIDE VALUE
if (sensibilty == 2 || sensibilty == "2") {clearInterval(sens); setInterval(loop, 1000 / 40)}
//DIFFERENT SENSIBILITY BASED ON RANGER SLIDE VALUE
if (sensibilty == 3 || sensibilty == "3") {clearInterval(sens); setInterval(loop, 1000 / 60)}
//DIFFERENT SENSIBILITY BASED ON RANGER SLIDE VALUE
else {alert("Sorry, a bug occured")}} //That gives me an alert if bug occurres

Кроме того, это предупреждение иногда открывается, иногда нет ... очень странно

1 Ответ

1 голос
/ 03 августа 2020

Вы не переназначаете результат setInterval().

Проверьте код ниже (я также немного упростил его).

function validateSens() {
    clearInterval(sens);
    let sensibilty = parseFloat(document.getElementById("sensibilty").value);

    switch(sensibilty) {
        case 1:
            sens = setInterval(loop, 1000 / 30);
            break;
            
        case 2:
            sens = setInterval(loop, 1000 / 40);
            break;
            
        case 3:
            sens = setInterval(loop, 1000 / 60);
            break;
            
        default:
            alert("Sorry, a bug occured");
            break;
    }
}
...