¿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 el id "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 ID pong-ball en cada iteración del bucle, lo que provoca un efecto de rastro interminable. Para evitar esto, puedes utilizar el mismo elemento div y simplemente actualizar sus propiedades top y left 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 ID pong-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