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
Si te han matado pero durante algún tiempo sigue la partida
mensaje_enviado = string.char(mensaje) .. "FFF"
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
Si has matado al jugador remoto pero durante algún tiempo sigue la partida
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
Adhoc.term() -- Cerramos el Adhoc -----
System.sleep(500)
System.memclean() -- Limpiamos la Memoria --
System.sleep(500)
System.Quit() -- Salida al XMB ---------
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
¿Te gustan las noticias publicadas? ¿Porqué no votarlas?
¡El grupo SceneBeta no tiene límites!
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
jou jou!
INTENTO PROGRAMAR UN SECOND LIFE PARA PSP EN LUA. SI QUIERES AYUDARME.. AVISAME (LA IDEA ES UN SL PARA CHATEAR NO VER EL MUNDO EN 3D) :)
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...
Tutorial de programación LUA:
http://pipagerardo.fortunecity.es/Tutorial_LUA_PSP_pipagerar...
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
Llamado a los interesados en Lua: Terminemos juntos este proyecto.
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...
Tutorial de programación LUA:
http://pipagerardo.fortunecity.es/Tutorial_LUA_PSP_pipagerar...
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
SKA-P Al poder !!!!!!!!!!!!!!!!!!!!!!!!!
Programar , un hobbie que nunca acaba.
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"
Tutorial de programación LUA:
http://pipagerardo.fortunecity.es/Tutorial_LUA_PSP_pipagerar...
Excelente tutorial, gracias
Excelente tutorial, gracias por el aporte