Un par de dudas con pygame.

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Un par de dudas con pygame.

Notapor Barajas » Lun Dic 13, 2010 1:43 am

Hola, buenas
El problema que tengo es con el pause.

Tengo entendido que en otros para pausar con un evento el pseudocódigo es algo como:

Código: Seleccionar todo
pause falso
while jugar:
    if evento y pasue falso:
        pause verdadero
    if evento y pause verdadero:
        pause falso
    if pause falso:
        actualizamos las posiciones de los sprites
    dibujamos los sprites


Pero cuando lo paso a pygame, no pasa nada XD, e aquí el código:

Código: Seleccionar todo
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import pygame
from pygame.locals import *
import sys
ALTO = 500
ANCHO = 650
class pelota(pygame.sprite.Sprite):
    "Initialpos = possiciones 'x' y 'y' iniciales"
    "medidas = ancho y alto"
    "change = cambio de possiciones 'x' y 'y'"
    "nombre de la imagen"
    def __init__(self, initialpos, medidas, change, imagen):
        (self.posx, self.posy)=initialpos
        (self.alto,self.ancho)=medidas
        (self.dx, self.dy)=change
        self.imagen = imagen
        pygame.sprite.Sprite.__init__(self)
        (self.image, self.rect) = self.load_image(self.imagen, True)
    def load_image(self, name, colorkey=False):
        fullname = os.path.join("datos", name)
        #comprobamos si existe la imagen
        try:
            image = pygame.image.load(fullname)
        except pygame.error, message:
            print 'No se puede cargar la imagen: ', fullname
            raise SystemExit, message
        #combierte la imagen para que pygame la pueda usar
        image = image.convert()
        #En este punto asignamos el colorkey
        if colorkey:
            colorkey = image.get_at((0, 0))
            image.set_colorkey(colorkey, RLEACCEL)
        #devuelve la imagen y la recta de la imagen
        return (image, image.get_rect())
    def change(self, dx, dy):
        #lo que crea una funcion que cambia la posicion
        self.posx=self.posx+dx
        self.posy=self.posy+dy
        #lo que hace que rebote la pelota
        if (self.posx >= self.ancho)or(self.posx <= 0):
            self.dx = -self.dx
        if (self.posy >= self.alto)or(self.posy<=0):
            self.dy = -self.dy
        return (self.posx,self.posy)
    def update(self):
        posicion=self.change(self.dx, self.dy)
        self.rect.center = posicion
       
def Main():
    pygame.init()
    #pygame.font.init()
    # creamos la ventana y le indicamos un titulo:
    size = (ALTO,ANCHO)
    screen = pygame.display.set_mode((ANCHO,ALTO))
    pygame.display.set_caption("Ejemplo")
    sprites = pygame.sprite.RenderClear()
    inicial = (0,0)
    cambio = (5,10)
    pygame.mouse.set_visible(True)
    pelotita = pelota(inicial,size,cambio,'pelota.png')
    sprites.add(pelotita)
    clock = pygame.time.Clock()
    # el bucle principal del juego
    Escojer=True
    pause = 0
    while Escojer:
        clock.tick(75)
        # Posibles entradas del teclado y mouse
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                Escojer=False
                sys.exit()
            elif event.type == KEYDOWN and event.key == K_ESCAPE:
                Escojer=False
        if event.type == MOUSEBUTTONDOWN:
            if ((event.button==1)and(pause==0)):
                pause=1
                print pause
            if ((event.button==1)and(pause==1)):
                pause=0
                print pause
        screen.fill((0,0,0))
        if pause==0:
            sprites.update()
        sprites.draw(screen)
        pygame.display.flip()
        pygame.time.delay(15)

if __name__ == "__main__":
    Main()


Y si se lo preguntaban ya e utilizado time.waith (creo que asi se escribe), pero no me da los resultados que espero XD
¿Alguien sabe como hacerlo? :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Un par de dudas con pygame.

Notapor Juanxo » Lun Dic 13, 2010 1:55 am

no estoy seguro, pero creo que si pulsas el boton de enmedio (la rueda), tu código funcionará!! MAGIA!!

por lo general los indices empiezan en 0, por lo que quizás debas comprobar que el botón es 0, no 1
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: Un par de dudas con pygame.

Notapor Barajas » Lun Dic 13, 2010 4:35 am

De hecho, cuando lo ejecuto, todo va de lo lindo, por eso, para asegurarme que el código se ejecutara en esa parte incluí que me imprimiera el valor de pause, pero, esta es la salida :arrow:

Código: Seleccionar todo
1
0
:!:

!!!Lo que quiere decir que por un clic realiza la comparación 2 veces!!! :shock:

Todo ocurre tan rápido que no lo vemos funcionar.
¿Por que sera que sucede eso? :?:

[edito]

:idea:

He modificado la sección de la comparación y funciona, solo con el problema que para pausar se presiona clic izquierdo, y sale del pause presionado la tecla p. :arrow:

Código: Seleccionar todo
        if event.type == MOUSEBUTTONDOWN:
            if ((event.button==1)and(pause==0)):
                pause=1
                print pause
        if event.type == KEYDOWN:
            if ((event.key == K_p)and(pause==1)):
                pause=0
                print pause


En ese caso la pregunta cambia a...
¿Como podemos pausar usando el mismo evento? :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Un par de dudas con pygame.

Notapor Juanxo » Lun Dic 13, 2010 9:43 am

jajajaj tonto de mi, por no acordarme de pygame

Espero que ahora te sea de más ayuda:

el problema radica en como lo controlas:

Código: Seleccionar todo
            if ((event.button==1)and(pause==0)):
                pause=1
                print pause
            if ((event.button==1)and(pause==1)):
                pause=0
                print pause


ejecuta esto mentalmente un momento:

- pause se inicializa 0, por lo que cuando pulses entrará en el primer if
- pause es 1
- en el segundo if, el botón sigue pulsado (no hemos cambiado de evento aún), pero como hemos cambiado el pause (ahora es 1), vuelve a entrar y lo pasa a 0.

Creo que te dejo a ti solucionarlo, ya que es tan tonto como evitar que entre a los dos a la vez
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado