Como Tanos me ha pedido, seguro que algunos de vosotros estareis interesados en que vuesto jueguillo programado en LuaPlayerHM6.6 pueda ser multijugador via Adhoc. De momento esto es un ejemplo para dos jugadores. Pero contiene las bases para más...Añadida al final del tutorial descarga para entender aun mejor el funcionamiento del AdHoc en LUA.
Descarga del Tutorial AdHoc LUA
blanco = Color.new( 255, 255, 255 ) negro = Color.new( 0, 0, 0 ) pad = Controls.read() -- Variable que lee el teclado. oldpad = pad -- Teclado estado anterior. SA = 60 -- Sensibilidad del Analógico (Se me ha olvidado ) -- fin_espera = true fin_juego = false fin_partida = false nickname = System.nickName() nickname = tostring(nickname) macaddress = Adhoc.getMac() macaddress = tostring(macaddress) Adhoc_state = 0 mensaje_recibido = "" mensaje_enviado = "" ultimo_mensaje_recibido = "" ultimo_mensaje_enviado = "" mensaje = 65 caracter = "A" jugador = {} jugador[1] = { sprite = img_sprite_1, vida = 99, -- 100 Vida máxima / 0 = Destruido. p_fuego = 5, -- Daño inflingido. combustible = 99, -- Litros de Combustible. municion = 99, -- Numero de Proyectiles. x = 50, -- Posicion X. y = 136, -- Posicion Y. direccion = 0, -- Direccion del tanque en grados 0 - 360. accion = true, -- True = Operativo / False = Destruido. en_juego = true -- Si juega o no. } jugador[2] = { sprite = img_sprite_2, vida = 99, -- 100 Vida máxima / 0 = Destruido. p_fuego = 5, -- Daño inflingido. combustible = 99, -- Litros de Combustible. municion = 99, -- Numero de Proyectiles. x = 430, -- Posicion X. y = 136, -- Posicion Y. direccion = 0, -- Direccion del tanque en grados 0 - 360. accion = true, -- True = Operativo / False = Destruido. en_juego = true -- Si juega o no. }
function reiniciar_nivel() -- TU CODIGO -- end function pintar_fondo_juego() -- TU CODIGO -- end function mueve_sprite_arriba( numero ) -- TU CODIGO -- end function mueve_sprite_abajo( numero ) -- TU CODIGO -- end function mueve_sprite_derecha( numero ) -- TU CODIGO -- end function mueve_sprite_izquierda( numero ) -- TU CODIGO -- end function accion_sprite( numero ) -- TU CODIGO -- end function dibujar_sprites() -- TU CODIGO -- end function mostrar_marcadores() -- TU CODIGO -- end function muestra_pantalla() -- TU CODIGO -- end function determina_fin_partida_y_ganador() -- TU CODIGO -- end
while pcall ( Adhoc.init ) == false do screen:print( 130, 116, "CONECTA EL INTERRUPTOR WLAN" , blanco ) screen:print( 130, 126, " PULSA X " , blanco ) screen.flip() fin_espera = true while fin_espera do pad = Controls.read() System.sleep(50) if pad:cross() then fin_espera = false end end end screen:print( 140, 86, "nickname = " .. nickname , blanco ) screen:print( 140, 96, "macaddress = " .. macaddress , blanco ) screen:print( 130,116, " ESPERANDO ADHOC " , blanco ) screen.flip() System.sleep(50) Adhoc.connect() System.sleep(50) repeat Adhoc_state = Adhoc.getState() System.sleep(50) until Adhoc_state == 1
-- La idea es transmitir via Adhoc un "String" o cadena de cuatro caracteres: -- -- El primer carácter sera uno de control que variará desde el número 65 que es la -- -- letra "A" hasta el número 122 que es la letra "z". Esto es para evitar que falte -- -- un mensaje, por ejemplo: Si nos ha llegado el mensaje número 75 y después nos -- -- llega el mensaje 77, pues está claro que el 76 no ha llegado. Ahora tenemos que -- -- pedirle a la otra consola que nos repita el mensaje 76. -- -- El segundo carácter es el de arriba o abajo, como no se pueden pulsar las dos -- -- teclas a la vez si es arriba "U", abajo "D" y no pulsadas "F". -- -- El tercer carácter es de derecha, izquierda igual que el anterior. Derecha "R", -- -- Izquierda "L" y no pulsadas "F". -- -- Y el cuarto carácter es de pulsar el botón cruz. Pulsado "C", no pulsado "F". --
fin_juego = false repeat reiniciar_nivel() mensaje_recibido = "" mensaje_enviado = "" ultimo_mensaje_recibido = "" ultimo_mensaje_enviado = "" mensaje = 65 fin_partida = false repeat pintar_fondo_juego() pad = Controls.read() if jugador[1].accion then -- Jugador que controlas tu. -- mensaje_enviado = string.char(mensaje) -- Cabecera de mensaje. --
if pad:up() or pad:analogY() < -SA then mensaje_enviado = mensaje_enviado .. "U" mueve_sprite_arriba( 1 ) elseif pad:down() or pad:analogY() > SA then mensaje_enviado = mensaje_enviado .. "D" mueve_sprite_abajo( 1 ) else mensaje_enviado = mensaje_enviado .. "F" -- no hay movimiento -- end
if pad:right() or pad:analogX() > SA then mensaje_enviado = mensaje_enviado .. "R" mueve_sprite_derecha( 1 ) elseif pad:left() or pad:analogX() < -SA then mensaje_enviado = mensaje_enviado .. "L" mueve_sprite_izquierda( 1 ) else mensaje_enviado = mensaje_enviado .. "F" -- no hay movimiento -- end
if pad:cross() and oldpad:cross() ~= pad:cross() then mensaje_enviado = mensaje_enviado .. "C" accion_sprite( 1 ) else mensaje_enviado = mensaje_enviado .. "F" -- no hay botón pulsado -- end
else
Si te han matado pero durante algún tiempo sigue la partida
mensaje_enviado = string.char(mensaje) .. "FFF"
end
fin_espera = false repeat Adhoc.send(mensaje_enviado) System.sleep(10) for espera = 1, 5 do mensaje_recibido = Adhoc.recv() if string.sub( mensaje_recibido, 1, 1) == string.char(mensaje) then fin_espera = true break end if mensaje_recibido == ultimo_mensaje_recibido then Adhoc.send(ultimo_mensaje_enviado) System.sleep(10) end System.sleep(10) end until fin_espera ultimo_mensaje_recibido = mensaje_recibido ultimo_mensaje_enviado = mensaje_enviado mensaje = mensaje + 1 if mensaje > 122 then mensaje = 65 end
oldpad = pad -- (También se me ha olvidado) if jugador[2].accion then -- Jugador contrario u remoto. --
caracter = string.sub( mensaje_recibido, 2, 2 ) if caracter == "U" then mueve_sprite_arriba( 2 ) elseif caracter == "D" then mueve_sprite_abajo( 2 ) else -- no hay movimiento -- end
caracter = string.sub( mensaje_recibido, 3, 3 ) if caracter == "R" then mueve_sprite_derecha( 2 ) elseif caracter == "L" then mueve_sprite_izquierda( 2 ) else -- no hay movimiento -- end
caracter = string.sub( mensaje_recibido, 4, 4 ) if caracter == "C" then accion_sprite( 2 ) else -- no hay botón pulsado -- end
else
Si has matado al jugador remoto pero durante algún tiempo sigue la partida
end dibujar_sprites() mostrar_marcadores() muestra_pantalla() determina_fin_partida_y_ganador() until fin_partida
Trasmitimos el último mensaje a prueba de fallos de transmisión pero esta vez para evitar que una consola se quede pillada en un bucle cerrado, solo hacemos cinco bucles de prueba y salimos.
fin_espera = false for esperando = 1, 5 do Adhoc.send(mensaje_enviado) System.sleep(10) for espera = 1, 5 do mensaje_recibido = Adhoc.recv() if string.sub( mensaje_recibido, 1, 1) == string.char(mensaje) then fin_espera = true break end if mensaje_recibido == ultimo_mensaje_recibido then Adhoc.send(ultimo_mensaje_enviado) System.sleep(10) end System.sleep(10) end if fin_espera then break end end ultimo_mensaje_recibido = mensaje_recibido ultimo_mensaje_enviado = mensaje_enviado mensaje = mensaje + 1 if mensaje > 122 then mensaje = 65 end
until fin_juego Adhoc.term() -- Cerramos el Adhoc ----- System.sleep(500) System.memclean() -- Limpiamos la Memoria -- System.sleep(500) System.Quit() -- Salida al XMB ---------
Esta es una versión liberada del juego Cañones Corazas hecho por mi. Esta capada respecto a los gráficos y algunas cosillas más. Esta lo suficientemente simplificada como para su estudio. Y ya que este tutorial que hice sobre integración del Adhoc en juegos LUA era solo un ejemplo no funcional, ahora publico un ejemplo total mente funcional. Espero que aprendais mucho como yo he aprendido de otros y que publiqueis muchos juegos...
Comentarios
Perfecto
Está muy bien explicado y con solo saber algo de programacion en LUA se puede entender. Yo la verdad me familiaricé con el AdHoc al hacer el PSPChat, pero de todas formas esto no se me habia ocurrido porque me parecia muy complicado hacer un multijugador con el AdHoc y mira por donde lo has explicado muy bien, te felicito.
Salu2
-----[[7 años en Scenebeta, con la misma ilusión que la del primer día]]----
no me va O_O
hola, no se q pasa pero no ve ma, me marca error cuando lo pruebo con el luaplayer, me gustaria saber si tienes la lista completa de funciones de este lenguaje para leerlas, es mejor tenerlas todas q solo quedarce en los tutos, :D
me retiro de scenebeta.. se consigue mas ayuda hablandole a una pared que usando esta comunidad..
Error Ejecutando en LUA.
Hombre, esto es un ejemplo. Si lo ejecutas tal cual te vá ha dar error por las funciones:
function reiniciar_nivel() -- TU CODIGO -- end
function pintar_fondo_juego() -- TU CODIGO -- end
function mueve_sprite_arriba( numero ) -- TU CODIGO -- end
function mueve_sprite_abajo( numero ) -- TU CODIGO -- end
function mueve_sprite_derecha( numero ) -- TU CODIGO -- end
function mueve_sprite_izquierda( numero ) -- TU CODIGO -- end
function accion_sprite( numero ) -- TU CODIGO -- end
function dibujar_sprites() -- TU CODIGO -- end
function mostrar_marcadores() -- TU CODIGO -- end
function muestra_pantalla() -- TU CODIGO -- end
function determina_fin_partida_y_ganador() -- TU CODIGO -- end
Están echas así a mala gaita. Esto es para que lo integres en TU JUEGO, y estas funciones son típicas o deberian de serlo en un jueguillo. Pero pone -- TU CODIGO -- porque te las tienes que hacer tú.
Si nó fuera este el caso, mandame por privado toda la información que puedas. Error que te a dado, en qué linea... etc...
Hola Pipa
Ya te di las gracias por MP, pero te las vuelvo a dar por aquí.
En verdad, me emociona ver tu código :), o yo tengo una forma muy primitiva de programar (Que es lo más seguro) o eres MUY bueno en Lua (Que también es muy probable xD)
Un saludo, y una felicitación
Gracias.
Empecé programando en BASIC con un MSX de casette. Luego cuando salió el Commodore Amiga 500, empecé ha programar más en serio. Que gozada, funciones, multitarea real, prohibido los GOTOS y tenía un sintetizador de vóz para que hablase la computadora. Y cuando llegó la patata del PC IBM y todo el mundo se lo compró, empecé ha hacer aplicaciones para la oficina en QuickBasic , Borlan C y Dbase. Las bases de la programación clásica estructurada las tengo. Luego tuve un parón de varios años sin programar nada más que MODULA-2 para la carrera de Informática de Sistemas de la UNED donde terminé abandonando por aburrimiento. Trabajar y estudiar una carrera es muy duro. La verdad es que el LUA me há parecido el lenguaje de programación más facil de todos. Ahora se me está olvidando programar en C por culpa del LUA... Aunque en C no conseguí gran cosa en el tema gráfico y solo hice programas de gestión. Ahora lo tengo abandonadito al pobre. Pero es que me parece muy engorroso en cuanto empiezas con librerias gráficas y de sonido...
Normal
que LUA te parezca tan fácil, con esa pedazo carrera profesional de programador jajaja
Gracias por el tuto tiu!
En pocas palabras:Cuáles
En pocas palabras:Cuáles son las variables que utilizas para el ad-hoc???
Saludos
Variables Adhoc
Adhoc_state = 0 -- Es el estado del Adhoc, hasta que no sea 1 malo.
mensaje_recibido = ""
mensaje_enviado = ""
ultimo_mensaje_recibido = ""
ultimo_mensaje_enviado = ""
mensaje = 65
caracter = "A"
Excelente tutorial, gracias
Excelente tutorial, gracias por el aporte