Discussion:
[pygame] mantener tecla pulsada
Christian Guarrera
2012-07-07 21:59:03 UTC
Permalink
Hola a todos,
estoy empezando a ver algo de pygame y no logro hacer que al presionar
una tecla y dejarla apretada continue con el evento,
por ejemplo:


if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
r1.move_ip(-1,0)
if event.key == pygame.K_RIGHT:
r1.move_ip(1,0)
if event.key == pygame.K_UP:
r1.move_ip(0,-1)
if event.key == pygame.K_DOWN:
r1.move_ip(0,1)


todo esto dentro de:
for event in pygame.event.get():

alguien sabe de que manera puedo solucionarlo?

Saludos!
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
Angel Java Lopez
2012-07-07 22:05:44 UTC
Permalink
Hmmmm.. aclaro que no se nada de Pygame ;-)

pero encontre
http://www.pygame.org/docs/ref/key.html#pygame.key.set_repeat

*pygame.key.set_repeat*
*control how held keys are repeated*
pygame.key.set_repeat(): return None
pygame.key.set_repeat(delay, interval): return None

When the keyboard repeat is enabled, keys that are held down will
generate multiple pygame.KEYDOWN events. The delay is the number of
milliseconds before the first repeated pygame.KEYDOWN will be sent.
After that another pygame.KEYDOWN will be sent every interval
milliseconds. If no arguments are passed the key repeat is disabled.

When pygame is initialized the key repeat is disabled.
Post by Christian Guarrera
Hola a todos,
estoy empezando a ver algo de pygame y no logro hacer que al presionar
una tecla y dejarla apretada continue con el evento,
r1.move_ip(-1,0)
r1.move_ip(1,0)
r1.move_ip(0,-1)
r1.move_ip(0,1)
alguien sabe de que manera puedo solucionarlo?
Saludos!
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
Matías Bellone
2012-07-07 22:16:48 UTC
Permalink
Post by Angel Java Lopez
Post by Christian Guarrera
Hola a todos,
estoy empezando a ver algo de pygame y no logro hacer que al presionar
una tecla y dejarla apretada continue con el evento,
r1.move_ip(-1,0)
r1.move_ip(1,0)
r1.move_ip(0,-1)
r1.move_ip(0,1)
alguien sabe de que manera puedo solucionarlo?
Hmmmm.. aclaro que no se nada de Pygame ;-)
pero encontre
http://www.pygame.org/docs/ref/key.html#pygame.key.set_repeat
Yo tampoco sé nada de pygame pero pensaba en algo distinto, que está
descripto en los comentarios de ese mismo método: las teclas cambian
el estado del objeto (r1 en este caso), y en cada ciclo del juego el
objeto se actualiza sólo según su estado.

Esto, además, evita el problema que - aparentemente - tiene
set_repeat: sólo genera los eventos para un tecla, aún cuando haya
varias presionadas (por lo que no vas a poder - por ejemplo - simular
movimiento en diagonal o moverte y disparar al mismo tiempo).

En uno de los comentarios lo muestran como:

if e.type == KEYDOWN:
if e.key == K_LEFT:
ship.xspeed -= SPEED
elif e.key == K_RIGHT:
ship.xspeed += SPEED
elif e.key == K_UP:
ship.yspeed -= SPEED
elif e.key == K_DOWN:
ship.yspeed += SPEED
elif e.key == K_SPACE
ship.firing = True
elif e.type == KEYUP:
if e.key == K_LEFT:
ship.xspeed += SPEED
elif e.key == K_RIGHT:
ship.xspeed -= SPEED
elif e.key == K_UP:
ship.yspeed += SPEED
elif e.key == K_DOWN:
ship.yspeed -= SPEED
elif e.key == K_SPACE:
ship.firing == False
# y fuera del get event.get hacés que ship se mueva antes de
actualizar el display

Saludos,
Toote
--
Web: http://www.enespanol.com.ar
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
Christian Guarrera
2012-07-07 22:22:07 UTC
Permalink
Post by Matías Bellone
Post by Angel Java Lopez
Post by Christian Guarrera
Hola a todos,
estoy empezando a ver algo de pygame y no logro hacer que al presionar
una tecla y dejarla apretada continue con el evento,
r1.move_ip(-1,0)
r1.move_ip(1,0)
r1.move_ip(0,-1)
r1.move_ip(0,1)
alguien sabe de que manera puedo solucionarlo?
Hmmmm.. aclaro que no se nada de Pygame ;-)
pero encontre
http://www.pygame.org/docs/ref/key.html#pygame.key.set_repeat
Yo tampoco sé nada de pygame pero pensaba en algo distinto, que está
descripto en los comentarios de ese mismo método: las teclas cambian
el estado del objeto (r1 en este caso), y en cada ciclo del juego el
objeto se actualiza sólo según su estado.
Esto, además, evita el problema que - aparentemente - tiene
set_repeat: sólo genera los eventos para un tecla, aún cuando haya
varias presionadas (por lo que no vas a poder - por ejemplo - simular
movimiento en diagonal o moverte y disparar al mismo tiempo).
ship.xspeed -= SPEED
ship.xspeed += SPEED
ship.yspeed -= SPEED
ship.yspeed += SPEED
elif e.key == K_SPACE
ship.firing = True
ship.xspeed += SPEED
ship.xspeed -= SPEED
ship.yspeed += SPEED
ship.yspeed -= SPEED
ship.firing == False
# y fuera del get event.get hacés que ship se mueva antes de
actualizar el display
Saludos,
Toote
--
Web: http://www.enespanol.com.ar
voy a tener en cuenta esto,
despues les comento,

saludos!
Post by Matías Bellone
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
Julian Agustin Cardonnet
2012-07-09 15:41:51 UTC
Permalink
Hola,
Si mal no recuerdo te conviene no tocar el set_repeat, aunque ahora no me
viene a la mente cual fue el problema por querer resolver por ese lado el
asunto de los controles.

La solución que encontré fue en vez de tratar de responder al evento
KEY_DOWN, simplemente en cada 'tick' del gameloop
fijarme que teclas están pulsadas y actuar en consecuencia.

Queda algo parecido a esto:

def updatePlayer(self):
keys=pygame.key.get_pressed()
if keys[pygame.K_a]:
self.xPos=-self.speed
if keys[pygame.K_d]:
self.xPos=self.speed
if keys[pygame.K_w]:
self.yPos=-self.speed
if keys[pygame.K_s]:
self.yPos=self.speed

De paso, te comento otro "truquito" con el tema del teclado y los eventos.
Queria usar las teclas de funcion para activar/desactivar info de debug en
el HUD, pero si usaba el evento KEY_DOWN para hacer el toggle on/off lo que
sucedia era que se prendia y apagaba como mil veces por segundo (una por
cada evento!).
Lo que termine haciendo fue escuchar el evento KEY_UP en vez del down y asi
solo se dispara cuando el humano realmente levanta el dedo de la tecla.

Espero que te sirva.

Saludos
Julian

Christian Guarrera
2012-07-07 22:19:25 UTC
Permalink
gracias angel,

tenia que poner
pygame.key.set_repeat(1, 1)
antes del while donde se capturan los eventos!

saludos!
Post by Angel Java Lopez
Hmmmm.. aclaro que no se nada de Pygame ;-)
pero encontre
http://www.pygame.org/docs/ref/key.html#pygame.key.set_repeat
pygame.key.set_repeat
control how held keys are repeated
pygame.key.set_repeat(): return None
pygame.key.set_repeat(delay, interval): return None
When the keyboard repeat is enabled, keys that are held down will generate
multiple pygame.KEYDOWN events. The delay is the number of milliseconds
before the first repeated pygame.KEYDOWN will be sent. After that another
pygame.KEYDOWN will be sent every interval milliseconds. If no arguments are
passed the key repeat is disabled.
When pygame is initialized the key repeat is disabled.
Post by Christian Guarrera
Hola a todos,
estoy empezando a ver algo de pygame y no logro hacer que al presionar
una tecla y dejarla apretada continue con el evento,
r1.move_ip(-1,0)
r1.move_ip(1,0)
r1.move_ip(0,-1)
r1.move_ip(0,1)
alguien sabe de que manera puedo solucionarlo?
Saludos!
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
http://listas.python.org.ar/listinfo/pyar
PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
pyar mailing list pyar-+ZN9ApsXKcFd+***@public.gmane.org
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
Continúe leyendo en narkive:
Loading...