Level editor for Yasminuroban by Joan Alba Maldonado : Game « Page Components « JavaScript DHTML

JavaScript DHTML
1. Ajax Layer
2. Data Type
3. Date Time
4. Development
5. Document
6. Event
7. Event onMethod
8. Form Control
9. GUI Components
10. HTML
11. Javascript Collections
12. Javascript Objects
13. Language Basics
14. Node Operation
15. Object Oriented
16. Page Components
17. Security
18. Style Layout
19. Table
20. Utilities
21. Window Browser
Microsoft Office Word 2007 Tutorial
Java
Java Tutorial
Java Source Code / Java Documentation
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
C# / C Sharp
C# / CSharp Tutorial
ASP.Net
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
PHP
Python
SQL Server / T-SQL
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
JavaScript DHTML » Page Components » Game 
Level editor for Yasminuroban by Joan Alba Maldonado


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>Level editor for Yasminuroban &copy; by Joan Alba Maldonado</title>
        <!-- (cEdidor de niveles para Yasminuroban - Programa realizado por Joan Alba Maldonado (granvino@granvino.com). Prohibido publicar, reproducir o modificar sin citar expresamente al autor original. -->
        <script language="JavaScript1.2" type="text/javascript">
            <!--
                //(c) Editor de niveles para Yasminuroban - Programa realizado por Joan Alba Maldonado (granvino@granvino.com). Prohibido publicar, reproducir o modificar sin citar expresamente al autor original.


                //Ancho del mapa (numero de paneles):
                var mapa_width = 10;
                //Alto del mapa (numero de paneles):
                var mapa_height = 10;
            
                //Ancho del mapa anterior (numero de paneles):
                var mapa_width_anterior = mapa_width;
                //Alto del mapa anterior (numero de paneles):
                var mapa_height_anterior = mapa_height;

                //El ancho de la celda (pixels):
                var celda_width = 40;
                //El alto de la celda (pixels):
                var celda_height = 40;

                //Variable que guarda la opcion seleccionada:
                var opcion_seleccionada = "";

                //Matriz para saber si una celda esta pintada:
                var celdas_pintadas = new Array();

                //Variable que guarda el codigo del mapa:
                var mapa_codigo = "";


                //Crea las imagenes:
                if (document.images)
                 {
                     //Imagenes usadas:
                     var personaje_imagen = new Image(celda_width, celda_height);
                     nombre_personaje_imagen = "img/yas_down1.gif";
                     personaje_imagen.src = nombre_personaje_imagen; //Imagen del personaje.
                     var personaje_copa_imagen = new Image(celda_width, celda_height);
                     nombre_personaje_copa_imagen = "img/yas_copa_editor.gif";
                     personaje_copa_imagen.src = nombre_personaje_copa_imagen; //Imagen del personaje encima de una copa vacia (agujero).
                     var pared_imagen = new Image(celda_width, celda_height);
                     nombre_pared_imagen = "img/piedra1.gif";
                     pared_imagen.src = nombre_pared_imagen; //Imagen de la pared.
                     var agujero_vacio_imagen = new Image(celda_width, celda_height);
                     nombre_agujero_vacio_imagen = "img/copa1.gif";
                     agujero_vacio_imagen.src = nombre_agujero_vacio_imagen; //Imagen del agujero vacio.
                     var agujero_lleno_imagen = new Image(celda_width, celda_height);
                     nombre_agujero_lleno_imagen = "img/copa2.gif"
                     agujero_lleno_imagen.src = nombre_agujero_lleno_imagen; //Imagen del agujero lleno.
                     var pieza_imagen = new Image(celda_width, celda_height);
                     nombre_pieza_imagen = "img/botella.gif";
                     pieza_imagen.src = nombre_pieza_imagen; //Imagen de la pieza.
                     var borrar_imagen = new Image(celda_width, celda_height);
                     nombre_borrar_imagen = "img/borrar.gif";
                     borrar_imagen.src = nombre_borrar_imagen; //Imagen de borrar.
                 }
                

                //Funcion que inicia el editor:
                function iniciar_editor()
                 {
                     //Se aplican las imagenes al menu:
                     document.getElementById("imagen_personaje").src = personaje_imagen.src;
                     document.getElementById("imagen_personaje_copa").src = personaje_copa_imagen.src;
                     document.getElementById("imagen_pared").src = pared_imagen.src;
                     document.getElementById("imagen_agujero_vacio").src = agujero_vacio_imagen.src;
                     document.getElementById("imagen_agujero_lleno").src = agujero_lleno_imagen.src;
                     document.getElementById("imagen_pieza").src = pieza_imagen.src;
                     document.getElementById("imagen_borrar").src = borrar_imagen.src;

                     //Se prepara el mapa con las medidas y con los divs que tiene dentro:
                     preparar_mapa();
                 }


                //Funcion que marca un div:
                function marcar_div(nombre_div)
                 {
                      //Si el div no esta seleccionado:
                      if (opcion_seleccionada != nombre_div) { document.getElementById(nombre_div).style.border = "2px dotted #000000"//Le pone al div el borde definido.
                 }
                     

                 //Funcion que desmarca un div:
                 function desmarcar_div(nombre_div)
                  {
                      //Si el div no esta seleccionado:
                      if (opcion_seleccionada != nombre_div) { document.getElementById(nombre_div).style.border = ""//Le quita el borde al div.
                  }
                  

                //Funcion que selecciona un div:
                function seleccionar_div(nombre_div)
                 {
                      //Se deselecciona el div anterior, si existe:
                      if (opcion_seleccionada != "") { document.getElementById(opcion_seleccionada).style.border = ""}
                      //Se selecciona el div enviado:
                      document.getElementById(nombre_div).style.border = "3px dotted #ff0000"//Le pone al div el borde definido.
                      //Se pone como opcion seleccionada el div enviado:
                      opcion_seleccionada = nombre_div;
                 }
                

                //Funcion que prepara el mapa con las medidas y con los divs que tiene dentro:
                function preparar_mapa()
                 {
                    //Se borra el contenido del mapa:    
                    document.getElementById("mapa").innerHTML = "";
                    
                    //Cambia las medidas del mapa:
                    document.getElementById("mapa").style.width = celda_width * mapa_width + "px";
                    document.getElementById("mapa").style.height = celda_height * mapa_height + "px";
                    
                    //Pone en el formulario los nuevos valores:
                    document.getElementById("formulario_size").mapa_x.value = mapa_width;
                    document.getElementById("formulario_size").mapa_y.value = mapa_height;
                    
                    //Crea los divs dentro del mapa:
                    var contador_columnas = 0;
                    var contador_filas = 0;
                    var celda_bg = "";
                    var mapa_temporal = ""//Variable donde se guardara el mapa temporal, para ir poniendo los DIV.
                    for (x=0; x<mapa_width*mapa_height; x++)
                     {
                        celda_bg = (celda_bg == "#ffffff""#f5f5f5" "#ffffff";
                        var celda_left = contador_columnas * celda_width;
                        var celda_top = contador_filas * celda_height;
                        //Se escribe el la casilla el div que contendra la imagen al hacer click:
                        mapa_temporal += '<div id="celda_'+x+'" style="background:'+celda_bg+'; color:#bbbbbb; left:'+celda_left+'px; top:'+celda_top+'px; width:'+celda_width+'px; height:'+celda_height+'px; position:absolute; text-align:center; font-family:verdana; font-size:12px; line-height:20px; padding:0px; z-index:2;">'+x+'</div>';
                        //Se escribe en la casilla el div que contendra la imagen provisional al posicionarse el cursor encima:
                        mapa_temporal += '<div id="celda_'+x+'_provisional" style="background:url(\'img/blank.gif\'); color:#bbbbbb; left:'+celda_left+'px; top:'+celda_top+'px; width:'+celda_width+'px; height:'+celda_height+'px; position:absolute; text-align:center; font-family:verdana; font-size:12px; line-height:20px; padding:0px; z-index:3;"><img src="img/blank.gif" width="'+celda_width+'" height="'+celda_height+'" hspace="0" vspace="0"></div>';
                        //Se escribe en la casilla el div que se utilizara para llamar a los eventos de javascript (onMouseOver, onMouseOut, onMouseDown):
                        mapa_temporal += '<div id="celda_'+x+'_eventos" style="background:url(\'img/blank.gif\'); color:#bbbbbb; left:'+celda_left+'px; top:'+celda_top+'px; width:'+celda_width+'px; height:'+celda_height+'px; position:absolute; text-align:center; font-family:verdana; font-size:12px; line-height:20px; padding:0px; z-index:4;" onMouseDown="javascript:pintar_celda(event, \'celda_'+x+'\');" onMouseOver="javascript:posicionar_celda(\'celda_'+x+'\');" onMouseOut="javascript:desposicionar_celda(\'celda_'+x+'\');" onContextMenu="javascript:return false;"><img src="img/blank.gif" width="'+celda_width+'" height="'+celda_height+'" hspace="0" vspace="0"></div>';
                        contador_columnas++;
                        celdas_pintadas["celda_"+x" ";
                        if (contador_columnas >= mapa_width) { contador_filas++; contador_columnas = 0; celda_bg = (celda_bg == "#ffffff""#dddddd" "#ffffff"}
                     }

                    //Se crea el mapa volcandole el mapa temporal:
                    document.getElementById("mapa").innerHTML = mapa_temporal;

                    //Se actualiza el codigo del mapa:
                    actualizar_mapa_codigo();

                    //Se deja de avisar de que se espere:
                    document.getElementById('mensaje_espera').style.visibility='hidden';
                 }


                //Funcion que cambia las medidas del mapa:
                function resizear_mapa()
                 {
                    //Si se presiona cancelar, esconde el mensaje de espera, restaura el ancho y alto anteriores y se sale de la funcion:
                    if (!confirm("Press ok if you want to change map capacity (and lost it actual map)"))
                     {
                        document.getElementById('mensaje_espera').style.visibility='hidden';
                        document.getElementById("formulario_size").mapa_x.value = mapa_width_anterior;
                        document.getElementById("formulario_size").mapa_y.value = mapa_height_anterior;
                        return;
                     }

                    //Si no se ha escrito un numero, se restaura el valor de ancho y alto anterior, se esconde el mensaje de espera, y sale de la funcion:
                    if (parseInt(document.getElementById("formulario_size").mapa_x.value|| isNaN(parseInt(document.getElementById("formulario_size").mapa_x.value)) || isNaN(parseInt(document.getElementById("formulario_size").mapa_y.value)))
                     {
                        //alert("Debes escribir un valor numerico"); //este alert da error en Firefox 1.0.3! xD
                        document.getElementById('mensaje_espera').style.visibility='hidden';
                        document.getElementById("formulario_size").mapa_x.value = mapa_width_anterior;
                        document.getElementById("formulario_size").mapa_y.value = mapa_height_anterior;
                        return;
                     }

                    //Cambia las medidas del mapa, segun los valores escritos en el formulario:
                    mapa_width = document.getElementById("formulario_size").mapa_x.value;
                    mapa_height = document.getElementById("formulario_size").mapa_y.value;

                    //Se define el ancho y alto anterior (para restaurarlo en caso de que se inserte un valor no numerico o erroneo):
                    mapa_width_anterior = mapa_width;
                    mapa_height_anterior = mapa_height;
                    
                    //Aplica los cambios:
                    preparar_mapa();
                 }


                //Funcion que pinta una celda temporalmente, al pasar el cursor:
                function posicionar_celda(nombre_celda)
                 {
                    //Si no se ha seleccionado ninguna opcion a pintar, se sale de la funcion:
                    if (opcion_seleccionada == "") { return}

                    //Se muestra provisionalmente la imagen de la opcion seleccionada en la celda:
                    document.getElementById(nombre_celda+"_provisional").innerHTML = document.getElementById(opcion_seleccionada).innerHTML;
                 }
                 

                //Funcion que borra una celda temporal, al sacar el cursor:
                function desposicionar_celda(nombre_celda)
                 {
                    //Si no se ha seleccionado ninguna opcion a pintar, se sale de la funcion:
                    if (opcion_seleccionada == "") { return}
                    
                    //Se borra la imagen provisional de la celda:
                    document.getElementById(nombre_celda+"_provisional").innerHTML = '<img src="img/blank.gif" width="'+celda_width+'" height="'+celda_height+'" hspace="0" vspace="0">';
                 }


                //Funcion que pinta una celda definitivamente:
                function pintar_celda(e, nombre_celda)
                 {
                    //Se recoge el numero de boton segun el navegador:
                    if (e != 0)
                     {
                        //Se guarda el boton del raton segun el navegador:
                        var boton_raton = (e.which? e.which : event.button;                     
                        //Si se ha pulsado el boton derecho, borra la celda y sale de la funcion:
                        if (boton_raton == || boton_raton == 3) { borrar_celda(nombre_celda)return}
                     }

                    //Si no se ha seleccionado ninguna opcion a pintar, se sale de la funcion:
                    if (opcion_seleccionada == "") { alert("You must select an option on the menu of above for paint.")return}
                    
                    //Si no se ha seleccionado la goma de borrar, se pinta la celda:
                    if (opcion_seleccionada != "div_borrar") { document.getElementById(nombre_celda).innerHTML = document.getElementById(opcion_seleccionada).innerHTML; }
                    //...pero si se ha seleccionado la goma de borrar, se borra la celda (y se le pone su numero):
                    else var numero_celda_borrar = nombre_celda.substring(6, nombre_celda.length); document.getElementById(nombre_celda).innerHTML = numero_celda_borrar; }

                    //Se actualiza el codigo del mapa con el caracter que corresponde a la opcion elegida:
                    if (opcion_seleccionada == "div_personaje") { celdas_pintadas[nombre_celda"@"}
                    else if (opcion_seleccionada == "div_personaje_copa") { celdas_pintadas[nombre_celda"+"}
                    else if (opcion_seleccionada == "div_pared") { celdas_pintadas[nombre_celda"#"}
                    else if (opcion_seleccionada == "div_agujero_vacio") { celdas_pintadas[nombre_celda"·"}
                    else if (opcion_seleccionada == "div_agujero_lleno") { celdas_pintadas[nombre_celda"*"}
                    else if (opcion_seleccionada == "div_pieza") { celdas_pintadas[nombre_celda"$"}
                    else celdas_pintadas[nombre_celda" "}

                    //Se actualiza el codigo del mapa:
                    actualizar_mapa_codigo();
                 }


                //Funcion que borra una celda:
                function borrar_celda(nombre_celda)
                 {
                    //Se guarda la opcion seleccionada:
                    var opcion_anterior = opcion_seleccionada;
                    //Se cambia la opcion seleccionada a la de borrar:
                    opcion_seleccionada = "div_borrar";
                    //Se borra la celda:
                    pintar_celda(0, nombre_celda);
                    //Se restaura la opcion seleccionada anteriormente:
                    opcion_seleccionada = opcion_anterior;
                 }


                //Funcion que recoge el mapa pasado por url y lo representa:
                function recoger_mapa_url()
                 {
                    //Se guarda en una variable el contenido de la url:
                    //var url = unescape(window.location.href);
                    var url = window.location.href;

                    //Si la url esta vacia, sale de la funcion:
                    if (url == "") { return}

                    //Se extrae el contenido de la primera variable enviada por GET (puede tener cualquier nombre, pero correspondera al MAPA):
                    var mapa_url_sucio = url.substring(url.indexOf("?")+1, url.length);
                    var mapa_url = mapa_url_sucio.substring(mapa_url_sucio.indexOf("=")+1, mapa_url_sucio.indexOf("&width="));
    
                    //Se extrae el contenido de la variable "width" enviada por GET:
                    var mapa_width_url_sucio = mapa_url_sucio.substring(mapa_url_sucio.indexOf("&")+1, mapa_url_sucio.indexOf("&height="));
                    var mapa_width_url = mapa_width_url_sucio.substring(mapa_width_url_sucio.indexOf("=")+1, mapa_url_sucio.indexOf("&height="));

                    //Se extrae el contenido de la variable "height" enviada por GET:
                    var mapa_height_url_sucio = mapa_url_sucio.substring(mapa_url_sucio.indexOf("&height=")+1, mapa_url_sucio.length);
                    var mapa_height_url = mapa_height_url_sucio.substring(mapa_height_url_sucio.indexOf("=")+1, mapa_height_url_sucio.length);

                    //Si alguna de las variables esta vacia o el width o el height no son numericos, sale de la funcion:
                    if (mapa_url == "" || mapa_width_url == "" || mapa_height_url == "" || isNaN(mapa_width_url|| isNaN(mapa_height_url)) { return}
                    //...y si no, procede:
                    else
                     {
                            //Se setea el ancho recogido:
                            mapa_width = parseInt(unescape(mapa_width_url));
                            //Se setea el alto recogido:
                            mapa_height = parseInt(unescape(mapa_height_url));
                            
                            //Se quita los caracteres de escape del mapa, y se remplazan los simbolos enviados por los correctos:
                            var mapa_url_refinado = unescape(mapa_url);
                            // A => (espacio en blanco)
                            // B => #
                            // C => @
                            // D => $
                            // E => ·
                            // F => *
                            // G => +
                            
                            //Si el mapa es superior o inferior a como deberia ser (no corresponde al ancho y alto enviados), se sale de la funcion:
                            if (mapa_url_refinado.length != mapa_width*mapa_height) { alert("Failed to load map send by url because width and height are erroneous."); mapa_width = 10; mapa_height = 10; preparar_mapa()return}
                            
                            //Quita las posibles almohadillas de la url (aparecen al probar mapa, etc.):
                            for (x=0; x<=mapa_url_refinado.length; x++) { mapa_url_refinado = mapa_url_refinado.replace("#""")}
                            
                            //Cambia el codigo:
                            for (x=0; x<=mapa_url_refinado.length; x++)
                             {
                                mapa_url_refinado = mapa_url_refinado.replace("A"" ");
                                mapa_url_refinado = mapa_url_refinado.replace("B""#");
                                mapa_url_refinado = mapa_url_refinado.replace("C""@");
                                mapa_url_refinado = mapa_url_refinado.replace("D""$");
                                mapa_url_refinado = mapa_url_refinado.replace("E""·");
                                mapa_url_refinado = mapa_url_refinado.replace("F""*");
                                mapa_url_refinado = mapa_url_refinado.replace("G""+");
                             }

                            //Se introducen dentro del mapa:
                            preparar_mapa();

                            //Se guarda el mapa en la matriz y se representa en el div:
                            var contador_indice = 0;
                            var div_actual = "";
                            for (y=0; y<mapa_url_refinado.length; y++)
                             {
                                if (mapa_url_refinado.substring(y,y+1== "#") { div_actual = "div_pared"}
                                else if (mapa_url_refinado.substring(y,y+1== "@") { div_actual = "div_personaje"}
                                else if (mapa_url_refinado.substring(y,y+1== "+") { div_actual = "div_personaje_copa"}
                                else if (mapa_url_refinado.substring(y,y+1== "·") { div_actual = "div_agujero_vacio"}
                                else if (mapa_url_refinado.substring(y,y+1== "*") { div_actual = "div_agujero_lleno"}
                                else if (mapa_url_refinado.substring(y,y+1== "$") { div_actual = "div_pieza"}

                                celdas_pintadas["celda_"+contador_indice= mapa_url_refinado.substring(y,y+1);

                                if (div_actual != "" && mapa_url_refinado.substring(y,y+1!= " ") { document.getElementById("celda_"+contador_indice).innerHTML = document.getElementById(div_actual).innerHTML; }
                                
                                actualizar_mapa_codigo();

                                contador_indice++;
                                div_actual = "";
                             }                   
                            
                     }
                    
                 }


                //Funcion que actualiza el codigo del mapa:
                function actualizar_mapa_codigo()
                 {
                    mapa_codigo = "";
                    var mapa_codigo_refinado = "";
                    for (x=0; x<mapa_width*mapa_height; x++)
                     {
                        if (celdas_pintadas["celda_"+x== " ") { mapa_codigo += "&nbsp;"; mapa_codigo_refinado += "A"}
                        else if (celdas_pintadas["celda_"+x== "@") { mapa_codigo += "@"; mapa_codigo_refinado += "C"}
                        else if (celdas_pintadas["celda_"+x== "#") { mapa_codigo += "#"; mapa_codigo_refinado += "B"}
                        else if (celdas_pintadas["celda_"+x== "·") { mapa_codigo += "·"; mapa_codigo_refinado += "E"}
                        else if (celdas_pintadas["celda_"+x== "*") { mapa_codigo += "*"; mapa_codigo_refinado += "F"}
                        else if (celdas_pintadas["celda_"+x== "$") { mapa_codigo += "$"; mapa_codigo_refinado += "D"}
                        else if (celdas_pintadas["celda_&