Функция установки интервала в игре на JavaScript не запускается каждые 10 секунд

#javascript #html #css #setinterval

#javascript #HTML #css #setinterval

Вопрос:

Я пытаюсь добавить некоторую серьезность к круглому кругу в игре HTML, CSS и JavaScript. Раздел JavaScript соответствующего кода приведен ниже:

repl.it https://repl.it/join/wukcvzow-iamapersonthing

После этого руководства и соответствующей части: 06.44 минут.

https://youtu.be/3SsYZDJdeXk

JavaScript:

 var block = document.getElementById("block");
var hole = document.getElementById("hole");
//add this for the setInterval function
var character=document.getElementById("character");

hole.addEventListener('animationiteration',() => {
  var random = Math.random()*3;
  var top = (random*100) 150;
  hole.style.top=-(top)   "px";
});

//interval function runs every 10 milliseconds

setInterval(function(){
  var characterTop = 
  //this is the gravity function
  parseInt(window.getComputedStyle(character).getPropertyValue("top"));
  character.style.top=(characterTop 3) "px";
  
  },10);
 

Я предполагаю, что проблема заключается в этом последнем бит:

 },10);
 

но поскольку код не показывает никаких синтаксических или других ошибок, я не могу дальше устранять неполадки. Я также поиграл с CSS, но, похоже, не могу найти источник проблемы.

В последующем руководстве предполагалось, что «10» — это частота обновления, но я думаю, что это не так. Это 10 каким-то образом заставляет мяч двигаться медленнее или быстрее при движении вниз. Я хочу, чтобы вся анимация (движение шара вниз) обновлялась каждые 10 секунд.

Короче говоря, я хочу, чтобы розовый шар (элемент символа) постоянно выпадал каждые 10 секунд. На данный момент он падает ОДИН РАЗ, а затем исчезает с экрана. Только после этого она снова падает, когда нажата кнопка «ВЫПОЛНИТЬ».

HTML для этого проекта:

 <!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>FlappyBird</title>
    <link href="style.css" rel="stylesheet" type="text/css" />
  </head>
  <body>

    <div class="sky">
    <div class="ground">


    <div id="game">
      
     
      <div id="block"></div>
      <div id="hole"></div>
      <div id="character">
        
      </div>
</div>
    <script src="script.js"></script>
  </body>
</html>
 

И CSS

 *{
  padding:0;
  margin:0;
  
}

#game{
  width:400px;
  height:500px;
  border: 1px solid greenyellow;
  margin:auto;
  overflow:hidden;
}


#character{
width:50px;
height:50px;
background-color:rgb(255, 0, 149);
position: absolute;
top:250px;
border-radius:50%;

}

#block{
  width:50px;
  height:500px;
  background-color:greenyellow;
  position: relative;
  left:400px;
  animation:block 2s infinite linear;
}

@keyframes block{
  0%{left:400px}
  100%{left:-50px}
}

#hole{
  width:50px;
  height:150px;
  background-color:white;
  position: relative;
  left:400px;
  top:-500px;
  animation:block 2s infinite linear;

}

/*

.sky{
  background-color:aqua;
  width:400px;
  height:500px;
  position: relative;
}

.ground{
  background-color:brown;
  width:400px;
  height:100px;
  position: relative;
  top:500px;
}
*/
 

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

1. Как насчет зеленой полосы? Должен ли он продолжать скользить таким же образом?

2. Это копия (попытка) flappy birds. Ранние стадии. Таким образом, зеленая полоса перемещается, и «дыра» создает пробелы в зеленой полосе. Зеленая полоса должна скользить, а мяч должен опускаться каждые 10 секунд. (гравитация)

3. Нет, мяч не должен падать каждые 10 секунд. Он должен выпадать ГОРАЗДО чаще, чем это. Я считаю, что вы на самом деле хотите, чтобы он сбрасывался каждые 10 миллисекунд, что в 1000 раз чаще.

4. Если вы пытаетесь воспроизвести игру, почему бы вам просто не использовать код парня для руководства?

5. @Compoot Я считаю, что проблема в том, что никто здесь не знает, в чем проблема. Пока единственное, что вы указали как «полезное», — это предложения перейти к чтению руководства… Вы не говорите нам, что вам нужно или что вы хотите, вы просто говорите «это не решение» всему, что не является ссылкой на тот же учебник, который у вас уже есть …. ?


Ответ №1:

Я ценю, что вы более подробно объяснили мне свой вопрос! Я считаю, что теперь я могу правильно ответить на вопрос. Я ценю ваше терпение.

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

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

Я действительно надеюсь, что это поможет…


Ниже вы можете найти мой предыдущий ответ, прежде чем OP объяснил, что именно ей нужно. (Произошло недоразумение с обеих сторон.)


Хорошо, я думаю, мне есть что сказать здесь:

  1. setInterval() Функция принимает два параметра. Функция и «таймер интервала», который измеряется в миллисекундах. Теперь любой код, находящийся внутри переданной функции, будет запускаться каждый раз, когда проходит x миллисекунд. Возьмем этот пример:
 setInterval(() => {console.log("something")},15);
 

«что-то» будет регистрироваться в консоли каждые 15 миллисекунд.

Хорошо, теперь, когда мы с этим разобрались, я вижу, как вы говорите в одном из своих комментариев выше, что «В следующем руководстве предполагалось, что «10» — это частота обновления, но я думаю, что это не так. Это 10 каким-то образом заставляет мяч двигаться медленнее или быстрее при движении вниз. » 10 — это частота обновления. 10 — это количество миллисекунд, которое разрешено проходить между вызовами функции, которая «перемещает игрока вниз», и чем меньше число 10, тем быстрее игрок будет двигаться вниз, поскольку код, который заставляет игрока двигаться вниз, выполняется чаще… Так что это имеет смысл.

Теперь второе, что я хочу сказать: зачем создавать игру с использованием HTML-элементов, управляемых CSS через JavaScript, вместо того, чтобы просто создавать игру с использованием HTML <canvas> -элемента? Манипулирование CSS элементов DOM, как правило, ненадежно в области разработки игр, а также медленнее (поскольку движку приходится постоянно пересчитывать «поток» страницы) и сложнее… В этом нет никакой пользы. (Он использует больше кода, работает более неэффективно, он менее читабелен, менее надежен и т. Д.) Так почему бы вам просто не использовать <canvas> тег и не манипулировать им, используя 2D контекст или используя библиотеку, например p5.js или что-то подобное? Есть ли какая-то особая причина, по которой вы делаете это так, как вы это делаете?

Ответ №2:

Repl не работает.

 setInterval(function(){
  const previewTop = window.getComputedStyle(character).getPropertyValue("top");
  const oldTop = parseInt(previewTop);

  console.log({ previewTop, oldTop })

  character.style.top = `${previewTop   3}px`;  
},10);
 

Можете ли вы попробовать записать это и посмотреть, что вы получите?

Ответ №3:

Хорошо, я думаю, я понял, о чем вы спрашиваете.

Работает:

Во setInterval(function, time) -первых, используется для рендеринга мяча каждые 10 мс, так что каждые 10 мс мяч перемещается на 3 очка вниз. Итак, как вы сказали, похоже, что это влияет на скорость, но на самом деле это влияет на скорость рендеринга, что ускоряет ее.

Решение:

Теперь, что вы могли бы сделать, так это дождаться n-го рендеринга, когда мяч перемещается за пределы экрана, т.е. Тогда вы могли бы сбросить положение мяча character.style.top = '250px' до того места, где он был запущен в первый раз.

JS

 setInterval(function(){
  var characterTop = 
  parseInt(window.getComputedStyle(character).getPropertyValue("top"));
  character.style.top=(characterTop 3) "px";
  if(character.offsetTop > game.offsetHeight){
    // Game over
    setTimeout(() => {
      // Reset the ball after 1s
      character.style.top= "250px";
    },1000)
  }else{
    
  }
  },10);```