Anuncios Google

Ayuda para un novato

Buen día a todos

Estoy iniciandome en la programacion en LUA para mi psp y empece un proyecto de un programita que realice tiradas de dados. (Hago destacar que he visto y provado con exito los dos homebrew que existen en la Scene, pero siento que pueden dar mas de si mismos)

Lo lamentable es que tuve que iniciar de cero ya que no pude encontrar el codigo fuente de ninguno y estoy atorado en lo siguiente:

No puedo hacer que la tirada permanesca en pantalla, presiono "x" que en mi caso es la que designe para ejecutar la tirada, y muestra los resultados, pero unicamente mientras mantengo "x" presionado, ademas tambien rotan los numeros continuamente mientras mantengo la "x"

¿Que puedo hacer?

les coloco lo que llevo de mi codigo y ojala alguien pueda ayudarme

 

verde = Color.new(0,255,0)

rojo = Color.new(255,0,0)

turquesa = Color.new(0,255,255)

blanco = Color.new(255,255,255)

Tdados = {}

Ndados = {1,2,3,4,5,6,7,8,9,10}

Tdados[1] = 2

Tdados[2] = 4

Tdados[3] = 6

Tdados[4] = 8

Tdados[5] = 10

Tdados[6] = 12

Tdados[7] = 20

x=1

y=1

Texto1 = "Arriba y Abajo Selecciona el tipo de dados a lanzar:    "

Texto2 = "Derecha e Izquierda Selecciona el # de dados a lanzar:  "

oldpad = Controls.read()

Resultados = {}

-- Funcion que elija el tipo y numero de dados a utilizar

function SeleccionDados()

if pad:right() and oldpad:right() ~= pad:right() and y < 10 then

y = y+1

end

if pad:left() and oldpad:left() ~= pad:left() and y > 1 then

y = y-1

end

if pad:up() and oldpad:up() ~= pad:up() and x > 1 then

x = x-1

end

if pad:down() and oldpad:down() ~= pad:down() and x < 7 then

x = x+1

end

screen:print(0,100,Texto1 .. Tdados[x],verde)

screen:print(0,150,Texto2 .. Ndados[y],turquesa)

end

-- Funcion que ejecute la tirada de dados

function lanzarDados()

if pad:cross() then

screen:clear()

math.randomseed(os.time())

z = 15

for a = 1,y do

Resultados[a] = math.random(1,Tdados[x])

z = z + 15

screen:print(100,z,Resultados[a],blanco)

end

end

end

while true do

screen:clear()

pad = Controls.read()

SeleccionDados()

lanzarDados()

screen.waitVblankStart()

screen.flip()

oldpad = pad

end

 


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 Dioni0396

eso te ocurre porque

cuando dices pulso X es mientras lo mantengas pulsado, con lo cual te recomiendo usar un booleano, mira:

verde = Color.new(0,255,0)
 
rojo = Color.new(255,0,0)
 
turquesa = Color.new(0,255,255)
 
blanco = Color.new(255,255,255)
 
TirarD = false
 
Tdados = {}
 
Ndados = {1,2,3,4,5,6,7,8,9,10}
 
Tdados[1] = 2
 
Tdados[2] = 4
 
Tdados[3] = 6
 
Tdados[4] = 8
 
Tdados[5] = 10
 
Tdados[6] = 12
 
Tdados[7] = 20
 
x=1
 
y=1
 
Texto1 = "Arriba y Abajo Selecciona el tipo de dados a lanzar:    "
 
Texto2 = "Derecha e Izquierda Selecciona el # de dados a lanzar:  "
 
oldpad = Controls.read()
 
Resultados = {}
 
-- Funcion que elija el tipo y numero de dados a utilizar
 
function SeleccionDados()
 
if pad:right() and oldpad:right() ~= pad:right() and y < 10 then
 
y = y+1
 
end
 
if pad:left() and oldpad:left() ~= pad:left() and y > 1 then
 
y = y-1
 
end
 
if pad:up() and oldpad:up() ~= pad:up() and x > 1 then
 
x = x-1
 
end
 
if pad:down() and oldpad:down() ~= pad:down() and x < 7 then
 
x = x+1
 
end
 
screen:print(0,100,Texto1 .. Tdados[x],verde)
 
screen:print(0,150,Texto2 .. Ndados[y],turquesa)
 
end
 
-- Funcion que ejecute la tirada de dados
 
function lanzarDados()
 
if pad:cross() then
TirarD = true --Booleanos es verdadero
end
if TirarD == true then 
 
screen:clear()
 
math.randomseed(os.time())
 
z = 15
 
for a = 1,y do
 
Resultados[a] = math.random(1,Tdados[x])
 
z = z + 15
 
screen:print(100,z,Resultados[a],blanco)
 
end
 
end
 
end
 
while true do
 
screen:clear()
 
pad = Controls.read()
 
SeleccionDados()
 
lanzarDados()
 
screen.waitVblankStart()
 
screen.flip()
 
oldpad = pad
 
end

Compruebalo ahora.

Gracias, pero falto un poquito

El codigo que me diste funciona, si genera la tirada y la mantiene en pantalla, sin embargo se queda realizando tiradas y no se detiene, cambia muy rapidamente por lo que se dificulta ver los resultados.

Te agraadesco la ayuda, voy a pensar un poco haber si logro resolverlo, por que tambien me falta encontrar la forma de una vez realizada la tirada, volver al menu anterior y seleccionar nuevamente los dados

Muchas Gracias

Imagen de Dioni0396

Pues facil,

verde = Color.new(0,255,0)
 
rojo = Color.new(255,0,0)
 
turquesa = Color.new(0,255,255)
 
blanco = Color.new(255,255,255)
 
TirarD = false
 
Tdados = {}
 
Ndados = {1,2,3,4,5,6,7,8,9,10}
 
Tdados[1] = 2
 
Tdados[2] = 4
 
Tdados[3] = 6
 
Tdados[4] = 8
 
Tdados[5] = 10
 
Tdados[6] = 12
 
Tdados[7] = 20
 
x=1
 
y=1
 
Texto1 = "Arriba y Abajo Selecciona el tipo de dados a lanzar:    "
 
Texto2 = "Derecha e Izquierda Selecciona el # de dados a lanzar:  "
 
oldpad = Controls.read()
 
Resultados = {}
 
-- Funcion que elija el tipo y numero de dados a utilizar
 
function SeleccionDados()
 
if pad:right() and oldpad:right() ~= pad:right() and y < 10 then
 
y = y+1
 
end
 
if pad:left() and oldpad:left() ~= pad:left() and y > 1 then
 
y = y-1
 
end
 
if pad:up() and oldpad:up() ~= pad:up() and x > 1 then
 
x = x-1
 
end
 
if pad:down() and oldpad:down() ~= pad:down() and x < 7 then
 
x = x+1
 
end
 
screen:print(0,100,Texto1 .. Tdados[x],verde)
 
screen:print(0,150,Texto2 .. Ndados[y],turquesa)
 
end
 
-- Funcion que ejecute la tirada de dados
 
function lanzarDados()
 
if pad:cross() then
TirarD = true --Booleanos es verdadero
end
if TirarD == true then 
 
screen:clear()
 
math.randomseed(os.time())
 
z = 15
 
for a = 1,y do
 
Resultados[a] = math.random(1,Tdados[x])
 
z = z + 15
end
TirarD = 1
elseif TirarD == 1 then
screen:print(100,z,Resultados[a],blanco)
 
end
 
end
 
while true do
 
screen:clear()
 
pad = Controls.read()
 
SeleccionDados()
 
lanzarDados()
 
screen.waitVblankStart()
 
screen.flip()
 
oldpad = pad
 
end

Es cuestion de jugar con las variables y los ifs.

Algo fallo...

Adicione el ultimo cambio al codigo y marca un error al ejecutarlo en la linea 53 (considerando que no existan espacios entre las lineas)

el error dice: 53: bad argument #2 to 'print' (string expected, got nil)

que me imagino dice que algun valor de los que se quieren imprimir en pantalla es nulo o esta vacio, pero la verdad no se cual, porque o que onda.

Imagen de Dioni0396

pues dime cual es,

y te dire porque falla, si falla es porque algo falta, dime el codigo de esa linea.

el codigo

53    screen:print(100,z,Resultados[a],blanco)

eso es todo lo que hay en la linea (53 es la referencia a la linea)

EDITO

Ya lo resolvi XD

Use tu sugerencia, pero analisando la estructura al fin me di cuenta de que pasaba.

Si intento imprimir fuera del comando for, es imposible por que no hay nada que haga que el numero cambie y considerara al valor nulo, ya que se intenta imprimir una tabla usando un valor unico, para el caso "a"

Ahora bien, al frenar la pantalla siempre brincaba el comando, por una sencilla razon, "EL TIEMPO NO SE DETIENE" al definir math.randomseed(os.time()) en cada vuelta del bucle la sentencia siempre es verdadera, por lo tanto el tiempo cambia y los valores con el, cada segundo

Antonces lo repare nombrando una variable para el tiempo en mi caso d=os.time(), por lo que solo cada que presione "x" este valor cambiara y entonces math.randomseed(d) tambien.

Magia

Te agradesco mucho en verdad, sin la replica de opciones y el pequeño debate, no habria conseguido llegar a la solucion, adjunto el codigo para que se vea el resultado final, y por si a alguien le sirve.

Sigo aceptando sugerencias y seguire haciendo preguntas, aun me falta bastante para acabarlo.

Hasta luego

--Tiradas de Dados
--Autor: SilverWolfG
verde = Color.new(0,255,0)
rojo = Color.new(255,0,0)
turquesa = Color.new(0,255,255)
blanco = Color.new(255,255,255)
Tdados = {2,4,6,8,10,12,20,100}
Ndados = {1,2,3,4,5,6,7,8,9,10}
x=1
y=1
Texto1 = "Arriba y Abajo Selecciona el tipo de dados a lanzar:    "
Texto2 = "Derecha e Izquierda Selecciona el # de dados a lanzar:  "
oldpad = Controls.read()
Resultados = {}
TirarD = true
-- Funcion que elija el tipo y numero de dados a utilizar
function SeleccionDados()
if pad:right() and oldpad:right() ~= pad:right() and y < 10 then
y = y+1
end
if pad:left() and oldpad:left() ~= pad:left() and y > 1 then
y = y-1
end
if pad:up() and oldpad:up() ~= pad:up() and x > 1 then
x = x-1
end
if pad:down() and oldpad:down() ~= pad:down() and x < 8 then
x = x+1
end
screen:print(0,100,Texto1 .. Tdados[x],verde)
screen:print(0,150,Texto2 .. Ndados[y],turquesa)
end
-- Funcion que ejecute la tirada de dados
function lanzarDados()
if pad:cross() then
d = os.time()
TirarD = false --Booleanos es verdadero
end
if TirarD == false then
screen:clear()
math.randomseed(d)
z = 15
for a = 1,y do
Resultados[a] = math.random(Tdados[x])
z = z + 15
screen:print(100,z,Resultados[a],blanco)
end
end
end
while true do
screen:clear()
pad = Controls.read()
SeleccionDados()
lanzarDados()
screen.waitVblankStart()
screen.flip()
oldpad = pad
end

Imagen de Dioni0396

Perdon por no haber estado

como veo, lo has resuelto, muy bien.

Un Saludo

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.