Tengo una clase con este método de detección de colisión:
wallCollisionDetection(){ if((this.position.x >= canvasWidth-this.radius) || (this.position.x <= this.radius) ){ this.speed.x = -this.speed.x } if((this.position.y >= canvasHeight-this.radius) || (this.position.y <= this.rafius) ){ this.speed.y = -this.speed.y } }Bastante simple y funciona. De vez en cuando (rara vez pero aún así), cuando la partícula golpea una pared vertical, tiende a moverse verticalmente, pegada a esa pared. Lo mismo, cuando golpea una pared horizontal (entonces tiende a moverse solo horizontalmente).
Como referencia, si genero 200 partículas y las dejo moverse aleatoriamente durante 5 minutos, un promedio de 2 de ellas quedarán atrapadas en una dirección.
Creo que este ejemplo de código debería ser suficiente ya que no arroja ningún error. Así que creo que solo me falta alguna condición adicional en ese método. Pero si consideras que necesitas más, solo pídelo.
Ok, scunliffe me mostró el camino. Parece que cuando una partícula sobrepasa el límite, permanece atrapada en un bucle infinito "si".
Así que así es como lo resolvió (básicamente, acabo de establecer la posición en su valor máximo/mínimo permitido para que no ocurra el bucle):
wallCollisionDetection(){ if(this.position.x > canvasWidth-this.radius){ this.position.x = canvasWidth-this.radius; this.speed.x = -this.speed.x } else if(this.position.x < this.radius){ this.position.x = this.radius this.speed.x = -this.speed.x } if(this.position.y > canvasHeight-this.radius ){ this.position.y = canvasHeight-this.radius; this.speed.y = -this.speed.y } else if(this.position.y < this.radius){ this.position.y = this.radius; this.speed.y = -this.speed.y } }No es bonita, pero funciona. ¡Gracias!