Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/07/2010, 10:08
Avatar de Tecna
Tecna
 
Fecha de Ingreso: enero-2010
Mensajes: 291
Antigüedad: 14 años, 3 meses
Puntos: 45
Respuesta: Ideas para mapa (trabajando con ajax)

Buenas,

como ya te dije lo mas sencillo sería hacer un array con las casillas. Suponiendo que tuvieras un tablero de 3 x 3 casillas, el array tendría 9 elementos (del 0 al 8), así podrías trabajar con ellos o también con un array de dos dimensiones donde la casilla[4] por ejemplo estaría en la en la posición [1,1]. En el css habría que posicionar las casillas y el tablero de forma absoluta pero si lo tienes en hojas de estilo externas además tendrás que redefinir los estilos en el javascript para poder acceder a ellos desde la propiedad style. También podrías calcular los valores en función de la posición que ocupe sabiendo el lado de la casilla, por ejemplo si cada casilla mide 50px de lado y la casilla[4] y hemos dicho que está en la fila 1 columna 1, el top seria 1*50 y el left 1*50.

Otra cosa muy a tener en cuenta es que debes guardar el valor devuelto por cada función que se ejecute con el evento onclick al pulsar en una casilla para poder compararlo con la siguiente y saber cuanto se tiene que mover la primera. Para ello mejor que variables globales es usar cierres.

Y luego ya sería el tema del movimiento, controlando las pausas entre movimientos y la propagación de eventos por ejemplo cuando se pulse de nuevo una primera casilla sin que haya terminado de moverse la anterior.

Te he hecho un pequeño ejemplo que funciona de como podrías empezar con un tablero de 3x3 y 50px de lado cada casilla.


Código HTML:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html lang="es">
  3.  
  4.   <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  5.   <title>Tablero para seleccionar casillas</title>
  6.   <script type="text/javascript" src="script/fichero.js"></script>
  7.   <link rel="stylesheet" href="css/fichero.css" type="text/css">
  8. </head>
  9.  
  10.  
  11. <div id="tablero">
  12.   <div id="casilla-0"></div>
  13.   <div id="casilla-1" class="c2"></div>
  14.   <div id="casilla-2"></div>
  15.   <div id="casilla-3"class="c2"></div>
  16.   <div id="casilla-4"></div>
  17.   <div id="casilla-5"class="c2"></div>
  18.   <div id="casilla-6"></div>
  19.   <div id="casilla-7"class="c2"></div>
  20.   <div id="casilla-8"></div>
  21. </div>
  22. <p>pulsa en una casilla</p>
  23.  
  24. </body>
  25. </html>


Código CSS:
Ver original
  1. div {
  2.   width: 50px;
  3.   height: 50px;
  4.   background: #ff0;
  5.   position: absolute;
  6.   top: 0;
  7.   left: 0;
  8. }
  9.  
  10. #tablero {
  11.   width: 150px;
  12.   height: 150px;
  13.   top: 50px;
  14.   left: 50px;
  15.   border: 1px solid #00f;
  16. }
  17.  
  18. .c2 { background: #00f; }



Código Javascript:
Ver original
  1. // ejemplo de persistencia de valores sin usar variables globales
  2. // asociando los eventos por parejas
  3. // bY Tecna
  4.  
  5. // dado un tablero de nxn casillas seleccionamos dos haciendo click
  6. // y guardamos sus posiciones para poder comparar
  7.  
  8. var la = 50; // pixeles del lado de la casilla
  9. var n = 3; // numero de casillas en cada lado del tablero
  10.  
  11. function init()
  12. {
  13.   var tablero = document.getElementById('tablero');
  14.   var casillas = tablero.getElementsByTagName('div');
  15.  
  16.    for (var i=0; i<n; ++i)
  17.    {
  18.        for (var j=0; j<n; ++j)
  19.       {
  20.         // asignamos los valores de las propiedades top y left
  21.         // para que esten disponibles con la propiedad style
  22.         var num = i*n + j;
  23.         var top =  i*la + 'px';
  24.         var left = j*la + 'px';
  25.         casillas[num].style.top = top;
  26.         casillas[num].style.left = left;
  27.    
  28.         // asignamos el evento inicial a cada casilla
  29.         asignaInit(casillas, casillas[num]);
  30.       }
  31.    }
  32. }
  33.  
  34. window.onload = init;
  35.  
  36. function asignaInit(casillas, casilla)
  37. {
  38.    casilla.onclick = function (e) {pulsarIni(casillas, casilla);};
  39. }
  40.  
  41. function pulsarIni(casillas, casillaIni)
  42. {
  43.    // funcion que recoge los valores de la primera casilla y
  44.    // llama a la función genérica de asignar eventos
  45.    
  46.    alert('Casilla Inicial: ' + casillaIni.id + '\npulse en otra casilla');
  47.    var pulsarF = function (e) { pulsarFin(e, casillas, this, casillaIni); };
  48.    
  49.    asignar(pulsarF, casillas);
  50. }
  51.  
  52. function asignar(cual, casillas)
  53. {
  54.    // función genérica para asignar eventos
  55.   for (var i=0; i<n; ++i)
  56.   {
  57.       for (var j=0; j<n; ++j)
  58.      {
  59.         var num = i*n + j;
  60.         casillas[num].onclick = cual;
  61.       }
  62.    }
  63. }
  64.  
  65. function pulsarFin(e, casillas, casillaFin, casillaIni)
  66. {
  67.    // función que recibe los valores de la primera casilla y obtiene
  68.    // los de la segunda, además reasigna los eventos para la primera casilla
  69.    var topI = casillaIni.style.top;
  70.    var leftI = casillaIni.style.left;
  71.    var topF = casillaFin.style.top;
  72.    var leftF = casillaFin.style.left;
  73.  
  74.    var ini = 'Casilla Inicial: ' + casillaIni.id + ' | top: ' + topI + ', left: ' + leftI;
  75.    var fin = 'Casilla Final: ' + casillaFin.id + ' | top: ' + topF + ', left: ' + leftF;
  76.    alert(ini + '\n' + fin);
  77.    
  78.    var pulsarI = function (e) { pulsarIni(casillas, this); };
  79.    asignar(pulsarI, casillas);
  80.    
  81.    // con los datos obtenidos de ambas casillas comparariamos las posiciones
  82.    //y llamariamos a la función encargada de mover la ficha de la
  83.    //casilla primera a la segunda.
  84. }