Estoy usando la biblioteca collide2D en p5.js para detectar si mi reproductor golpea un obstáculo. Si es así, quiero que el jugador tenga 1 vida menos. El problema con el que me he encontrado es que cuando golpeo un obstáculo, sigue eliminando vidas durante todo el tiempo que paso el mouse sobre él, por lo que termino con -100 vidas cuando paso el mouse sobre todo el obstáculo.
Code in class Rock(my obstacle): isColliding(obj) { let hit = collideRectCircle(obj.x - 55, obj.y - 60, 105, 109, this.x, this.y, 130); return hit; } code in draw: for (let i = 0; i < rocks.length; i++) { if (rocks[i].isColliding(unicorn)) { lives -= 1 // if (lives <= 0) { // gameOver(); // } }Esto suena como un caso en el que, en lugar de detectar que una condición es verdadera, desea detectar cuándo la condición cambia de falsa a verdadera. El truco es que necesitas rastrear el estado de la condición por obstáculo (suponiendo que dos rocas que chocan con un unicornio simultáneamente deberían disminuir las vidas en 2). Hay un par de formas en las que podrías hacerlo:
// Option 1. Store the rock-unicorn collision state on each rock function draw() { // ... for (let i = 0; i < rocks.length; i++) { if (rocks[i].isColliding(unicorn)) { if (!rocks[i].wasColliding) { lives -= 1; } // Additional collisions with this rock will not decrement another life rocks[i].wasColliding = true; } else { // Once the collision ends, the rock becomes dangerous again rocks[i].wasColliding = false; } } }o
// Option 2. keep track of the collision states in a Set on unicorn // This assumes that unicorn.collidingRocks = new Set() has been run when unicorn is created // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set function draw() { // ... for (let i = 0; i < rocks.length; i++) { if (rocks[i].isColliding(unicorn)) { if (unicorn.collidingRocks.has(rocks[i])) { lives -= 1; } // Additional collisions with this rock will not decrement another life unicorn.collidingRocks.add(rocks[i]); } else { // Once the collision ends, the rock becomes dangerous again unicorn.collidingRocks.delete(rocks[i]); } } } La opción dos sería un poco menos eficiente, porque tiene que establecer búsquedas/agregaciones/eliminaciones en lugar de solo 𝚶(1) búsquedas de índice de matriz al verificar o cambiar el estado de colisión. Sin embargo, sería mejor el diseño OOP, ya que es realmente el unicorn el que se preocupa si ya está chocando con las rocas, en lugar de preocuparse por las rocas. Esto también tendría implicaciones prácticas en el caso de que hubiera más de un unicornio, por ejemplo.