Anuncios Google

[RESUELTO] Menú de pausa en mi juego... [Nuevo problema]

Hola estoy haciendo un pequeño juego y necesito poner el menú de pausa al presionar start y me gustaría que resaltara el menú de pausa usando el screen:clear en color negro pero que no quede totalmente negro. Osea que quede transparente algo como la imagen de abajo:

PD. Estoy pregramando en Lua HM7.

Lo que quiero hacer es que al presionar start me aparezca el menú en la pantalla pero que no cubra totalmente al juego sino que quede transparente.

EDITO: Ya he logrado que el menú se quede ne pantalla y salir de el al juego  al menu principal en fin ese no es el motivo por el que dejo esto.

El motivo real es que al presionar start me imprime el menu pero tambien la imagen del juego y así esta (parpadeando entre una y otra) y yo quiero que me imprima el menu de pause y nada más.

Cuando digo parpadeando es que me imprime las pantallas por micras de segundo.

Les dejo el código:


--Funcion Pause--
function Pausar()

currentp = 1

screen:clear()
screen:blit(0,0,pausa)

if menupausa == false then
menupausa = true
end

if menupausa == true then
menupausa = false
end

if menupausa == true then
screen:clear()
screen:blit(0,0,pausa)
end

while true do
pad = Controls.read()

if currentp == 1 then
screen:fontPrint(krist1,30,60,"Continuar",rojo)
screen:fontPrint(krist1,30,100,"Reiniciar",negro)
screen:fontPrint(krist1,30,140,"Salir",negro)
end

if currentp == 2 then
screen:fontPrint(krist1,30,60,"Continuar",negro)
screen:fontPrint(krist1,30,100,"Reiniciar",rojo)
screen:fontPrint(krist1,30,140,"Salir",negro)
end

if currentp == 3 then
screen:fontPrint(krist1,30,60,"Continuar",negro)
screen:fontPrint(krist1,30,100,"Reiniciar",negro)
screen:fontPrint(krist1,30,140,"Salir",rojo)
end

screen.flip()

if pad:up() and oldpad:up() ~= pad:up() then
currentp = currentp - 1
end

if pad:down() and oldpad:down() ~= pad:down() then
currentp = currentp + 1
end

if currentp == 0 then
currentp = 3
end

if currentp == 4 then
currentp = 1
end

if currentp == 1 and pad:cross() and oldpad:cross() ~= pad:cross() then
break
end

if currentp == 3 and pad:cross() and oldpad:cross() ~= pad:cross() then
dofile("ms0:/PSP/GAME/El Ahogado/System/Menu.lua")
end

screen.waitVblankStart()
screen.flip() 
oldpad = pad
end
end

--Fin Función--

if pad:start() then
Pausar()
end

screen.waitVblankStart()
screen.flip()
oldpad = pad
end


Creo que el problema es que ambos bucles tienen:
screen.waitVblankStart()
screen.flip()

pero si se lo quito a alguno ya no me muestra el menu o el juego.


Tutorial: Fabricando nuestro propio micrófono para la PSP.

Exclusivo de PSP.Scenebeta.com


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

Ups, leí todos los

Ups, leí todos los comentarios salvo ese :p bueno, que se le va a hacerXD

Saludos

PD: Ni se os ocurra pensar que lo hago por escenebitos...Inocente


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

Volvemos a lo mismo

Mantengamos los foros ordenados, si le vas a responder a alguien usa la opcion responder, ais quedara todo mas entendible.

Un saludo coder.


Manual del Perfecto Votante Para un voto libre y justo!.

TheGCProjects

Imagen de P22

if menupausa == false

if menupausa == false then
menupausa = true
end

if menupausa == true then
menupausa = false
end

Esta parte del código esta mal porque va alternando la una con la otra y la verdad, a mi parecer , sobra esa parte. Eliminala y dime que pasa.
SAldudos


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

lol

has puesto lo mismo que yo hace un tiempo más abajo. :P

Imagen de pspgorrister

Código

Puedes pegar el código modificado, porque si sigues teniendo en tu código:

if menupausa == false then
menupausa = true
end

if menupausa == true then
menupausa = false
end

Es que no me has hecho caso, y vamos que para eso ni me sigo molestando. Ademas cuando arregles algo di QUE ERA LO QUE FALLABA, así nos enteramos todos.

 


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de Arkanist

Prueba...

Ha que la función sea asi (esto solo si lo demas no te va)

function pause()

while true do

funcion pause

end

 

Por cierto, para imprimir y que salgan varios colores usa esto mejor

if opcion == 1 then

screen:print(texto, blanco)

else

screen:print(texto, negro)

if opcion = 2 then ...

Saludos.

Imagen de pspgorrister

10 goto 10

function pause()

while true do

funcion pause

end

 

Eso es un bucle infinito ¬¬

Imagen de Arkanist

No se si me expliqué bien.

Por ejemplo en el codigo pones:

if pad:start() then menupause()

function menupause()

while true do

funcion pause (me refiero, todo lo que tenga la pause, imprimir imagenes etc.

if pad:start() break

end

end

Imagen de P22

Tambien se puede escribir

Tambien se puede escribir asi:

if pad:cross() then

  if menupausa =true then

     menupausa = false

   else

     menupausa = true

   end

end


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

Pues

Entre los parentesis del screen:clear() pon la variable que contiene el color del que quieres que se ponga el fondo, de esta dos formas.

screen:clear(negro) -- siempre y cuando exista la variable ''negro'' que contenga ese color.

screen:clear(Color.New(0,0,0)) -- asi tambien se puede, creo.

Saludos.


Manual del Perfecto Votante Para un voto libre y justo!.

TheGCProjects

Imagen de pspgorrister

Consejos de programación

Bueno, he mirado tu codigo un poco por encima, y he visto una cosa que no tiene sentido

if menupausa == false then
    menupausa = true
end

if menupausa == true then    --(1)
    menupausa = false
end

Con esas lineas si menupausa al entrar ahí vale false, al salir de esas lineas seguirá valiendo false, porque aunque tu lo pongas en  true, al llegar a "(1), lo vuelves a poner a false porque se cumple la condición.

¿Qué es lo quieres, que si vale false valga true y viceversa?. Entonces pon sólo :

menupausa = not menupausa 

 No sé si esta linea es válida en lua, pero aunque sea otra sintaxis las 6 lineas que tienes se resumen en esa (aparte de que esta funciona).

También repites mucho código, por ejemplo en los "screen:fontPrint", que tecleas lo mismos 3 veces (una por opción). ¿Imaginas que tienes 20 opciones?, es mejor cambiar el valor sólo de los colores y hacerte una función (recuerda divide y venceras) que te muestre los "screen.fontPrint". Pero bueno, eso es metodología, estudio, prueba y paciencia, pero cuando antes se empieze a  hacer mejor, que luego cuesta mucho quitar los malos hábitos.

 Te digo esto como consejo, no pretendo ofenderte. Un saludo.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de el__QAT

Mmm..

Y la solución al problema?

Imagen de Guillermo_Cornielle

Pues que debes...

Hacer algo como esto:

If pad:cross() then

if menupausa == false then

menupausa == true

end

end

 

if pad:cross() then

if menupausa == true then

menupausa == false

end

end

 

Debes hacer algo como eso, despus de presionar un boton pausa es true, peor si lo presionas de nuevo pausa es false.

espero hayas entendido, saludos.


Manual del Perfecto Votante Para un voto libre y justo!.

TheGCProjects

Imagen de pspgorrister

Resumiendo

Ese código que has puesto, se puede resumir en una linea:Cool

if pad:cross() then menupausa = not menupausa

Imagen de Guillermo_Cornielle

En LUA

No se puede hacer eso de Menupausa = NOT MENUPAUSA.

Lo que eta en mayuscula, dudo que se pueda hacer en LUA.

Un saludo.

Imagen de ZYX3D

Desde luego que se puede

...y tanto que sí, que not es operador de Lua.

Y a ver si miráis la documentación antes de decir chorradas o inventaros TONTERÍAS...

Lo que no funcionaría es lo que TÚ decías, porque te confundes entre el operador de asignación (=) y el de comparación de igualdad (==).


Strength is irrelevant. Resistance is future. We wish to improve ourselves.

La fuerza es irrelevante. La resistencia es futuro. Queremos mejorarnos.

Imagen de Guillermo_Cornielle

Jejeje

See, se que esta mal, pero es solo un ejemplo, nunca dije que seria funcional, se que not es un operador de LUA,  y lo de not menu pause, pues crei que no se podia, pues no he visto  que se haga una asiganacion asi menupause == not menupause. Y si lees bien, dije que dudo que se pueda ;).

Pero si lo he visto asi ''if not menupause...''

De todas formas, gracias por resolverme la duda.

Un saludo.


Manual del Perfecto Votante Para un voto libre y justo!.

TheGCProjects

Imagen de ZYX3D

Desde luego que no lo verás...

...porque == es operador de comparación, no de asignación.

Que, si hubieras leído bien, ya lo sabrías.

Y cualquiera sabe que lo que haya visto, y lo que exista, son cosas diferentes. ¿Verdad que tú no has visto nunca setmetatable? Y sin embargo, es un comando fundamental de Lua. Del Lua "de verdad", el orientado a objetos, no el que controla el flujo del programa con "oldpad~=pad".

Así que, si lees bien, verás que lo que te estoy diciendo es que si vas a aportar algo, lo hagas; pero si te vas a limitar a jugar a los dardos en programación, y soltar cosas a bulto, sin tener ni puñetera idea, y "dudo" y "creo", en tus mensajes, significan "No tengo ni puñetera idea, pero lo primero que se me pasa por la cabeza es X", para eso, mejor no digas nada. Porque entonces solo haces que estorbar. Porque lo que hayas visto, simplemente, tampoco es relevante, menos aún si has sido incapaz de entenderlo.

Espero que ahora lo hayas entendido de verdad, de veras.


Strength is irrelevant. Resistance is future. We wish to improve ourselves.

La fuerza es irrelevante. La resistencia es futuro. Queremos mejorarnos.

Imagen de Arkanist

Perdona la ingorancia pero dudo...

menu = not menu

Exactamente hace que menu sea falso o sea nil? 

O hace otra cosa?

Saludos.

Imagen de ZYX3D

Operador de negación

El operador de negación not X devuelve el valor booleano opuesto a cómo evalúe X.
Nil y false evalúan ambos como false; cualquier otra cosa, como true. Así, si menu tiene algún valor distinto a false (es 1, es true, es una tabla...), not menu devuelve false. Si menu es false o nil, devuelve true.
A efectos prácticos, si consideramos que un booleano es un "interruptor" que está encendido o apagado, hacerle un not significa "ponerlo del otro modo en que esté". Como un botón de pausa: si está pausado, se reproduce; si está reproduciendo, pausa :).


Strength is irrelevant. Resistance is future. We wish to improve ourselves.

La fuerza es irrelevante. La resistencia es futuro. Queremos mejorarnos.

Imagen de Arkanist

Ok Gracias por la aclaración.

Not lo que hace es lo que dice la palabra, Que X NO sea X, darle el valor contrario.

Por cierto, tu has programado algun homebrew para la PSP en Lua? Porqué eres de los pocos que veo que si ENTIENDE de programación Lua.

Saludos :).

Imagen de Guillermo_Cornielle

Te entendi

Desde el primer mensaje te entendi perfectamente, si he visto el setmetatable, en algunos codigos, lo que hace es establecer la metatabla dada, no le se usar ni lo he usado.

Lo de Oldpad, muchos creen que oldpad es una funcion dle LuaPlyer y no es asi, es solo una variable, se puede usar cualquiero otro nombre como previouspad, antpad o lo que sea.

No se a que te refieres con lo de X, pero si es por el ejemplo, pues es solo un ejemplo, solo quize darle una idea de lo que tenia que hacer.

Otra cosa, no se si es cosa mia o que pero creo que te sientes molesto, disculpame si te hice algo pero yo solo queria ayudar, ahora bien si te molesta pues no me hace sentir mal que me lo digas.

Se que no soy el mejor y ni quiero sentirme el mejor, peor no se por que te pones asi si yo nisiquiera te he dicho nada para molestarte.

Un saludo.


Manual del Perfecto Votante Para un voto libre y justo!.

TheGCProjects

Imagen de P22

Vaya, eso es muy sencillo,

Vaya, eso es muy sencillo, una variable cualquiera y un valor. Si es un valor es el juego, si es otro es pausa.

saludos

Imagen de P22

Ese ultimo comentario de

Ese ultimo comentario de pspgorrister no lo entendi asi que , os muestro un codigo pequeño para que lo adapte a su juego y ya.

negro = Color.new(0,0,0,25)

imagenmenup = Image.load("menupausaimagen.png")

menupausa = false

oldpad = Controls.read()

...

while true do

screen:clear()

pad = Controls.read()

...

if pad:select() and oldpad:select() ~= pad:select() then

   menupausa = true

end

if menupausa = true then

   screen:clear(negro)

   Image:load("x,y,imagenmenup")

end

...

Screen.waitVblankStart()

  oldpad=pad

end

-----------------------------------------------

Y bueno seria asi, y si hay algun error que alguien me lo dige porque llevo sin programar desde septiempbre.

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 el__QAT

Pss..

Me ha funcionado excepto que:

- No me muestra transparencia (uso LuaHM7 no se si eso importe).

- Si lo pongo con pad:start() and oldpad:star() ~=pad:start() solo me aparece el menú por micras de segundo se borra.

- Si lo pongo solo pad:start() then me lo muestra solo si lo tengo presionado.

Lo que necesito es una funcion para los botones que me lo muestre y se quede asi.


Tutorial: Fabricando nuestro propio micrófono para la PSP.

Exclusivo de PSP.Scenebeta.com

Imagen de Arkanist

Quizas lo que haces mal es...

Que haces,

Cuando se pulse ese boton, imprime esta imagen.

Tienes que activar el menú y desactivarlo mediante una boolean.

Menu = false.

Cuando se pulse ese boton i menu sea false then menu = true, sinó, menu = false.

si menu = true, imprime tal imagen.

Espero que lo hayas entendido así y haber si este es el problema, sinó dimelo.

Imagen de el__QAT

Pss...

Ya lo he hecho:

Tengo una que es:

menupausa = false

Y los controles están así:

--Pause--
if pad:start() and menupausa == false then
menupausa = true
end

if menupausa == true then
screen:clear()
screen:blit(0,0,pausa)
end

if menupausa == true and pad:start() then
menupausa = false
end

Pero solo me muestra el menu si tengo presionada la tecla..

Vi en los foros de prgramación de Dark_AleX que poniendo:

if pad:start() and pad~=prevpad then

Debería de funcioner pero no me sirve. 


Tutorial: Fabricando nuestro propio micrófono para la PSP.

Exclusivo de PSP.Scenebeta.com

Imagen de pspgorrister

Divide y vencerás

Lo que entreveo por el trozo ese de código es que estás creando un "megabucle" con todo el código en un bucle principal.

No sería mejor una especie de:

if pad:start() then

   MiFuncionDePausa()

end

 

Y luego en tu función de pausa haces lo de mostrar la imagen y otro bucle que esté leyendo las teclas hasta que se vuelva pulsar start (o la tecla que tu quieras para salir de la pausa).

De esta forma no tienes que usar ninguna variable y tu código ganará en legibilidad. Es bueno dividir el código en funciones.

No sé si me entiendes lo que quiero decir... Smile


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de el__QAT

Mmm..

Ya he creado mi función y pongo el código tal y como me lo dices y me va igual.

Imagen de pspgorrister

Re:

A lo mejor es porque el valor de la tecla sigue siendo el valor "start" y en la primera comparación se sale. Prueba a resetearlo primero y luego hacer la comparación en un bucle. Una cosa estilo:

pad = 0 

while not pad:start() do

   pad =  Controls.read()

end  

 

 

 

 


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Yo aocustumbro a usar el

Yo aocustumbro a usar el ~=prevpad que aunke viene a ser lo mismo k lo de oldpad, es mas sencillo y me funciona bien (en el bucle principal has de añadir prevpad = pad para k vaya bien).

Por cierto, no se si te ekivocaste al escribir, pero revisa el codigo de antes porke pusiste  pad:start() and oldpad:STAR() ~=pad:start()

Imagen de el__QAT

Si..

Descuida lo escribi en el editor de scenebeta y me equivoque. ;)

Imagen de Arkanist

Prueba...

If pausa == true then

 repeat

screen:blit (imagen)

until pad:start()

Saludos.

Imagen de el__QAT

Mmm..

Ya lo he probado y me va igual, tengo que mantener pulsado para que aparezca :S

Un saludo!

 

Viendo aquí en beta he encontrado esto pero no le entiendo muy bien. Y me pregunto si ahí hay algo que me sirva y si me lo pueden esxplicar mejor ;)


Tutorial: Fabricando nuestro propio micrófono para la PSP.

Exclusivo de PSP.Scenebeta.com

Imagen de P22

eso seria muy complicado y

eso seria muy complicado y no mereceria la pena porque se ralentizaria mucho cuando capturas, mejor haz lo que te dije yo que lo he usado y funciona.

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 pspgorrister

¿Te refieres a no usar un buffer?

¿Entonces cómo restauras los colores de la pantalla?

Y ya no sólo los colores, sinó el contenido que hay debajo del menú pausa

PD: Cuando digo buffer, lo hago en el sentido genérico, supongo que Lua tendrá alguna método "tipo flip" que automatice eso.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de el__QAT

Mmm..

¿Qu no haý funciones de pausa dedicadas a eso?

Imagen de Arkanist

Que función quiere decir?

La única funcion que recuerdo del lua HM para pausar un juego es esa  de Screen.vwait o algo así, pero él juego estaría pausado, no podrías hacer nada mas.

ejemplo:

if pad:cross() then

 repeat

la funcion de pausa

until pad:circle()

 Saludos.

Tambíen puedes hacer que cuando pulses tal boton pase una variable de false a true.

if pause == false then

juego()

else

pausa()

end

pudes hacer qu eal presior

pudes hacer qu eal presior start haga una capura añadiendo menu pausa

mmm...

Yo no se como va eso pero...

de que va el juego???

esta chuloo???

lo vas a temrinar pronto???

ocupa mucho???

xD

Imagen de Arkanist

Por la imagen que puso...

Creo que se ve claro que es el ahorcado xD.

Imagen de P22

otro metodoes poner un

otro metodoes poner un screen:clear(negro)

teniendo en cuenta que negro = Color.new(0,0,0,50) El 4º valor es alpha.

Saludos

Imagen de el__QAT

Mmm..

Bien probare con eso ;)

Imagen de pspgorrister

Re

Yo no conozco las funciones Lua, así que no sabía que el clear admitía canal alfa, entonces te ahorras una imagen, al final quedaría así

  1. Guardar el estado actual de la pantalla en un buffer.
  2. screen:clear(color) ---> Como ha dicho P22
  3. Mostrar el "menú pausa"
  4. Restaurar el buffer al acabar.

 


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de pspgorrister

Menu

Tienes que crearte una imagen oscura (con un sólo color) del tamaño de la pantalla y darle un canal alfa de transparecia un poco opaco.

Luego:

  1. Guardar el estado actual de la pantalla en un buffer.
  2. Mostrar esa imagen que oscurecerá la pantalla.
  3. Mostrar el "menú pausa"
  4. Restaurar el buffer al acabar.

 


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

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.