https://www.segasaturno.com/portal/viewtopic.php?f=33&t=7676&p=78482#p78482
-----------------------------------
Ryo Suzuki
25 May 2014, 11:20 PM

Re: Trasteando con el Lua Player de Saturn (Tutorial)
-----------------------------------
Veis lo que me pasa a veces? Que soy un bocazas :mrgreen: 

Es cierto que haciendo memoria sí que conocía al menos el Panzer Dragoon que lo tengo japonés y europeo en mi colección y que efectivamente tenía que haber recordado que es un juego que hace uso de esta funcionalidad (el PAL, of course).

Además, como estuvimos hablando luego, creo que la Saturn es la consola pionera en este sentido de tener una bios configurable con opciones como idioma, fecha, hora, etc; y que guarda esa información por medio de una pila. Si estoy confundido y hubo otra antes que alguien me desmienta esta info...

En cuanto a lo de funciones no usadas, en mi defensa diré -y tras la metedura de pata- que [b]slSetLanguage[/b] sí que estoy casi seguro que no lo usa ningún juego. De hecho no tiene mucho sentido que un juego te cambie esa configuración, o al menos yo personalmente no le veo razón de ser... pero en fin, que el comando ahí está....


Bueno, sigo avanzando un poco más en mis devaneos con el Lua Player. Voy a abordar una lección que acabo de improvisar hace unos minutos. Hoy toca el turno de:


[b]Detectando el pad y periféricos conectados[/b]

Para esto me he documentado mirando este [url=http://www.segasaturno.com/portal/homebrew-smpc-control-del-pad-vf4-vt3958.html]hilo del amigo y maestro saturnero FacundoARG. Ahí explicaba como controlar un cuadrado blanco con el mando bajo Saturn Orbit y me ha servido de mucho ya que adaptando un poco en ocasiones la sintaxis a este Lua Player he conseguido que me funcione, al menos hasta cierto punto.

Cito al bueno de Facundo que explicó muy bien como administra la Saturn este tema:

[quote]Primero vamos a entender como se manejan los pads. 
El SMPC(System Manager & Pheriperal Control) Sistema de administración y Control de Periféricos, tiene como una de sus tantas tareas controlar nuesotros joysticks. 

Tenemos dos constantes Per_Connect1 y Per_Connect2 que contienen el estado de los periféricos/puertos  1 y 2 respectivamente. 
El resultado/valor que se puede obtener en todo momento (lo asigna el SMPC) son: 

0 Si hay algo conectado al puerto. 
1 Si no esta conectado algún pad al puerto. 
[/quote]

Con esta valiosa información y ajustando un poco los condicionales a Lua, lo pongo en práctica:

[code linenumbers=false]slInitSystem(TV_720x576,NULL,1)


slPrint("- SAMPLE DE ESTADO DE PUERTOS 1 Y 2 -", 2, 2) 

if Per_Connect1()==0 then slPrint("-Puerto 1: Nada conectado", 2, 6) else slPrint("-Puerto 1: Algo conectado", 2, 6)
end

if Per_Connect2()==1 then slPrint("-Puerto 2: Algo conectado", 2, 8)
else slPrint("-Puerto 2: Nada conectado", 2, 8) 
end


slPrint("www.segasaturno.com", 10, 25) 

while true do slSynch() end[/code]
Creamos la iso correspondiente como siempre, ejectuamos en el el emulador y obtenemos este resultado:

 [img]http://www.segasaturno.com/portal/files/images/2/01_mandos.jpg[/img] 

Parece haber funcionado bien. Vamos a cercionárnos de que sea correcto y esté detectando bien. Configuramos en emulador y en el puerto dos le decimos, por enchufar algo virtual, que tenemos metido un ratón de Saturn:

 [img]http://www.segasaturno.com/portal/files/images/2/02_mandos.jpg[/img] 

Volvemos a ejecutar la iso en el Yabause para comprobar que todo haya ido bien:

 [img]http://www.segasaturno.com/portal/files/images/2/03_mandos.jpg[/img]

Como dirían los ingleses, so far so good. Volvamos a las enseñanzas saturneras del master FacundoARG:

[quote]Por otro lado tenemos Smpc_Peripheral[] que es un array, donde el indice del arreglo/vector es el número de pad. Que van desde el 0 al 11. 
Recuerden que podemos conectar 12 joysticks con el multitap; 6 por cada puerto. 

Tenemos 3 tipos de datos en la estructura del array Smpc_Peripheral[]. 
data (es el metodo conocido como Pressed que significa persionado constantemente ó mantener presionado) 
    
push (es el metodo conocido como press, que significa que ejecuta la accion apenas presionamos el boton) 
    
pull (es el metodo conocido como release, que significa que se ejecuta la accion una vez soltado el boton que hayamos presionado) 

     
Los botones: 

PER_DGT_ST 
PER_DGT_KU 
PER_DGT_KR 
PER_DGT_KD 
PER_DGT_KL 

PER_DGT_TA 
PER_DGT_TB 
PER_DGT_TC 

PER_DGT_TX 
PER_DGT_TY 
PER_DGT_TZ 

PER_DGT_TL 
PER_DGT_TR 
     

Supongo que PER_DGT significa Peripheral_Didital, TA = Trigger A, KU = Keypad Up , ST = Start    . [/quote]

Genial, vamos a añadir esto a nuestro pequeño programa que hemos creado antes para detectar si los puertos uno y dos tenían algo conectado. 

Imaginemos que queremos detectar y que nos informe en pantalla si estamos pulsando el boton A del mando 1.

A Lua, yo lo adaptaría así:

[quote]if bit.band(data, PER_DGT_TA) == 0 then slPrint("Estas pulsando A en el mando 1", 5, 12) 
end[/quote]

Cambia ligeramente de como lo hacía Facundo en el Saturn Orbit. Lo he mirado de los ejemplos de Lua que usan la gestión y detección del mando. Por lo que veo necesitamos hacer también esto antes de dar ese condicional para detectar que botón estamos pulsando:

[quote]id,ext,data = Smpc_Peripheral(0)[/quote]

Por lo que entiendo son como tres variables asociadas al system managament y al periferical control. Con esto y la linea que he puesto arriba podemos detectar en este caso si estamos pulsando A (fijaos que hemos puesto [b]PER_DGT_TA[/b]) y poner un mensaje en pantalla en cuanto lo hagas.


[b]Integrando con todo lo aprendido[/b]

Voy a poneros un código que he hecho usando la detección del mando y pulsación de un botón concreto y a la vez tratándolo de unificar con todo lo que he ido aprendiendo anteriormente (variables, condicionales, bucles whiles, etc). Por lo que estoy intuyendo en el tema este de la programación es importante ir adquiriendo conocimientos y tener la capacidad de integrarlos todos y hacer buen uso de ellos.

Ahí va mi nuevo programa:

[code linenumbers=false]slInitSystem(TV_320x240,NULL,1)

local bucle = 3

local variablepad = 0.25

local variableautoincremento = 0

slPrint("- VARIABLES LOCAS Y TAL -", 7, 1) 


while bucle < 30000000000 do

slPrint("-Esta variable va subiendo", 1, 6)
slPrint(" al pulsar A", 1, 7)

slPrint(variablepad, 20, 7) 

slPrint("-Sin embargo esta se incrementa ", 1, 9)
slPrint(" por la puta cara", 1, 10)

slPrint(variableautoincremento, 20, 10) 

variableautoincremento = variableautoincremento + 0.02

id,ext,data = Smpc_Peripheral(0)
if bit.band(data, PER_DGT_TA) == 0 then variablepad = variablepad + 0.25 
end
if bit.band(data, PER_DGT_TA) == 0 then slPrint("----Pulsando----", 10, 16) else slPrint("--No Pulsando---", 10, 16)  
end

slPrint("Ryo Suzuki de www.segasaturno.com", 3, 25) 
end

while true do slSynch() end[/code]

Si lo miráis detalladamente no es muy complicado, ¿no? Luce tal que así:

 [img]http://www.segasaturno.com/portal/files/images/2/variables_locas.jpg[/img]

Como veis y podéis probar si compiláis este código y creáis la correspondiente iso, este pequeño programa muestra dos variables en pantalla. Una de ellas se incrementa cuando pulsamos el bóton A, mientras que la otra va subiendo de valor sin que hagamos nada.

También podéis comprobar que tenemos un "chivato" que nos indica si estamos o no pulsado el bóton, para decorar un poco.

Creo que es bastante entendible, pero aun así lo comento que puede venir bien por si alguno se pierde:

[code linenumbers=false]slInitSystem(TV_320x240,NULL,1)

local bucle = 3 -- creo esta variable que la voy a usar para crear el bucle principal del while del programa

local variablepad = 0.25  -- esta es la variable que se va a incrementar con la pulsación del pad

local variableautoincremento = 0  -- ahora defino la variable que como su nombre indica se auntoincrementa automaticamente

slPrint("- VARIABLES LOCAS Y TAL -", 7, 1) 


while bucle < 30000000000 do  -- bucle del while principal, hasta que no llega a un numero muy alto haz esto...

slPrint("-Esta variable va subiendo", 1, 6)
slPrint(" al pulsar A", 1, 7)

slPrint(variablepad, 20, 7)   -- muestro en pantalla la variable del pad

slPrint("-Sin embargo esta se incrementa ", 1, 9)
slPrint(" por la puta cara", 1, 10)

slPrint(variableautoincremento, 20, 10)   -- muestro en pantalla la variable que va subiendo de valor sola

variableautoincremento = variableautoincremento + 0.02  -- comoe esta dentro del bucle a cada pasada la variable autoincremento va a subir 0.02

id,ext,data = Smpc_Peripheral(0)  -- necesito hacer esto que no se bien lo que es para detectar el pad, es valido solo para el mando uno porque hemos puesto 0, como hemos explicado antes

if bit.band(data, PER_DGT_TA) == 0 then variablepad = variablepad + 0.25  -- Si pulsamos A, la variable pad de incrementea 0.25
end -- esto es el end de este if, ¿queda claro?
 
if bit.band(data, PER_DGT_TA) == 0 then slPrint("----Pulsando----", 10, 16) else slPrint("--No Pulsando---", 10, 16) -- aqui lo que hago es usando el mismo condicional además de sumar 0.25 como ha hecho antes que imprima si estas pulsando o no (gracias al uso del else que ya hemos aprendido). Tengo que tener cuidado con la colocación del texto para que uno "pise" a otro y quede bien 
end -- end de este if, NOTA: esto se podria hacer con un If combinado que a la vez que sume imprima, seria algo asi if con then "haz esto" y "haz esto otro tambien", como no se hacerlo aun o no encuentro la sintaxis correcta tengo que usar dos ifs :( 

slPrint("Ryo Suzuki de www.segasaturno.com", 3, 25) -- A lo Cristiano Ronaldo
end -- Para los despistados este es el end de nuestro bucle principal while

while true do slSynch() end[/code]

No está nada mal la fusión de conocimientos que he aplicado. Sin embargo tiene una pequeña pega. Si lo probáis vereis que pulsando A, aunque lo hagamos muy ligeramente la variable se incrementa de golpe bastante -como 1 y pico cada vez-, o sea no podemos ver el incremento de 0.25 a cada pequeña pulsación. Esto no sé como afinarlo bien, aunque supongo que se debe poder hacer... Si teneis idea o podéis ayudarme, ya sabéis...

En fin, que eso es todo por hoy. Añado en esta ocasión la iso de este último sample por si os apetece probarlo y no os animáis a compilarlo por vosotros mismos.

Pronto +


