Игра на Java — скрипте

#javascript #html #css

#javascript #HTML #css — код

Вопрос:

Я ищу некоторую помощь в моей игре на Java-скрипте, поскольку я только начал разбираться в ней сейчас,

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

Я был бы признателен за любую помощь, которую я мог бы получить

  const skate = document.getElementById("skate");
    const rock = document.getElementById("rock");
    const score = document.getElementById("score");

    function jump() {
    skate.classList.add("jump-animation");
    setTimeout(() =>
    skate.classList.remove("jump-animation"), 500);
    }

    document.addEventListener('keypress', (event) => {
    if (!skate.classList.contains('jump-animation')) {
    jump();
    }
    })

    setInterval(() => {
    const skateTop = parseInt(window.getComputedStyle(skate)
    .getPropertyValue('top'));
     const rockLeft = parseInt(window.getComputedStyle(rock)
    .getPropertyValue('left'));
     score.innerText  ;

     if (rockLeft < 0) {
     rock.style.display = 'none';
     } else {
     rock.style.display = ''
     }

     if (rockLeft < 50 amp;amp; rockLeft > 0 amp;amp; skateTop > 150) {
    
    location.reload();
    
    }
    }, 50); 
     #score { text-align: center; }

    #game {
    width: 600px;
    height: 300px;
    border: 2px solid black;
    margin: auto;
    background-image: url("./background.gif");
    background-size: cover;
    }

    #skate {
     height: 75px;
     width: 75px;
     top: 220px;
     position: relative;
     background-image: url("./skateboard.png");
     background-size: cover;
     }

     #rock {
     width: 50px;
     height: 50px;
     position: relative;
     top: 175px;
     left: 550px;
     background-image: url("./rock.png");
     background-size: cover;
     animation: rock 1.33s infinite;
     }

     @keyframes rock {
     0%{left: 550px;}
     100%{left: -50px;}
     }

     .jump-animation {
     animation: jump 0.5s;
     }

    @keyframes jump {
    0%{top: 225px;}
    50%{top: 75px;}
    75%{top: 75px;}
    100%{top: 225px;}
    } 
 <div id="game">
    <div id="skate"></div>
    <div id="rock"></div>
    </div>
    <h1 id="score">0</h1> 

Комментарии:

1. не вызывать location.reload()

2. я удалил это, но анимация все еще продолжает повторяться, а счетчик очков продолжает увеличиваться

3. Не могли бы вы немного объяснить игру

Ответ №1:

Хитрость здесь в том, чтобы иметь переменную в верхней области этого модуля для отслеживания идентификатора текущей анимации, чтобы анимацию / интервал можно было отключить, если пользователь нажмет кнопку «Пуск» до окончания текущей игры. Он также должен отключаться после выполнения условия завершения игры, хотя я не совсем уверен, почему window.getComputedStyle() используется для вычисления переменных, используемых для этого условия, но я думаю, что это все еще продолжается.

РЕДАКТИРОВАТЬ: почему-то я не заметил, что игрок и препятствие уже были в игре, поэтому я добавил к ним цвета для упрощения отладки, по крайней мере, с моей стороны. На этот раз я сделал так, что камень потеряет, а затем немедленно восстановит класс для своей анимации, но повторное добавление должно быть асинхронным, даже если задержка составляет 0 мс.

index.html

 <head>
    <link rel="stylesheet" href="style.css">
</head>

<body>
    <div id="game">
        <div id="skate"></div>
        <div id="rock"></div>
    </div>
    <h1 id="score">0</h1>
    </div>
    <div>
        <button id="new-game">New Game </button>
    </div>
</body>

<script>
    const skate = document.getElementById("skate");
    const rock = document.getElementById("rock");
    const score = document.getElementById("score");
    const newGameButton = document.getElementById("new-game");

    function jump() {
        skate.classList.add("jump-animation");
        setTimeout(() => skate.classList.remove("jump-animation"), 500);
    }

    document.addEventListener('keypress', (event) => {
        if (!skate.classList.contains('jump-animation')) {
            jump();
        }
    });


    let animationId;
    newGameButton.addEventListener('click', () => {
        resetScore();
        resetRockAnimation();
        playScoreAnimation();


        function resetScore() {
            clearInterval(animationId);
            score.innerText = 0;
        }
        function resetRockAnimation() {
            rock.classList = [];
            setTimeout(() => rock.classList.add('rock-animation'), 0);
        }
        function playScoreAnimation() {
            animationId = setInterval(() => {
                const skateTop = parseInt(window.getComputedStyle(skate).getPropertyValue('top'));
                const rockLeft = parseInt(window.getComputedStyle(rock).getPropertyValue('left'));
                score.innerText  ;

                if (rockLeft < 0) {
                    rock.style.display = 'none';
                }
                else {
                    rock.style.display = '';
                }

                if (rockLeft < 50 amp;amp; rockLeft > 0 amp;amp; skateTop > 150) {
                    clearInterval(animationId);
                }
            }, 50);
        }
    });
</script>
 

style.css

 #score {
    text-align: center;
}

#game {
    width: 600px;
    height: 300px;
    border: 2px solid black;
    margin: auto;
    background-image: url("./background.gif");
    background-size: cover;
}

#skate {
    height: 75px;
    width: 75px;
    top: 225px;
    position: relative;
    background-image: url("./skateboard.png");
    background-size: cover;

    background-color: slategrey;
}

#rock {
    width: 50px;
    height: 50px;
    position: relative;
    top: 175px;
    left: 550px;
    background-image: url("./rock.png");
    background-size: cover;

    background-color: lightcoral ;
}

.rock-animation {
    animation: rock 1.33s infinite;
}

@keyframes rock {
    0% {
        left: 550px;
    }

    100% {
        left: -50px;
    }
}

.jump-animation {
    animation: jump 0.5s;
}

@keyframes jump {
    0% {
        top: 225px;
    }

    50% {
        top: 75px;
    }

    75% {
        top: 75px;
    }

    100% {
        top: 225px;
    }
}
 

Комментарии:

1. анимация для #rock по-прежнему выполняется без нажатия кнопки hen, когда я добавил эти изменения. функция перехода и оценка не активируются, пока я не нажму новую игру, как и должно быть

2. Наверное, я запутался, потому что не мог видеть элементы скейта или рока и просто предположил, что вы все еще работаете над этим, поэтому я сосредоточился только на партитуре

3. Я не знаю, получают ли люди уведомления при обновлении ответа, но этот комментарий должен сообщить вам, что я это сделал