Anuncios Google

08. Integracion de Adhoc en Multijugador LUA

Tutoriales Avanzados Homebrewes

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

PRIMERO DEFINIMOS LAS VARIABLES DEL TUTORIAL ADHOC

 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.
 
}

DEFINIMOS LAS FUNCIONES DEL TUTORIAL ADHOC

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

AVISO DE INTERRUPTOR WLAN

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. --

SI PULSAS ARRIBA O ABAJO (No creo que puedas pulsar los dos a la vez)

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

SI PULSAS DERECHA O IZQUIERDA (No creo que puedas pulsar los dos a la vez)

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

SI PULSAS CRUZ

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

 

Trasmitimos el mensaje a prueba de fallos de transmisión

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. --

SI EL CONTRARIO PULSA ARRIBA O ABAJO

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

SI EL CONTRARIO PULSA DERECHA O IZQUIERDA

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

SI EL CONTRARIO PULSA CRUZ

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...

4.125
Tu voto: Ninguno Votos totales: 4.1 (16 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Arbër

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..

Imagen de pipagerardo

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... 

Imagen de Tanos

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 

Imagen de pipagerardo

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...

Imagen de CkFra

Normal

que LUA te parezca tan fácil, con esa pedazo carrera profesional de programador jajaja

Gracias por el tuto tiu! 

Imagen de P22

En pocas palabras:Cuáles

En pocas palabras:Cuáles son las variables que utilizas para el ad-hoc???

Saludos 

Imagen de pipagerardo

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

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.