Hola, necesito que al precionar por ejemplo la tecla “z” mi protagonista se espeje y que al volver a apretar la “z” se “desespeje”, intente hacerlo con eventos y no me funciono, por empezar nose como hacer que detecte que letra quiero asignarle al evento, osea la “z” y tampoco se como hacer que cuando la tecla se vuelva a precionar el protagonista se desepeje, aunque creo que con una variable global es posible, de ser que conozcan una mejor manera me gustaria que me la digan ^-^, tambien como hacer que detecte la letra especifica… Gracias por leer!
Aqui les dejo lo que tengo:
def hab_espejo(evento):
self.receptor.espejado=True
pilas.eventos.pulsa_tecla.conectar(hab_espejo)
F1 = ‘F1’
F2 = ‘F2’
F3 = ‘F3’
F4 = ‘F4’
F5 = ‘F5’
F6 = ‘F6’
F7 = ‘F7’
F8 = ‘F8’
F9 = ‘F9’
F10 = ‘F10’
F11 = ‘F11’
F12 = ‘F12’
a = ‘a’
b = ‘b’
c = ‘c’
d = ‘d’
e = ‘e’
f = ‘f’
g = ‘g’
h = ‘h’
i = ‘i’
j = ‘j’
k = ‘k’
l = ‘l’
m = ‘m’
n = ‘n’
o = ‘o’
p = ‘p’
q = ‘q’
r = ‘r’
s = ‘s’
t = ‘t’
u = ‘u’
v = ‘v’
w = ‘w’
x = ‘x’
y = ‘y’
z = ‘z’
Y adjunto demo para averiguar todas las teclas de tu teclado, por si la que quieres usar no está definida en el post anterior:
Gracias, funciono, pero… lo que quiero hacer ahora es que al pulsar la p salga la escena de pausa, eso me funciona pero quiero que funcione en la escena de juego en especifico
Esto seria lo que tengo pero no funiona :C
class EscenaJuego(pilasengine.escenas.Escena):
def iniciar(self):
self.pilas.fondos.Galaxia()
def al_pulsar_tecla(tecla):
if tecla.codigo == “p”:
pilas.escenas.EscenaPausa()
pilas.eventos.pulsa_tecla.conectar(al_pulsar_tecla)
Ese código está sin identar y por tanto no veo si la def al_pulsar_tecla está dentro de la def iniciar().
Si está dentro deberias sacarla fuera, al mismo nivel que la def iniciar().
Otra cosa es que tampoco veo si tienes una “EscenaPausa” definida. Si la tienes definida debería funcionarte.
Otra cosa (una más) es que aunque hagas una “escena pausa” el juego realmente no va a pausarse a no ser que guardes todos los valores previamente (actores en escena, posiciones, etc…), ya que al volver a la escena del juego todos los valores van a reiniciarse.
Si lo que quieres es que el juego se pause momentaneamente, siempre puedes usar el atajo de teclado “ALT + p”.
Sabes alguna manera de comparar si la escena actual es igual a tal escena?
Esto proximo es lo que se me ocurrio pero no funciono
def al_pulsar_tecla(tecla):
if pilas.escena_actual == pilas.escenas.EscenaJuego:
if tecla.codigo == "p":
pilas.avisar("La pausa se hara dentro de 3 segundos.")
pilas.eventos.pulsa_tecla.conectar(al_pulsar_tecla)
No me funciono
Me dice que la variable global no existe, aca te paso mi codigo para ver si puedes encontrar el error, y muchas gracias por estando ayudandome ^^
class EscenaJuego(pilasengine.escenas.Escena):
def iniciar(self):
self.pilas.fondos.Galaxia()
nave1 = pilas.actores.Nave1()
pilas.escenas.EscenaMenu()
def al_pulsar_tecla(tecla):
if tecla.codigo == "f":
if nave1.espejado:
nave1.espejado=False
else:
nave1.espejado=True
pilas.eventos.pulsa_tecla.conectar(al_pulsar_tecla)
La clase “Nave1” no vi necesario escribirla aqui pero si es necesario digame
El principal problema que veo es que has escrito la def al_pulsar_tecla fuera de la escena de juego. Ahora entiendo tu preocupación por saber en qué escena se estaba pulsando la tecla
Ahí te paso tu código un tanto rectificado, espero que te ayude!
# -*- coding: utf-8 -*-
import pilasengine
pilas = pilasengine.iniciar()
class EscenaJuego(pilasengine.escenas.Escena):
def iniciar(self):
self.mifondo = pilas.fondos.Galaxia()
self.nave1 = pilas.actores.Nave1()
def al_pulsar_tecla(tecla):
if tecla.codigo == "f":
if self.nave1.espejado:
self.nave1.espejado=False
else:
self.nave1.espejado=True
def actualizar(self):
pass
pilas.eventos.pulsa_tecla.conectar(al_pulsar_tecla)
class EscenaMenu(pilasengine.escenas.Escena):
def iniciar(self):
Tu código aquí
def actualizar(self):
Tu código aquí
pilas.escenas.vincular(EscenaJuego)
pilas.escenas.vincular(EscenaMenu)
pilas.escenas.EscenaMenu()
pilas.ejecutar()
PD: para identar bien tu código debes poner 3 tildes invertidas ANTES Y DESPUES de tu código. Mira este post:
Y te recomiendo seguir mi tutorial para creación de escenas y menús.
No me funciono
cuando apreto la “f” no pasa absolutamente nada :cc
Cambie un poco el codigo para ver si lo que fallaba era el espejado y aun asi sigue sin funcionar
class EscenaJuego(pilasengine.escenas.Escena):
def iniciar(self):
self.pilas.fondos.Galaxia()
nave1 = pilas.actores.Nave1()
def al_pulsar_tecla(tecla):
if tecla.codigo == "f":
pilas.avisar("Test.")
pilas.eventos.pulsa_tecla.conectar(al_pulsar_tecla)
Disculpa por pasarte un código sin haberlo testado antes…
Las prisas nunca son buenas
Este código sí es correcto, lo he testado y funciona perfectamente. Fíjate en los “self” y en que el “pulsa.tecla.conectar” está incluido en la def iniciar() de la escena.
Muchas gracias me funciono, pero el espejado no funciona porque mi protagonista tiene una rotacion, se me ocurrio cambiar la rotacion pero no me funciona (si funciona pero a la tercera vez al apretar la tecla, es medio raro, y la textura se bugea mientras rota), si puede encontrar el problema me ayudaria
import pilasengine
pilas = pilasengine.iniciar()
class EscenaJuego(pilasengine.escenas.Escena):
def iniciar(self):
self.mono = pilas.actores.Mono()
self.mifondo = pilas.fondos.Espacio()
pilas.eventos.pulsa_tecla.conectar(self.al_pulsar_tecla)
def al_pulsar_tecla(self, tecla):
pilas.avisar(str(tecla.codigo))
if tecla.codigo=="f":
if self.mono.rotacion==-90:
self.mono.espejado=[90]
self.mono.decir("Normal")
else:
self.mono.rotacion=[-90]
self.mono.decir("Espejado")
pilas.escenas.vincular(EscenaJuego)
pilas.escenas.EscenaJuego()
pilas.ejecutar()
Sin haberlo testado… No crees que “espejado” es un valor booleano y que por tanto no admite otro parámetro que no sea “True” o “False” ???
Creo que podrías “simular” un espejado dándole el ángulo de rotación, tal y como lo estás intentando, pero sin duda darle un valor integer a un booleano es mala idea
Prueba así (insisto en decirte que no lo he testado):
if self.mono.rotacion==-90:
self.mono.rotacion=[90]
self.mono.decir("Normal")
else:
self.mono.rotacion=[-90]
self.mono.decir("Espejado")
y dinos si te funciono, ok?
Otra cosa es que me parece que si el mono está a mitad de la rotación su ángulo de rotación aún no será == 90, sinó 75, o -20, por lo que si vuelves a pulsar la tecla antes de acabar la rotación la condición del if no se cumplirá y entrará en el else, lo que le llevará de nuevo a -90… Eso lo vuelve todo un tanto inestable, no crees?
Tenias razon, es mala idea hacer un espejado con la rotacion, pero la rotacion tiene una animacion de giro, en cambio el espejado no , ahora el problema que tengo es que cuando la nave esta mirando por ejemplo para la izquierda, las balas salen a la derecha, lo que queria hacer es que la horientacion de la nave cambie y asi puede disparar hacia atras y hacia adelante, y no se me ocurre como hacerlo :c si quieres dime y te paso todo el codigo de mi juego por privado (quiero sacarlo a la luz cuando este terminado)
Creo que ese tema se ha respondido ya con toda clase de detalles.
Por favor, abre un post nuevo para nuevas dudas, ya que de esta forma lo único que se consigue es un amasijo de información que después va a costar de encontrar a otros usuarios.
Lo que no entiendo es eso de que “cuando la nave mira a la derecha las balas salen por la izquierda”. Si tienes una nave que mira a la derecha y dispara hacia delante, y la rotas… las balas siguen saliendo por la parte delantera de la nave, que al haber rotado ahora estarà hacia atrás y por tanto disparará a la izquierda!
Si lo que quieres es que un actor haga una rotación al pulsar una tecla y cambie su ángulo de tiro no le veo tanta dificultad. Simplemente crea una función en la que el actor aprenda (de nuevo) a disparar con el nuevo ángulo de tiro y llámala dentro de los if y else de la rotación.
Tambien cambiaría el else por un else if, porque sinó te va a dar siempre problemas:
if self.mono.rotacion==-90:
self.mono.rotacion=[90]
self.mono.decir("Normal")
#(Aquí llamas a la funcion donde tengas programado el "aprender.disparar" con el ángulo 1)
elif self.mono.rotacion==90:
self.mono.rotacion=[-90]
self.mono.decir("Espejado")
#(Aquí llamas a la funcion donde tengas programado el "aprender.disparar" con el ángulo 2)
else:
self.mono.decir(u"Aún estoy rotando!")
Un saludo.
PD: NO VOY A RESPONDER NUEVAS DUDAS EN ESTE POST, A NO SER QUE TENGAN QUE VER DIRECTAMENTE CON LA PREGUNTA ORIGINAL. Gracias por tu comprensión.