Почему мой мяч погружается в пол вместо того, чтобы подпрыгивать обратно?

#javascript

Вопрос:

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

 var gravity = 9.8
var velocity = 5;
var circleOne;

function setup() {
  createCanvas(400, 400);
  circleOne = new newCircle(200, 50, 50, "black");
}

function draw() {
  background("white");
  circleOne.display();
  circleOne.bounce();
}


class newCircle {
  constructor(x,y,radius,color) {
    this.x = x
    this.y = y
    this.radius = radius
    this.color = color
    this.velocity = 1;
  }
  
  display() {
    fill(this.color)
    ellipse(this.x,this.y,this.radius);
  }
  
  bounce() {
    if (this.y   this.radius > height) {
      this.velocity = -this.velocity * 0.5
    }
    else if (this.y < 0) {
      this.velocity = -this.velocity * 0.5
    }
    else  {
      this.velocity  = 1;
    }
    this.y  = this.velocity
    
  }
}

 

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

1. Откуда height берется? Кроме того, ваши if(){}else{} запуски даже при первых if запусках, что, вероятно, не то, что вы хотите.

2. Вам нужно использовать else if!

3. это немного исправило ситуацию, но она все равно не отскакивает

4. ну, вы продолжаете добавлять один…..

5. кроме того, DBS, height — это canvas_height, который, я думаю, встроен в редактор, который я использую

Ответ №1:

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

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

Вы должны установить дополнительное логическое значение в true при переключении скорости, затем убедитесь, что не переворачиваете его снова, пока это логическое значение равно true. Вы можете вернуть логическое значение обратно в false, как только мяч поднялся достаточно далеко над порогом.

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

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

1. Спасибо! это очень помогло