¿Qué estoy tratando de hacer?

Estoy tratando de codificar Flappy Bird con la biblioteca p5.js.


Problema: la función no reconoce la función que definí.


function Game() {

  this.pipes = generatePipes();
  setInterval(this.gameLoop, 1000 / 60);

  generatePipes = () => {
    const firstPipe = new Pipe(null, space);
    const secondPipeHeight = winHeight - firstPipe.height - space;
    const secondPipe = new Pipe(secondPipeHeight, space);
    return [firstPipe, secondPipe]
  }
  gameLoop = () => {
    this.update();
    this.draw();
  }
  update = () => {
    if (frameCount % 30 == 0) {
      this.pipes = this.generatePipes();
      this.pipes.push(...pipes);
    }
    this.pipes.forEach(pipe => pipe.x = pipe.x - 1);

  }

  draw = () => {
    this.pipes.forEach(pipe => pipe.draw());
  }
}
class Pipe {
  constructor(height, space) {
    this.x = 100;
    this.y = height ? winHeight - height : 0; // borunun y eksenine göre konumunu belirler
    this.width = pipeWidth;
    this.height = height || minPipeHeight + Math.floor(Math.random() * (winHeight - space - minPipeHeight * 2));
  }
  draw() {
    fill(124);
    noStroke();
    rect(this.x, this.y, this.width, this.height);
  }
}

error:

TypeError no capturado: this.generatePipes no es una función

0
user11264432 10 may. 2019 a las 12:17

3 respuestas

La mejor respuesta
function Game() {

  generatePipes = () => {
    const firstPipe = new Pipe(null, space);
    const secondPipeHeight = winHeight - firstPipe.height - space;
    const secondPipe = new Pipe(secondPipeHeight, space);
    return [firstPipe, secondPipe]
  }

  gameLoop = () => {
    this.update();
    this.draw();
  }

  this.pipes = generatePipes();
  setInterval(this.gameLoop, 1000 / 60);

  update = () => {
    if (frameCount % 30 == 0) {
    this.pipes = this.generatePipes();
    this.pipes.push(...pipes);
  }
  this.pipes.forEach(pipe => pipe.x = pipe.x - 1);

  }

  draw = () => {
    this.pipes.forEach(pipe => pipe.draw());
  }
}

Este código actualizado debería funcionar. En su código, como ha invocado el generatePipes () antes de su expresión de función, no funcionará. Las expresiones de función se cargan solo cuando el intérprete llega a la línea de código en la que primero definió su expresión de función.

2
Thivagar 10 may. 2019 a las 09:35

La forma en que lo escribió: asignó una función a la variable generatePipes , lo que significa que solo puede acceder a ella una vez que la variable está instanciada.

Tiene dos opciones: instanciar la variable generatePipes antes de usarla o declararla como una subfunción.

function Game() {

  generatePipes = () => {
    ...
    return x;
  }

  this.pipes = generatePipes();
}

O

function Game() {

  this.pipes = generatePipes();

  function generatePipes() {
    ...
    return x;
  }
}
0
M. Paviza 10 may. 2019 a las 09:29

Simplemente asigne sus funciones a this:

this.generatePipes = () => {...}
this.gameLoop = () => {...}
this.update = () => {...}
this.draw = () => {...}
0
Jack Bashford 10 may. 2019 a las 09:40