Así que estoy aprendiendo sobre cómo usar las clases y he hecho este código (¡tiene exactamente 100 líneas!) usando P5.JS, que se supone que dibuja tres rectángulos y tres círculos. Uno de los círculos se puede mover con las teclas de flecha, y los otros dos lo siguen. Aquí está la parte que no funciona: cuando los círculos de los seguidores se mueven sobre los cuadrados, se supone que deben reducir la velocidad a medida que se mueven sobre ellos. He intentado todo.
function setup() { createCanvas(windowWidth, windowHeight); noStroke(); character1 = new character(250, 200, 30, 4); follower1 = new enemy(100, 20, 30, 2); follower2 = new enemy(200, 20, 30, 2); obstacle1 = new obstacle(200, 200, 100, 50, follower1.x, follower1.y, follower1.s); obstacle2 = new obstacle(300, 300, 50, 25, follower1.x, follower1.y, follower1.s); obstacle3 = new obstacle(200, 400, 25, 50, follower1.x, follower1.y, follower1.s); } function draw() { background(0); character1.drawCharacter(); follower1.drawEnemy(); follower2.drawEnemy(); obstacle2.drawObstacle(); obstacle1.drawObstacle(); obstacle3.drawObstacle(); } class character { constructor(x, y, d, s) { this.x = x; this.y = y; this.d = d; this.s = s; } drawCharacter() { fill(255); ellipse(character1.x, character1.y, character1.d); if (keyIsDown(UP_ARROW)) { character1.y -= character1.s; } if (keyIsDown(DOWN_ARROW)) { character1.y += character1.s; } if (keyIsDown(LEFT_ARROW)) { character1.x -= character1.s; } if (keyIsDown(RIGHT_ARROW)) { character1.x += character1.s; } } } class enemy { constructor(x, y, d, s) { this.x = x; this.y = y; this.d = d; this.s = s; } drawEnemy() { fill(255, 0, 0); ellipse(this.x, this.y, this.d); if (this.x < character1.x - this.d) { this.x += this.s; } if (this.x > character1.x + this.d) { this.x -= this.s; } if (this.y < character1.y - this.d) { this.y += this.s; } if (this.y > character1.y + this.d) { this.y -= this.s; } } } class obstacle { constructor(x, y, w, h, enemyX, enemyY, enemyS) { this.x = x; this.y = y; this.w = w; this.h = h; enemyX = enemyX; enemyY = enemyY; enemyS = enemyS; } drawObstacle(enemyX, enemyY, enemyS) { fill(255); rectMode(CENTER); rect(this.x, this.y, this.w, this.h); if ( this.x - this.w / 2 - 10 < enemyX && this.x + this.w / 2 + 10 > enemyX && this.y - this.h / 2 - 10 < enemyY && this.y + this.h / 2 + 10 > enemyY ) { enemyS = 0.5; } else { enemyS = 2.5; } } }Intenta tener solo un obstáculo. Aquí está mi conjetura:
draw llama a obstacle.drawObstacle tres veces, y si un enemigo debe ser ralentizado por obstacle1 u obstacle2 , no importa porque enemy.s se restablecerá por obstacle3.drawObstacle
Recomiendo encarecidamente que cada uno de tus personajes y clases enemigas tenga un método de draw y move , y ponga todo sobre cómo se mueven los enemigos dentro de la clase enemiga. Tal vez la clase de obstáculo debería tener un draw y tal vez un método isCollidingWith que el enemy.move llamaría.
Mantener toda su lógica para una clase dentro de la clase significa que puede hacer variantes mucho más fácilmente. Por ejemplo, tal vez más adelante quieras tener un enemigo que sea mucho más lento pero que no se vea obstaculizado por ningún obstáculo. Tener toda la lógica dentro de la clase lo hace fácil. Poner la lógica dentro de la clase de obstáculos se convertiría rápidamente en una pesadilla si tienes suficientes tipos diferentes de enemigos.
Además, puede tener un objeto de game que contenga todo sobre el juego, incluidas las propiedades de los character , los enemies y obstacles , y los métodos de draw y move que llamen a los métodos respectivos sobre los objetos de personajes, enemigos y obstáculos, y un método de destroy o quit que borre su propiedades y tal. (En algunos idiomas, esto es importante, porque si agregara una propiedad de game a cada pieza del juego, tendrían identificadores entre sí y, dado que (en algunos idiomas), la recolección de basura solo cosecha objetos que no tienen referencias a ellos , ocuparán la memoria mucho más tiempo del que desea).