Ayuda con eventos :( [RESUELTO]

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)

Buenas, @Pan!

Aunque podrías incluir ese método dentro de la clase del actor personalizado, tambien se puede hacer con un método totalmente independiente del actor:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

mono = pilas.actores.Mono()

def al_pulsar_tecla(tecla):
   if tecla.codigo == "z":
        if mono.espejado:
            mono.espejado=False
            mono.decir("Ahora estoy normal")
        else:
            mono.espejado=True
            mono.decir("Ahora estoy espejado")

pilas.eventos.pulsa_tecla.conectar(al_pulsar_tecla)

pilas.ejecutar()

En este post se especifican la mayoría de las teclas, por si quieres usar cualquier otra:

IZQUIERDA = 1
DERECHA = 2
ARRIBA = 3
ABAJO = 4
BOTON = 5
SELECCION = 6
ESPACIO = 32
CTRL = 17
ALTGR = 19
ALT = 18
SHIFT = 16
CAPSLOCK = 20

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:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

mono = pilas.actores.Mono()
aceitu = pilas.actores.Aceituna()

mono.x = 120
aceitu.x = -120

def dime_tecla(tecla):
    mono.decir(u"Codigo: "+str(tecla.codigo))
    try:
        aceitu.decir(u"Tecla: "+str(tecla.texto))    
    except UnicodeEncodeError:
        aceitu.decir(u"Tecla no reconocible ")
pilas.eventos.suelta_tecla.conectar(dime_tecla)

pilas.avisar(u"pulsa cualquier tecla para obtener su código")
pilas.ejecutar()

Un saludo! :wink:

1 me gusta

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)

Buenas, @Pan!

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”.

Un saludo! :wink:

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 :stuck_out_tongue:

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 :frowning:
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

Buenas, @Pan!

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 :joy:

Ahí te paso tu código un tanto rectificado, espero que te ayude! :wink:

# -*- 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.

1 me gusta

No me funciono :confused:
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)

Buenas, @Pan!

Disculpa por pasarte un código sin haberlo testado antes… :blush:

Las prisas nunca son buenas :grin:

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.

# -*- coding: utf-8 -*-
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.espejado:
				self.mono.espejado=False
				self.mono.decir("Normal")
			else:
				self.mono.espejado=True
				self.mono.decir("Espejado")	


pilas.escenas.vincular(EscenaJuego)

pilas.escenas.EscenaJuego()

pilas.ejecutar()

Un saludo! :wink:

1 me gusta

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 :smile:

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?

Un saludo! :wink:

Tenias razon, es mala idea hacer un espejado con la rotacion, pero la rotacion tiene una animacion de giro, en cambio el espejado no :confused:, 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)

Buenas, @Pan.

Este era el post original… lo recuerdas?

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.