Foros del Web » Programando para Internet » Node.js »

Reconocimiento de teclas usando socket.io

Estas en el tema de Reconocimiento de teclas usando socket.io en el foro de Node.js en Foros del Web. Hola a todos. Ando desarrollando una aplicación web en la que cada persona que entre en mi página, tenga un vehículo y encima de él, ...
  #1 (permalink)  
Antiguo 01/02/2015, 21:35
Avatar de Ferkhis  
Fecha de Ingreso: mayo-2011
Ubicación: Medellín
Mensajes: 52
Antigüedad: 12 años, 11 meses
Puntos: 2
Reconocimiento de teclas usando socket.io

Hola a todos.

Ando desarrollando una aplicación web en la que cada persona que entre en mi página, tenga un vehículo y encima de él, una etiqueta con su nickname. La persona puede usar las flechas del teclado para moverlo por la pantalla, y los demás deben poder verlo, algo así como un multiplayer.

El problema que tengo, es que cuando quiero separar todas esas funciones en dos archivos javascript del cliente, en uno van las funciones que involucran el socket de cada cliente, y en el otro los eventos de teclado. Por alguna razón, es como si el uso de socket.io me bloqueara leer teclas desde javascript, impidiéndome usar document.body.onkeydown, y obligándome a usar <body onkeypress="funcionTeclado(event)", lo cual en el HTML se ve muy impresentable, preferiría poder hacerlo de la primera manera, de tal forma que quede en el archivo javascript dedicado a eventos de teclado.

Estos son mis códigos:

gameclient.js (el socket)

Código Javascript:
Ver original
  1. var socket = io.connect("201.233.151.12:8080");
  2.  
  3. socket.on("connect", function()
  4. {
  5.     socket.emit("nick", prompt("Ingresa tu nickname:"));
  6. });
  7.  
  8. socket.on("start", function(socketid, htmlID, PosX, PosY, tagID, nick) //Al recibir el mensaje start,se reciben como parámetros la info
  9. {
  10.     addObj(socketid, htmlID, PosX, PosY, tagID, nick);
  11. });
  12.  
  13. socket.on("remove", function(htmlID, tagID) //Al recibir el mensaje remove, se reciben como parámetros las ID HTML de etiqueta y tanque
  14. {
  15.     var tank = document.getElementById(htmlID);
  16.     var tag = document.getElementById(tagID);
  17.     document.body.removeChild(tank);//Se borra el elemento tanque
  18.     document.body.removeChild(tag);//Se borra el elemento etiqueta
  19. });
  20.  
  21. socket.on("update", function(htmlID, PosX, PosY, tagID, dir)
  22. {
  23.     var tank = document.getElementById(htmlID);
  24.     var tag = document.getElementById(tagID);
  25.     tank.style.top = PosY;
  26.     tank.style.left = PosX
  27.     tag.style.top = PosY-50;
  28.     tag.style.left = PosX;
  29.     if(dir == "l")
  30.     {
  31.         tank.src="tleft.bmp";
  32.     }
  33.     else
  34.     {
  35.         if(dir == "r")
  36.         {
  37.             tank.src="tright.bmp";
  38.         }
  39.         else
  40.         {
  41.             if(dir == "u")
  42.             {
  43.                 tank.src="tup.bmp";
  44.             }
  45.             else
  46.             {
  47.                 if(dir == "d")
  48.                 {
  49.                     tank.src="tdown.bmp";
  50.                 }
  51.             }
  52.         }
  53.     }
  54. });
  55.  
  56. function movetank(PosX, PosY, dir)
  57. {
  58.     socket.emit("move", PosX, PosY, dir);
  59. }

game.js (teclado)

Código Javascript:
Ver original
  1. function addObj(nick, htmlID, PosX, PosY, tagID, nick)
  2. {  
  3.     var newtank = document.createElement("img"); //Declaramos que crearemos una etiqueta <img>
  4.     newtank.src="tup.bmp"; //Asignamos a esa etiqueta el atrobuto src y damos la ruta del archivo
  5.     //newtank.setAttribute("style", "width:65px;height:65px;position: fixed;top:200px;left:200px"); //Definimos las propiedades de style para la etiqueta
  6.     newtank.setAttribute("style", "width:65px;height:65px;position: fixed;top:" + PosY + "px;left:" + PosX + "px");
  7.     newtank.id = htmlID; //Asignamos a la etiqueta el atributo id
  8.     newtank.title = newtank.id;
  9.     document.body.appendChild(newtank); //Se agrega al body del HTML el elemento que creamos
  10.     //Si no se fuera a agregar al body, sino a otra etiqueta creada o existente, sería así:
  11.     //NomVarTag.appendChild(NewTag);
  12.     //NomVarTag sería la variable que apunta a un elemento existente del documento HTML, y NewTag el nuevo elemento creado
  13.     //Para eliminar la etiqueta del documento se usa:
  14.     //document.body.removeChild(newtank);
  15.  
  16.     var newtag = document.createElement("div");
  17.     newtag.id = tagID;
  18.     newtag.innerHTML = nick;
  19.     newtag.setAttribute("style", "border-radius:5px; opacity:0.5; padding:10px; border-width:1px; border-width: 1px; border-color:#FFFFFF; background-color:#FFFFFF; color:#000000; border-style:solid; position: fixed;top:" + (PosY-50) + "px;left:" + PosX + "px");
  20.     document.body.appendChild(newtag);
  21. }
  22.  
  23. function move(PosX, PosY, dir)
  24. {  
  25.     movetank(PosX, PosY, dir);
  26.    
  27.     if(document.getElementById("tankaudio").paused)
  28.     {
  29.         document.getElementById("tankaudio").play();
  30.     }
  31. }
  32.  
  33. //document.body.onkeydown = function(e){moveElement(e)};
  34. function moveElement(e)
  35. {
  36.     var moveBy = 3;
  37.     var dir;
  38.     if(e.keyCode==37)
  39.     {
  40.         dir = "l";
  41.         move(-moveBy, 0, dir);
  42.     }
  43.     else
  44.     {
  45.         if(e.keyCode==39)
  46.         {
  47.             dir = "r";
  48.             move(moveBy, 0, dir);
  49.         }
  50.         else
  51.         {
  52.             if(e.keyCode==38)
  53.             {
  54.                 dir = "u";
  55.                 move(0, -moveBy, dir);
  56.             }
  57.             else
  58.             {
  59.                 if(e.keyCode==40)
  60.                 {
  61.                     dir = "d";
  62.                     move(0, moveBy, dir);
  63.                 }
  64.             }
  65.         }
  66.     }
  67. }
  68.  
  69. //document.body.onkeyup = function(){pauseMusic()};
  70. function pauseMusic()
  71. {
  72.     document.getElementById("tankaudio").pause();
  73. }

iisstart.htm (página)

Código HTML:
Ver original
  1.     <head>
  2.         <title>Game Test :)</title>
  3.         <link href="pumavatar.ico" rel="shortcut icon" type='image/x-icon'>
  4.         <link rel="stylesheet" href="css2.css" type="text/css" media="all">
  5.         <meta property="og:title" content="PuMaLaND" />
  6.         <meta property="og:description" content="Puma's Official poor site :)" />
  7.         <meta property="og:image" content="http://201.233.151.12:80/pumavatar.jpg" />    
  8.         <meta property="og:url" content="http://201.233.151.12:80/" />
  9.         <script type="text/javascript" src="socket.io/socket.io.js"></script>
  10.         <script type="text/javascript" src="game.js"></script>
  11.         <script type="text/javascript" src="gameclient.js"></script>
  12.  
  13.         <script type="text/javascript" src="js/jquery-1.11.2.js"></script>
  14.     </head>
  15.     <body onkeydown="moveElement(event)" onkeyup="pauseMusic()">
  16.     <!-- Los eventos de teclado pueden ser onkeypress, onkeyup, onkeydown -->
  17.         <audio id="tankaudio" controls hidden>
  18.             <source src="taudio.mp3" type="audio/mpeg">
  19.         </audio>
  20.         <audio autoplay controls hidden loop>
  21.             <source src="seed.mp3" type="audio/mpeg">
  22.         </audio>
  23.         <div>
  24.             <h2>-By PuMa SoftLabs-</h2>
  25.         </div>
  26.     </body>
  27. </html>

Así es como tengo todo desde el lado del cliente, y así funciona bien, pero lo que quiero es poder usar los eventos desde javascript de document.body.onkeydown y document.body.onkeyup, que tengo comentados porque no me funcionan, y están siendo invocados desde el HTML. Alguien podría decirme que hay mal en la estructura de mi código que no me permite hacer lo que quiero? Muchas gracias!

Etiquetas: eventos, teclado
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:41.