¿Efecto de pista de baile con jQuery?
Estoy tratando de hacer un juego de pong. Quiero añadir un efecto de rastro cuando la pelota se mueva. Pero no pude averiguar cómo hacerlo. Este es el CSS de la pelota.
ball: {
width: 15,
height: 15,
position: 'absolute',
top: 0,
left: 0,
borderRadius: 50,
background: '#C6A62F'
}
Estoy controlando el movimiento de la bola en un bucle llamado function loop()
. Cuando creo otra bola dentro de la función, hay un efecto de sendero pero nunca termina. ¿Cómo puedo evitarlo?
function loop() {
window.pongLoop = setInterval(function () {
$('', {id: 'pong-ball'}).css(CSS.ball).appendTo('#pong-game');
CSS.stick1.top += CONSTS.stick1Speed;
$('#stick-1').css('top', CSS.stick1.top);
CSS.stick2.top += CONSTS.stick2Speed;
$('#stick-2').css('top', CSS.stick2.top);
CSS.ball.top += CONSTS.ballTopSpeed;
CSS.ball.left += CONSTS.ballLeftSpeed;
if ( CSS.stick1.top <= 1) {
CSS.stick1.top = 1;
}
if ( CSS.stick2.top <= 1) {
CSS.stick2.top = 1;
}
if (CSS.stick1.top >= CSS.arena.height - CSS.stick.height) {
CSS.stick1.top = CSS.arena.height - CSS.stick.height;
}
if (CSS.stick2.top >= CSS.arena.height - CSS.stick.height) {
CSS.stick2.top = CSS.arena.height - CSS.stick.height;
}
if (CSS.ball.top <= 0 ||
CSS.ball.top >= CSS.arena.height - CSS.ball.height) {
CONSTS.ballTopSpeed = CONSTS.ballTopSpeed * -1;
}
$('#pong-ball').css({top: CSS.ball.top,left: CSS.ball.left});
if (CSS.ball.left <= CSS.stick.width) {
if (CSS.ball.top > CSS.stick1.top && CSS.ball.top < CSS.stick1.top + CSS.stick.height) {
CONSTS.ballLeftSpeed = CONSTS.ballLeftSpeed * -1;
} else {
localStorage.setItem("Player2", JSON.stringify(parseInt(localStorage.getItem("Player2")) + 5));
$('#score-player2').text(parseInt(localStorage.getItem("Player2")));
roll();
}
}
if (CSS.ball.left >= CSS.arena.width - CSS.ball.width - CSS.stick.width) {
if (CSS.ball.top > CSS.stick2.top && CSS.ball.top < CSS.stick2.top + CSS.stick.height) {
CONSTS.ballLeftSpeed = CONSTS.ballLeftSpeed * -1;
} else {
localStorage.setItem("Player1", JSON.stringify(parseInt(localStorage.getItem("Player1")) + 5));
$('#score-player1').text(parseInt(localStorage.getItem("Player1")));
roll();
}
}
}, CONSTS.gameSpeed);
}
Pregunta hecha hace 3 años, 4 meses, 29 días - Por algoarchitect
2 Respuestas:
-
El efecto que estás viendo con el rastro de la bola se debe a que estás creando una nueva bola en cada iteración del bucle
loop()
sin eliminar la bola anterior. Esto hace que se acumulen múltiples bolas y se genere el efecto de sendero.Para solucionar esto, puedes eliminar la bola anterior antes de crear una nueva en cada iteración del bucle. Puedes hacerlo utilizando el método
.remove()
de jQuery para eliminar el elemento con elid
"pong-ball" antes de crear una nueva bola.Aquí te muestro cómo puedes modificar tu función
loop()
para eliminar la bola anterior antes de crear una nueva:javascript function loop() { window.pongLoop = setInterval(function () { $('
pong-ball').remove(); // Eliminar la bola anterior $('', {id: 'pong-ball'}).css(CSS.ball).appendTo('pong-game'); // Resto de tu código de movimiento de la bola }, CONSTS.gameSpeed); }Al añadir la línea
$('#pong-ball').remove();
antes de crear una nueva bola en cada iteración del bucle, te aseguras de eliminar la bola anterior y evitar que se acumulen múltiples bolas en la pista de baile.Respondida el Dec 17, 2020 a las 14:42 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema es que estás creando un nuevo elemento
div
con el IDpong-ball
en cada iteración del bucle, lo que provoca un efecto de rastro interminable. Para evitar esto, puedes utilizar el mismo elementodiv
y simplemente actualizar sus propiedadestop
yleft
en cada iteración:javascript function loop() { window.pongLoop = setInterval(function () { var ball = $('
pong-ball'); // Actualizar las propiedades top y left de la bola ball.css({top: CSS.ball.top, left: CSS.ball.left}); // Resto del código del bucle... }, CONSTS.gameSpeed); }Nota: Asegúrate de crear el elemento
div
con el IDpong-ball
antes de iniciar el bucle para que esté disponible para su actualización.Respondida el Dec 17, 2020 a las 14:45 - por Gemini
Votos positivos: 0 | Votos negativos: 0