Autor Tema: JavaScript efecto pelotas moviendo por pantalla y rebote actualizar propiedades  (Leído 13669 veces)

nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Hola,
estoy practicando Javascript y a partir de un código base debo conseguir que un div se mueva y una serie de imágenes reboten contra él. El problema que tengo es que aunque consiga que el div se mueva las posiciones contra las que rebotan las imágenes son siempre las iniciales del div. Revisando el código he visto una serie de funciones llamadas:
obtener_x_origen, obtener_y_origen, obtener_x_final y obtener_y_final que quizá sean la causa del problema. Sin embargo, cómo consigo actualizar dichas variables para que, en el caso de que el div (asignándole a su left el valor de x_origen = x_origen + velocidad) las imágenes reboten contra las nuevas posiciones del div?

Aquí dejo el código:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
    <head>
        <title>Ejemplos de javascript. </title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script type="text/javascript">
           
            function sacar_x_pantalla(){
                /* Obtenemos el tamaño de la forma normal de la pantalla total por defecto, y lo guardamos en una variable temporal de memoria que llamamos myWidth */
                var myWidth = screen.width;

                /* Comprobamos casos escepcionales. */
                if( typeof( window.innerWidth ) == 'number' ) {
                    /* IE>7 Caso de los navegadores compatibles con HTML5. */
                    myWidth = window.innerWidth;
                }
                else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
                    /*IE 6 o superior que no cumple con HTML5. */
                    myWidth = document.documentElement.clientWidth;
                }
                else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
                    /*IE 4 o compatibles. */
                    myWidth = document.body.clientWidth;
                }
                /* Enviamos al exterior el resultado de leer la propiedad. */
                return myWidth;
            }
           
            function sacar_y_pantalla(){
                /* Obtenemos el tamaño de la forma normal de la pantalla total por defecto, y lo guardamos en una variable temporal de memoria que llamamos myHeight */
                var myHeight = screen.height;

                /* Comprobamos casos escepcionales. */
                if( typeof( window.innerHeight ) == 'number' ) {
                    /* IE>7 Caso de los navegadores compatibles con HTML5. */
                    myHeight = window.innerHeight;
                }
                else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
                    /*IE 6 o superior que no cumple con HTML5. */
                    myHeight = document.documentElement.clientHeight;
                }
                else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
                    /*IE 4 o compatibles. */
                    myHeight = document.body.clientHeight;
                }
                /* Enviamos al exterior el resultado de leer la propiedad. */
                return myHeight;
            }
           
            /* Valores x e y mínimos de la pantalla por donde se mueve la pelota.*/
            var min_x_incial = 0; // Indicamos el punto minimo a donde deben de ir las pelotas por defecto.
            var min_y_incial = 0; // Indicamos el punto minimo a donde deben de ir las pelotas por defecto.

            /* Valores x e y máximos de la pantalla por donde se mueve la pelota.*/
            var max_x_incial = sacar_x_pantalla(); // Obtenermos el punto máximo a donde deben de ir las pelotas por defecto.
            var max_y_incial = sacar_y_pantalla(); // Obtenermos el punto máximo a donde deben de ir las pelotas por defecto.
           
            /* Valores de nuestra posición actual. */
            var x_actual_incial = 0; // Indicamos el punto de partida de las pelotas por defecto.
            var y_actual_incial = 0; // Indicamos el punto de partida de las pelotas por defecto.

            /* Valores de nuestra dirección y destino. */
            var x_direccion_destino_incial = 6;  // Indicamos la dirección y destino de las pelotas por defecto.
            var y_direccion_destino_incial = 10; // Indicamos la dirección y destino de las pelotas por defecto.

            /* Valores del siguiente punto de destino. */
            var x_destino_incial =  x_actual_incial +  x_direccion_destino_incial; // Indicamos el punto de llegada de las pelotas por defecto.
            var y_destino_incial =  y_actual_incial +  y_direccion_destino_incial; // Indicamos el punto de llegada de las pelotas por defecto.
           
            var pelota_dimension_x_incial = 300; // Indicamos la dimension de las pelotas por defecto.
            var pelota_dimension_y_incial = 300; // Indicamos la dimension de las pelotas por defecto.
            var id_balon_incial = 'id_balon_'; // Indicamos id de las pelotas por defecto.
            var tiempo_ejecucion_incial = 1000/50; // Indicamos el tiempo de ejecución por defecto, en base a este tiempo y del desplazamiento las pelotas ambian de velocidad.
           
            var vector_pelotas = new Array(); // Inicio el vector de pelotas con ninguna pelota activa.
            var vector_ladrillos = new Array(); // Inicio el vector de ladrillos con ningún ladrillo activo.
           
            /* Función para autollamada. */

            /* Los métodos quedarán así.*/


            function rebote_eje_y_superior(){
            /* Este método comprueba si la pelota ha llegado a la parte superior de la pantalla máxima, y en caso de ser así ejecuta elrebote. */
                if( this.y_destino < this.min_y ){
                    /* Encaso de que la pelota se va a desplazar por encima de la posición mínima ejecutamos el rebote. */
                    this.y_destino = this.min_y - this.y_destino; // Vemos cuanto se desplaza por encima de la posición minima.
                    this.y_destino = this.min_y + this.y_destino; // Este desplazamiento se lo sumamos a la posición minima.
                    this.y_direccion_destino = 0 - this.y_direccion_destino; // Cambiamos el signo al vector de desplazamiento en el eje Y, que es el que marca arriba y abajo.
                }
            }

            function rebote_eje_x_izquierda(){
            /* Este método comprueba si la pelota ha llegado a la parte izquierda de la pantalla máxima, y en caso de ser así ejecuta elrebote. */
                if( this.x_destino < this.min_x ){
                    /* Encaso de que la pelota se va a desplazar por la izquierda de la posición mínima ejecutamos el rebote. */
                    this.x_destino = this.min_x - this.x_destino; // Vemos cuanto se desplaza por la izquierda de la posición minima.
                    this.x_destino = this.min_x + this.x_destino; // Este desplazamiento se lo sumamos a la posición minima.
                    this.x_direccion_destino = 0 - this.x_direccion_destino; // Cambiamos el signo al vector de desplazamiento en el eje X, que es el que marca izquierda y derecha.
                }
            }


            function rebote_eje_y_inferior(){
            /* Este método comprueba si la pelota ha llegado a la parte inferior de la pantalla máxima, y en caso de ser así ejecuta elrebote. */
                if( (this.y_destino + this.pelota_dimension_y) > this.max_y ){
                    /* Encaso de que la pelota se va a desplazar por debajo de la posición máxima ejecutamos el rebote. Hay que tener en cuenta en este caso las dimensiones de la pelota.*/
                    this.y_destino = this.max_y - (this.y_destino + this.pelota_dimension_y); // Vemos cuanto se desplaza por debajo de la posición máxima.
                    this.y_destino = this.max_y + this.y_destino - this.pelota_dimension_y; // Este desplazamiento se lo restamos a la posición máxima.
                    this.y_direccion_destino = 0 - this.y_direccion_destino; // Cambiamos el signo al vector de desplazamiento en el eje Y, que es el que marca arriba y abajo.
                }
            }

            function rebote_eje_x_derecha(){
            /* Este método comprueba si la pelota ha llegado a la parte derecha de la pantalla máxima, y en caso de ser así ejecuta elrebote. */
                if( (this.x_destino + this.pelota_dimension_x) > this.max_x ){
                    /* Encaso de que la pelota se va a desplazar por la derecha de la posición máxima ejecutamos el rebote. Hay que tener en cuenta en este caso las dimensiones de la pelota.*/
                    this.x_destino = this.max_x - (this.x_destino + this.pelota_dimension_x); // Vemos cuanto se desplaza por la derecha de la posición máxima.
                    this.x_destino = this.max_x + this.x_destino - this.pelota_dimension_x; // Este desplazamiento se lo restamos a la posición máxima.
                    this.x_direccion_destino = 0 - this.x_direccion_destino; // Cambiamos el signo al vector de desplazamiento en el eje X, que es el que marca izquierda y derecha.
                }
            }

            function desplazar_pelota(){
            /* Este método recoge la imagen con el ID oportuno y cambia dicha imagen a la posición destino. Al final del prceso actualiza las propiedades de la posición actual de la pelota. */
                document.getElementById(this.id_balon).style.position = "absolute"; // Marcamos la posicón absoluta de  la pelota.
                document.getElementById(this.id_balon).style.top = this.y_destino + "px"; // Desplazamos la imagen a la nueva posición en Y.
                document.getElementById(this.id_balon).style.left = this.x_destino + "px"; // Desplazamos la imagen a la nueva posición en X.
                this.x_actual = this.x_destino; // Actualizamos los datos de la posición actual de la pelota.
                this.y_actual = this.y_destino; // Actualizamos los datos de la posición actual de la pelota.
            }
« Última modificación: 01 de Abril 2015, 18:26 por Ogramar »

nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:Actualizar variables (propiedades)
« Respuesta #1 en: 01 de Abril 2015, 09:35 »
Aquí dejo el resto del código:
Código: [Seleccionar]
            /* Este método tiene como entrada ladrillos_pantalla, que es el vecor de objectos ladrillo y así saber cuando una pelota toca contra alguno. */
           
            function desplazamiento_pelota_en_tiempo(ladrillos_pantalla) {
            /* Este método lo que realiza es el desplazamiento del balón de una posición actual a la de destino dependiendo de la dirección destino a la que se dirige.*/
            /* Este método se va a ejecutar cada tiempo_ejecucion_incial milisegundos por defecto. */
           
            var i = 0; // Inicializamos una variable contador.
                this.x_destino = this.x_actual + this.x_direccion_destino; // Calculamos a partir de la posición actual y la direccion_destino cual será la nueva dirección destino inicial por defecto.
                this.y_destino = this.y_actual + this.y_direccion_destino;
                for ( i = 0; i<ladrillos_pantalla.length; i++ ){ // Comprobamos que para llegar a esa dirección destino no tengamos que pasar atraves de algún ladríllo, en caso de ser así ejecutamos rebote.
                // Indicar que los ladríllos deben de estar distanciados entre si como minimo una distancia igual a el vector direccion_destino MAS la dimensión de la pelota.
                // En caso de tocar contra algún ladrillo los métodos rebote_eje_y_superior_inferior_ladrillo y rebote_eje_y_inferior_superior_ladrillo corrigiran el vector de direccion_destino y la nueva posición de destino.
                this.rebote_eje_y_superior_inferior_ladrillo(ladrillos_pantalla[i].obtener_x_origen_ladrillo(), ladrillos_pantalla[i].obtener_y_origen_ladrillo(), ladrillos_pantalla[i].obtener_x_final_ladrillo(), ladrillos_pantalla[i].obtener_y_final_ladrillo());
                this.rebote_eje_y_inferior_superior_ladrillo(ladrillos_pantalla[i].obtener_x_origen_ladrillo(), ladrillos_pantalla[i].obtener_y_origen_ladrillo(), ladrillos_pantalla[i].obtener_x_final_ladrillo(), ladrillos_pantalla[i].obtener_y_final_ladrillo());
                }
                this.rebote_eje_y_superior(); // En caso de que la nueva dirección de destino sobrepase el punto del eje Y superior rebote_eje_y_superior corrigira el vector de direccion_destino y la nueva posición de destino.
                this.rebote_eje_x_izquierda(); // En caso de que la nueva dirección de destino sobrepase el punto del eje X de la izquierda rebote_eje_x_izquierda corrigira el vector de direccion_destino y la nueva posición de destino.
                this.rebote_eje_y_inferior(); // En caso de que la nueva dirección de destino sobrepase el punto del ej Y inferior rebote_eje_y_inferior corrigira el vector de direccion_destino y la nueva posición de destino.
                this.rebote_eje_x_derecha(); // En caso de que la nueva dirección de destino sobrepase el punto del eje X de la derecha rebote_eje_x_derecha corrigira el vector de direccion_destino y la nueva posición de destino.
                this.desplazar_pelota(); // Una vez calculado la nueva posición de destino y corregida correctamente, desplazamos a ella la pocición de la pelota y actualizamos la posición actual.
                alert(this.x_origen);
            }

            function anhadir_balon() {
            /* Método para añadir un nuevo balón en la pantalla, para ello crea una imagen con las propiedades de dimensiones, id, imagen y posición del objecto, y lo añade al Body del HTML.*/
                var nuevo_balon = "<img id='" + this.id_balon + "' src='" + this.imagen_balon + "' style='width:" + this.pelota_dimension_x + "px; height:" + this.pelota_dimension_y + "px; position:absolute; top:" + this.min_y + "px; left:" + this.min_x + "px;' />";
                var body_id = document.getElementById('mi_campo');
                body_id.innerHTML = body_id.innerHTML + nuevo_balon;
            }
           
            /* Este método tiene como entradas los valores x_origen, y_origen, x_final, y_final que son los valores que dimensiona y posicionan al ladrillo en el campo de juegos. */
           
            function rebote_eje_y_superior_inferior_ladrillo(x_origen, y_origen, x_final, y_final){
            /* Este método comprueba si una pelota está chocando contra la parte inderior de un ladrillo, para ello la pelota debe atravesar el eje Y de la posición
            en la que se encuentra el ladrillo y también debe de encontrarse en el segmento del eje X en el que se encuantra el ladrillo en su trayectoria.*/
                if( (this.y_destino <= y_final) && (this.y_actual >= y_final) ){
                /*
                En ete caso vemos que estamos atravesando el nivel de Y, por lo cual es pertinente ver si tocamos con el ladrillo.
                Para ello debemos de parametrizar la ecuación de una recta que pasa por dos puntos, que serán le punto de origen de la pelota
                y su punto de destino, que ambos conocemos. Si por medio de esa trayectoria pasamos por un punto del eje x donde se encuentra
                el ladrillo entonces existe un rebote.
                Partimos de la siguiente ecuacnión:
               
                (this.this.y_origen - this.this.y_destino) = pendeinte_de_la_recta * (this.this.x_origen - this.this.x_destino);
               
                Donde la pendiente es la incognita a responder.
                ENTONCES:
               
                pendeinte_de_la_recta = (this.this.y_origen - this.this.y_destino) / (this.this.x_origen - this.this.x_destino);
               
                Ahor sabiendo la pendiente lo que debemos de ver es al nivel de la "Y" del ladrillo que "X" tiene para ver si coincide
                con la longitud del ladrillo, en tal caso hay rebote.
               
                (this.this.y_origen - this.y_final) = pendeinte_de_la_recta * (this.this.x_origen - x_de_cruce);
               
                Donde lo que lo que nos interesa es saber la x de cruce a la altura de la y del ladrillo:
                ENTONCES:
               
                x_de_cruce = ((this.this.y_origen - this.y_final)/pendeinte_de_la_recta) + this.this.x_origen;
               
                */
                var pendeinte_de_la_recta = (this.y_actual - this.y_destino) / (this.x_actual - this.x_destino); // Sacamos la pendiente de la trayectoria de la pelota.
                var x_de_cruce = ((this.y_actual - y_final)/pendeinte_de_la_recta) + this.x_actual; // Con la posición actual, la pendiente y la posición del ladrillo en el eje Y sacamos el valor de X al llegar al ladrillo.
               
                if( (x_de_cruce > (x_origen - this.pelota_dimension_x)) && (x_de_cruce < x_final) ){ // Comprobamos que la posición de X la llegar al ladrillo no coincida con las X que ocupa el ladrillo.
                this.y_destino = y_final - this.y_destino; // En caso de eser así ejecutamos e rebote, que se hace de la misma forma que los diferentes rebotes contra los limites del campo.
                    this.y_destino = y_final + this.y_destino;
                    this.y_direccion_destino = 0 - this.y_direccion_destino;
                }
                }
            }
           
            /* Este método tiene como entradas los valores x_origen, y_origen, x_final, y_final que son los valores que dimensiona y posicionan al ladrillo en el campo de juegos. */
           
            function rebote_eje_y_inferior_superior_ladrillo(x_origen, y_origen, x_final, y_final ){
            /* Este método comprueba si una pelota está chocando contra la parte superior de un ladrillo, para ello la pelota debe atravesar el eje Y de la posición
            en la que se encuentra el ladrillo y también debe de encontrarse en el segmento del eje X en el que se encuantra el ladrillo en su trayectoria. Es totalmente semejante al anterior, solo que ahora debemos de tener en cuenta las dimensiones de la pelota. */
                if( ((this.y_destino + this.pelota_dimension_y) >= y_origen) && ((this.y_actual + this.pelota_dimension_y) <= y_origen)  ){
               
                var pendeinte_de_la_recta = ((this.y_actual + this.pelota_dimension_y) - (this.y_destino + this.pelota_dimension_y)) / (this.x_actual - this.x_destino);
                var x_de_cruce = (((this.y_actual + this.pelota_dimension_y) - (y_origen + this.pelota_dimension_y))/pendeinte_de_la_recta) + this.x_actual;
                if( (x_de_cruce > (x_origen - this.pelota_dimension_x)) && (x_de_cruce < x_final) ){
                this.y_destino = y_origen - (this.y_destino + this.pelota_dimension_y);
                    this.y_destino = y_origen + this.y_destino - this.pelota_dimension_y;
                    this.y_direccion_destino = 0 - this.y_direccion_destino;
                    }
                }
            }
           
            /* Esta función crea la clase pelota, la cual empleamos para crear los diferentes objectos pelota. */
           
            function Crear_clase_pelota (min_x_in, min_y_in, max_x_in, max_y_in, x_actual_in, y_actual_in, x_direccion_destino_in, y_direccion_destino_in, pelota_dimension_x_in, pelota_dimension_y_in, id_balon_in, tiempo_ejecucion_in, imagen_balon_in ){
                /* Propiedades. */
                this.min_x = min_x_in;
                this.min_y = min_y_in;
                this.max_x = max_x_in;
                this.max_y = max_y_in;
                this.x_actual =  x_actual_in;
                this.y_actual = y_actual_in;
                this.x_direccion_destino = x_direccion_destino_in;
                this.y_direccion_destino = y_direccion_destino_in;
                this.x_destino = this.x_actual + this.x_direccion_destino;
                this.y_destino = this.y_actual + this.y_direccion_destino;
                this.pelota_dimension_x = pelota_dimension_x_in;
                this.pelota_dimension_y = pelota_dimension_y_in;
                this.id_balon = id_balon_in;
                this.tiempo_ejecucion = tiempo_ejecucion_in;
                this.imagen_balon = imagen_balon_in;
               
                /* Métodos. */
                this.rebote_eje_y_superior = rebote_eje_y_superior;
                this.rebote_eje_x_izquierda = rebote_eje_x_izquierda;
                this.rebote_eje_y_inferior = rebote_eje_y_inferior;
                this.rebote_eje_x_derecha = rebote_eje_x_derecha;
                this.desplazar_pelota = desplazar_pelota;
                this.desplazamiento_pelota_en_tiempo = desplazamiento_pelota_en_tiempo;
                this.anhadir_balon = anhadir_balon;
                this.rebote_eje_y_superior_inferior_ladrillo = rebote_eje_y_superior_inferior_ladrillo;
                this.rebote_eje_y_inferior_superior_ladrillo = rebote_eje_y_inferior_superior_ladrillo;
               
            }

            function crear_ladrillo(){
            /* Método para crear ladrillos en el terreno de juego. se basa en crear DIV Visibles en las posiciones dadas. */
            var nuevo_ladrillo = "<div style='width:" + (this.x_final - this.x_origen) + "px; height:" + (this.y_final - this.y_origen) + "px; position:absolute; top:" + this.y_origen + "px; left:" + this.x_origen + "px; border: solid 1px #000000;' />";
                var body_id = document.getElementById('mi_campo');
                body_id.innerHTML = body_id.innerHTML + nuevo_ladrillo;
               
            }
           
            function obtener_x_origen_ladrillo(){
            /* Método que lanza al exterior la propiedad x_origen del ladrillo. */
            return this.x_origen;
            }
           
            function obtener_y_origen_ladrillo(){
            /* Método que lanza al exterior la propiedad y_origen del ladrillo. */
            return this.y_origen;
            }
           
            function obtener_x_final_ladrillo(){
            /* Método que lanza al exterior la propiedad x_final del ladrillo. */
            return this.x_final;
            }
           
            function obtener_y_final_ladrillo(){
            /* Método que lanza al exterior la propiedad y_final del ladrillo. */
            return this.y_final;
            }
           
            /* Esta función crea la clase ladrillo, la cual empleamos para crear los diferentes objectos ladrillo. */
           
            function crear_clase_ladrillo (x_origen_in, y_origen_in, x_final_in, y_final_in){
            /* Propiedades. */
                this.x_origen = x_origen_in;
                this.y_origen = y_origen_in;
                this.x_final = x_final_in;
                this.y_final = y_final_in;
               
           /* Métodos. */
                this.crear_ladrillo = crear_ladrillo;
                this.obtener_x_origen_ladrillo = obtener_x_origen_ladrillo;
                this.obtener_y_origen_ladrillo = obtener_y_origen_ladrillo;
                this.obtener_x_final_ladrillo = obtener_x_final_ladrillo;
                this.obtener_y_final_ladrillo = obtener_y_final_ladrillo;
            }
           
            /* Función que mpleamos para crear el juego y arrancarlo. */
           
            function inicio_pelotas (){
           
            /* Creamos los diferentes objectos Ladrillo y los situamos en la pantalla. */
            var i = 0;
            vector_ladrillos[i++] = new crear_clase_ladrillo(300, 500, 800, 500);
            vector_ladrillos[i++] = new crear_clase_ladrillo(200, 200, 600, 200);
                for ( i = 0; i<vector_ladrillos.length; i++ ){
                vector_ladrillos[i].crear_ladrillo();
                }
               
            /* Creamos los diferentes objectos pelota, los situamos en la pantalla y llamamos al me´tododesplazamiento_pelota_en_tiempo cada tiempo_ejecucion para su desplazamiento. */
            i = 0;
                vector_pelotas[i++] = new Crear_clase_pelota(min_x_incial, min_y_incial, max_x_incial, max_y_incial, x_actual_incial, y_actual_incial, x_direccion_destino_incial , y_direccion_destino_incial, 20, 20, id_balon_incial + i, tiempo_ejecucion_incial, './balon.png');
                vector_pelotas[i++] = new Crear_clase_pelota(min_x_incial, min_y_incial, max_x_incial, max_y_incial, 300, 40, x_direccion_destino_incial + 2, y_direccion_destino_incial - 2, 20, 10, id_balon_incial + i, tiempo_ejecucion_incial, './rugby.png');
                vector_pelotas[i++] = new Crear_clase_pelota(min_x_incial, min_y_incial, max_x_incial, max_y_incial, 300, 140, x_direccion_destino_incial-1, y_direccion_destino_incial+2, 20, 10, id_balon_incial + i, tiempo_ejecucion_incial, './rugby.png');
                vector_pelotas[i++] = new Crear_clase_pelota(min_x_incial, min_y_incial, max_x_incial, max_y_incial, 300, 80, x_direccion_destino_incial+3, y_direccion_destino_incial, 20, 20, id_balon_incial + i, tiempo_ejecucion_incial, './balon2.png');
               
                for (i = 0; i<vector_pelotas.length; i++ ){
                    vector_pelotas[i].anhadir_balon();
                    /* Creamos en modo texto la instrucción en Javascript y la ejecutamos con eval. */
                    eval("var mi_pelota_start_" + i + "= vector_pelotas[i] ");
                    eval("window.setInterval(function(){mi_pelota_start_" + i + ".desplazamiento_pelota_en_tiempo(vector_ladrillos);} , mi_pelota_start_" + i + ".tiempo_ejecucion) ");
                }
            }
        </script>
    </head>
    <body id="mi_campo" onload="inicio_pelotas();">
       
    </body>
</html>

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Hola he intentado ejecutar el código pero me salen continuamente error "undefined"

Creo que se deba a que faltan las imágenes que se referencian en:

Código: [Seleccionar]
                vector_pelotas[i++] = new Crear_clase_pelota(min_x_incial, min_y_incial, max_x_incial, max_y_incial, x_actual_incial, y_actual_incial, x_direccion_destino_incial , y_direccion_destino_incial, 20, 20, id_balon_incial + i, tiempo_ejecucion_incial, './balon.png');
                vector_pelotas[i++] = new Crear_clase_pelota(min_x_incial, min_y_incial, max_x_incial, max_y_incial, 300, 40, x_direccion_destino_incial + 2, y_direccion_destino_incial - 2, 20, 10, id_balon_incial + i, tiempo_ejecucion_incial, './rugby.png');
                vector_pelotas[i++] = new Crear_clase_pelota(min_x_incial, min_y_incial, max_x_incial, max_y_incial, 300, 140, x_direccion_destino_incial-1, y_direccion_destino_incial+2, 20, 10, id_balon_incial + i, tiempo_ejecucion_incial, './rugby.png');
                vector_pelotas[i++] = new Crear_clase_pelota(min_x_incial, min_y_incial, max_x_incial, max_y_incial, 300, 80, x_direccion_destino_incial+3, y_direccion_destino_incial, 20, 20, id_balon_incial + i, tiempo_ejecucion_incial, './balon2.png');

Ahí aparece balon.png, rugby.png, balon2.png

¿Puedes subir las imágenes o dar el link desde donde se puedan descargar?

Salu2

nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Hola al ejecutar me aparecía un mensaje "undefined", para eliminarlo he comentado esta línea:

//alert(this.x_origen);

He reducido el tamaño de las imágenes y las pongo adjuntas a este post, no entiendo muy bien por qué los archivos son tan grandes (565x565 px) pero eso es lo de menos. Lo he ejecutado y veo dos líneas y dos balones de fútbol y dos de rugby que se van moviendo por la pantalla y rebotando, todo parece que funciona bien. Entonces pienso que el problema lo tienes con modificaciones que hayas hecho en el código, tendrías que subir el código donde se vea el problema para ver si se nos ocurre una solución

Salu2


nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Buenas,
en las modificaciones que hice simplemente añadí funciones que le indicaran a esos div que x_origen += velocidad y que esto se lo añadiera al left del div. Haciendo, por otra parte, lo propio pero restando para que se muevan hacia el otro lado. El problema que tengo es que se supone que al tomar x_origen en la posición y movimiento del div esta debería variar para que las pelotas reboten contra las nuevas posiciones del div, pero rebotan únicamente contra la posición inicial.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Hola ¿puedes pegar el código donde se vea el problema, es decir, los div moviéndose y que las pelotas no rebotan bien?

nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Hola, aquí te lo dejo, espero que me puedas ayudar.

   
Código: [Seleccionar]
function desplazamiento_pelota_en_tiempo(ladrillos_pantalla) {
           
            var i = 0;
                this.x_destino = this.x_actual + this.x_direccion_destino;
                this.y_destino = this.y_actual + this.y_direccion_destino;
                for ( i = 0; i<ladrillos_pantalla.length; i++ ){
                this.rebote_eje_y_superior_inferior_ladrillo(ladrillos_pantalla[i].obtener_x_origen_ladrillo(), ladrillos_pantalla[i].obtener_y_origen_ladrillo(), ladrillos_pantalla[i].obtener_x_final_ladrillo(), ladrillos_pantalla[i].obtener_y_final_ladrillo());
                this.rebote_eje_y_inferior_superior_ladrillo(ladrillos_pantalla[i].obtener_x_origen_ladrillo(), ladrillos_pantalla[i].obtener_y_origen_ladrillo(), ladrillos_pantalla[i].obtener_x_final_ladrillo(), ladrillos_pantalla[i].obtener_y_final_ladrillo());                }
                this.rebote_eje_y_superior();
                this.rebote_eje_x_izquierda();
                this.rebote_eje_y_inferior();
                this.rebote_eje_x_derecha();
                this.desplazar_pelota();
                this.mover_div();
                this.a1();
                this.a2();
                this.obtener_x_origen_ladrillo();
                this.obtener_y_origen_ladrillo();
                this.obtener_x_final_ladrillo();
                this.obtener_y_final_ladrillo();
            }
           
            function a1(){
                this.x_origen   = this.x_origen + this.velocidad;
                document.getElementById("ladrillo").style.left = this.x_origen + "px";
                if (this.x_origen >= (screen.width-(this.x_origen/2))){
                    this.estado = 1;
                }
                return this.x_origen;
            }
           
            function a2(){
                this.x_origen   = this.x_origen - this.velocidad;
                document.getElementById("ladrillo").style.left = this.x_origen + "px";
                if (this.x_origen <= 0){
                    this.estado = 0;
                }
            }
           
            function mover_div (){
                switch(this.estado){
                    case 0:
                        this.A1();
                        break;
                    case 1:
                        this.A2();
                        break;
                }
            }
            function Crear_clase_pelota (min_x_in, min_y_in, max_x_in, max_y_in, x_actual_in, y_actual_in, x_direccion_destino_in, y_direccion_destino_in, pelota_dimension_x_in, pelota_dimension_y_in, id_balon_in, tiempo_ejecucion_in, imagen_balon_in, incremento_incial, estado_incial){
                this.min_x = min_x_in;
                this.min_y = min_y_in;
                this.max_x = max_x_in;
                this.max_y = max_y_in;
                this.x_actual =  x_actual_in;
                this.y_actual = y_actual_in;
                this.x_direccion_destino = x_direccion_destino_in;
                this.y_direccion_destino = y_direccion_destino_in;
                this.x_destino = this.x_actual + this.x_direccion_destino;
                this.y_destino = this.y_actual + this.y_direccion_destino;
                this.pelota_dimension_x = pelota_dimension_x_in;
                this.pelota_dimension_y = pelota_dimension_y_in;
                this.id_balon = id_balon_in;
                this.tiempo_ejecucion = tiempo_ejecucion_in;
                this.imagen_balon = imagen_balon_in;
               
                this.rebote_eje_y_superior = rebote_eje_y_superior;
                this.rebote_eje_x_izquierda = rebote_eje_x_izquierda;
                this.rebote_eje_y_inferior = rebote_eje_y_inferior;
                this.rebote_eje_x_derecha = rebote_eje_x_derecha;
                this.desplazar_pelota = desplazar_pelota;
                this.desplazamiento_pelota_en_tiempo = desplazamiento_pelota_en_tiempo;
                this.anhadir_balon = anhadir_balon;
                this.rebote_eje_y_superior_inferior_ladrillo = rebote_eje_y_superior_inferior_ladrillo;
                this.rebote_eje_y_inferior_superior_ladrillo = rebote_eje_y_inferior_superior_ladrillo;
                this.mover_div  = mover_div;
                this.a1         = a1;
                this.a2         = a2;
                this.obtener_x_origen_ladrillo = obtener_x_origen_ladrillo;
                this.obtener_y_origen_ladrillo = obtener_y_origen_ladrillo;
                this.obtener_x_final_ladrillo = obtener_x_final_ladrillo;
                this.obtener_y_final_ladrillo = obtener_y_final_ladrillo;
               
            }
           
            function crear_ladrillo(){
            document.getElementById("ladrillo").style.width = 300 + "px";
                document.getElementById("ladrillo").style.height = this.y_final - this.y_origen + "px";
                document.getElementById("ladrillo").style.position = 'absolute';
                document.getElementById("ladrillo").style.left = this.x_origen + "px";
                document.getElementById("ladrillo").style.top = this.y_origen + "px";
               
            }
           
            function crear_clase_ladrillo (x_origen_in, y_origen_in, x_final_in, y_final_in, mi_estado, mi_velocidad, mi_id){
                this.x_origen = x_origen_in;
                this.y_origen = y_origen_in;
                this.x_final = x_final_in;
                this.y_final = y_final_in;         
                this.estado      = mi_estado;
                this.velocidad   = mi_velocidad;
                this.id_elemento = mi_id;
               
                this.MOVER_DIV  = mover_div;
                this.A1         = a1;
                this.A2         = a2;
                this.crear_ladrillo = crear_ladrillo;
                this.obtener_x_origen_ladrillo = obtener_x_origen_ladrillo;
                this.obtener_y_origen_ladrillo = obtener_y_origen_ladrillo;
                this.obtener_x_final_ladrillo = obtener_x_final_ladrillo;
                this.obtener_y_final_ladrillo = obtener_y_final_ladrillo;
            }
                       
            function inicio_pelotas (){
           
                  var i = 0;
                  vector_ladrillos[i++] = new crear_clase_ladrillo(300, 500, 800, 600, 0, 2.5, "ladrillo");
                  vector_ladrillos[i++] = new crear_clase_ladrillo(200, 200, 600, 300, 0, 2.5, "ladrillo");
                  setInterval(function(){
                    for (var i = 0; i<vector_ladrillos.length; i++ ){
                        vector_ladrillos[i].crear_ladrillo();
                        vector_ladrillos[i].MOVER_DIV();
                    }
                  }, 25);
                 
                 
Código: [Seleccionar]
<body id="mi_campo" onload="inicio_pelotas();">
        <div id="ladrillo" style="border: solid 1px #000000;"></div>
    </body>

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Hola he ido cogiendo el código y reemplazando las funciones repetidas en el código anterior y añadiendo las funciones nuevas pero no consigo ver nada. Mejor adjúntalo como archivo. Pulsa en "opciones adicionales" que aparece debajo del editor del foro, elige el archivo html y así lo adjuntas. Salu2

nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Hola, aquí te dejo el archivo.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Hola de nuevo, he abierto el archivo pero no se ve nada (lo he intentado con dos navegadore distintos). Lo único que se ve es una línea y no se ve ninguna pelota ni nada que se mueva.  :-\

nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Sí, me acabo de dar cuenta ahora. La línea 343 está mal, pon esto:

Código: [Seleccionar]
this.A2         = a2;

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Ummm ¿línea 343? No me cuadra, la numeración de líneas que me sale a mí es esta:

Código: [Seleccionar]
(331)                this.MOVER_DIV  = mover_div;
(332)               this.A1         = a1;
(333)                this.A2         = a2;
(334)                this.crear_ladrillo = crear_ladrillo;
(335)                this.obtener_x_origen_ladrillo = obtener_x_origen_ladrillo;
(336)                this.obtener_y_origen_ladrillo = obtener_y_origen_ladrillo;
(337)                this.obtener_x_final_ladrillo = obtener_x_final_ladrillo;
(338)                this.obtener_y_final_ladrillo = obtener_y_final_ladrillo;
(339)           }
(340)           
(341)            /* Función que mpleamos para crear el juego y arrancarlo. */
(342)           
(343)         function inicio_pelotas (){
(344)           
(345)                  var i = 0;

Si pongo eso en la línea 343 genero un error

En la línea 333 está esto: this.A2         = a2; pero es igual que lo que has indicado, no veo ningún cambio  ???

Salu2

nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Veo que tenemos las líneas numeradas de forma diferente, al parecer. Te adjunto el archivo modificado.
« Última modificación: 06 de Abril 2015, 10:10 por Ogramar »

nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Parece que el archivo se resiste a enviarse bien. Te lo adjunto de nuevo.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Hola ahora sí he podido ejecutar y visualizar lo que ocurre. Lo que he visto es que pasan varias cosas extrañas:

- Las pelotas rebotan por la parte de arriba del div tanto en las coordenadas iniciales del div como en algunos momentos en otras coordenadas

- Las pelotas no rebotan por la parte de abajo del div en movimiento, aunque a veces el rebote por abajo se produce en la parte inferior de la pantalla y a veces en un punto intermedio de la parte inferior.

No veo un sitio fijo para el rebote de las pelotas, y tampoco veo un patrón aparente que permita decir dónde van a rebotar.

El problema parece estar en cómo se fija el punto de rebote de las pelotas pero voy a intentar mirar el código con más detenimiento a ver si logro encontrar el problema

Salu2

nm

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Vale. El problema más concretamente creo que esta relacionado con las funciones que lanzan al exterior x_origen y demás propiedas del div, es decir, relacionado con las coordenadas del div. He intentado varias cosas pero sigue actuando igual. Espero que podamos dar con la solución pronto. Gracias por ayudar.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".