Anuncios Google

[EN PORTADA][LUA] Integración de Adhoc en Multijugador

Hilo cerrado por Unicorn, tutorial para crear un juego LUA con AdHoc en portada.


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

Descarga del Tutorial

 

 

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

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


Anuncios Google

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 P22

Me parece que eso esta mal

Me parece que eso esta mal ya que no se pueden definir variables con el mismo nombre.(No me juzgéis mal si me equivovo).

Saludos 


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Imagen de pipagerardo

¿A qué variable te estás refiriendo?

Es curiosidad, que variable te está mosqueando? ...

¿Son estas? 

nickname                = System.nickName()
nickname                = tostring(nickname)

macaddress              = Adhoc.getMac()
macaddress              = tostring(macaddress)

porque te aseguro que funciona perfectamente...

 

Imagen de pipagerardo

Respuesta

Venga, como veo que no te animas te respondo.

La clave son las funciones tostring() y tonumber(). Estas se utilizan para cambiar una variable definida por ejemplo de number -> string o de string -> number.

 

tonumber(VAR{,base})    attempts to convert VAR to a number, if it can't the function will return nil. An optional argument specifies the base to interpret the numeral. The base may be any integer between 2 and 36, inclusive. In bases above 10, the letter `A´ (in either  upper or lower case) represents 10, `B´ represents 11, and so forth, with `Z´  representing 35. In base 10 (the default), the number may have a decimal part, as well as an optional exponent part. In other bases, only unsigned integers   are accepted.        
                  
tostring(VAR)        accepts any type of variable and converts it into a string

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.