JavaScript переменные изменяются не функционально в цикле анимации - PullRequest
0 голосов
/ 20 апреля 2020

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

Я пытался контролировать ta cc ( аккумулятор) и t.char (индекс символа) с console.log, и кажется, что в первый раз ta cc встречает условие в t.display (), t.char увеличивается в несколько раз в течение одного и того же вызова t .display (), пока не достигнет условия, при котором t.done = true. Или, если это не так, возможно, t.display () вызывается несколько раз за одну итерацию anim () l oop.

  1. Как t.char будет меняться несколько раз времена, подобные этому?
  2. Что я должен сделать, чтобы предотвратить это?

[Edit] - я использовал console.log для отслеживания первых нескольких значений метки времени, а именно:

  1. не определено
  2. 24,687
  3. 41,37
  4. 58,053

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

var cvs = document.getElementById('daCanvas');
var ctx = cvs.getContext("2d");

class Text {
  constructor() {
    this.x = 0;
    this.y = 0;
    this.acc = 0.0;
    this.char = 0;
    this.done = false;
    this.text = "Text";
    this.len = this.text.length;
  }
  display(dt) {
    this.acc += dt;
    if (this.acc > 1000 && !this.done) {
      this.acc = 0;
      this.char += 1;
      if (this.char = this.len) {
        this.done = true;
      }
    }
    ctx.fillStyle = "#000000";
    ctx.fillRect(this.x, this.y, 500, 200);
    ctx.fillStyle = "#FFFFFF";
    ctx.fillText(this.text.slice(0, this.char), this.x, this.y + 50);
  }
}

t = new Text();
let lastTime = 0;
let dt = 0;

function anim(timestamp) {
  if (timestamp) {
    dt = timestamp - lastTime;
    lastTime = timestamp;
  }
  t.display(dt);
  requestAnimationFrame(anim);
}

ctx.font = "50px Arial";
anim();
* {
  margin: 0;
  padding: 0;
  background-color: white;
  color: white;
  font-size: 11px;
}

#daCanvas {
  display: block;
  margin: auto;
}

#text-wrapper {
  display: block;
  text-align: center;
  margin: 0 auto;
  width: 300px;
}
<!DOCTYPE html>
<html>
<head>
  <title>Example</title>
</head>
<body>
  <div id="text-wrapper">
    <p>Example</p>
  </div>
  <canvas id="daCanvas" width="500" height="400"></canvas>
</body>
</html>

1 Ответ

0 голосов
/ 20 апреля 2020

Мой оператор if в t.display () читает (this.char = this.len), он должен читать (this.char == this.len). this.char = this.len назначает this.char для this.len, но не проверяет, эквивалентны ли они.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...