Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

Dudas de la pelota rebotnado en las paredes

Hola, tengo dos dudas. La funcion limpiarPantalla no solo borra las pelotas, si no que tambien borra el fondo gris del canvas, yo agregue la parte que pinta el fondo gris dentro de la funcion para que lo recree luego de borrarlo, pero no hay otra forma de que limpie todo menos eso, sin tener que hacer que lo borre y lo vuelva a hacer en cada iteracion? (seria ya para mejorar el programa ya que de la forma que lo hice funciona, pero seria para optimizarlo). La segunda y mas importante es que yo hice la modificacion de una manera distinta a como se plantea en la solucion del problema. Mi forma logra el objetivo, lo que no entiendo es que en el programa mio y el sugerido las bolas van a distintas velocidades, aun colocando el mismo valor de intervalo de tiempo en la funcion setInterval... Pego los dos codigos con los que trabaje (aclaracion, a la solucion sugerida le cambie el tiempo para verlo mas rapido y se lo puse igual a mi funcion)

Mi codigo:



<body style="background-color:black;">
<font color="white">
<canvas width="600" height="400"> </canvas>

<script>
    var pantalla = document.querySelector("canvas");
    var pincel = pantalla.getContext("2d");        
    pincel.fillStyle = "grey";
    pincel.fillRect(0,0,600,400); 

    function disenharCircunferencia(x,y,radio){
        pincel.fillStyle = "blue";
        pincel.beginPath();
        pincel.arc(x,y,radio,0,2*Math.PI);
        pincel.fill();
    }    

    function limpiarPantalla(){

        pincel.clearRect(0,0,600,400);

    }

    var x = 0

    function actualizarPantalla(){
        limpiarPantalla();
        var pantalla = document.querySelector("canvas");
        var pincel = pantalla.getContext("2d");        
        pincel.fillStyle = "grey";
        pincel.fillRect(0,0,600,400); 

            disenharCircunferencia(x,20,10);
             x++;
        if (x>600 && x<1200)
            disenharCircunferencia(1200-x,20,10);
            x++;
        if (x>=1200)
            x=0;
            disenharCircunferencia(x,20,10);
            x++;
    }

     setInterval(actualizarPantalla,10);

</script> 


</font>
</body>

Solucion sugerida:

<canvas width="600" height="400"> </canvas>

<script>
    var pantalla = document.querySelector("canvas");
    var pincel = pantalla.getContext("2d");        
    pincel.fillStyle = "lightgrey";
    pincel.fillRect(0,0,600,400); 

    function disenharCircunferencia(x,y,radio){
        pincel.fillStyle = "blue";
        pincel.beginPath();
        pincel.arc(x,y,radio,0,2*Math.PI);
        pincel.fill();
    }    

    function limpiarPantalla(){

        pincel.clearRect(0,0,600,400);

    }

    var x = 0
    var sentido = 1;

    function actualizarPantalla(){

        limpiarPantalla();
        if(x > 600){
            sentido = -1;
        }else if(x < 0){
            sentido = 1;
        }

        disenharCircunferencia(x,20,10);
        x = x + sentido;
    }

    setInterval(actualizarPantalla,10);

</script> 

Con mi codigo la pelota va notablemente mas rapida.

1 respuesta
solución!

Hola Javier

Disculpa la demora en responder, llevó un poco de tiempo descubrir porque tu código no arrojaba el mismo resultado que el propuesto en aula. Particularmente pienso que la manera como implementaste la function limpiarPantalla() está muy bien.

En la segunda parte de tu pregunta, el problema no está en la function setInterval(), el problema está cuando llamas la function disenharCircunferencia(x,20,10) a cada llamada estás sumando x++ y eso aumenta la velocidad de la bola

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

en ese caso deberías eliminar x++ en las dos primeras llamada y dejar la ultima de esa manera no aumentarás la velocidad de la bola 3X

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios