https://foro.gambas-es.org/viewtopic.php?f=16&t=6892&p=41705#p41705
-----------------------------------
Shell
Lunes, 02 Abril 2018, 12:43

Re: [Python] Código Fuente De Los Libros Para PyGame
-----------------------------------
Como veis en este caso la variable que almacena la tecla pulsada es local a main.

[code linenumbers=false syntax=python]
def main():

    pygame.init()
    reloj = pygame.time.Clock()
    pygame.display.set_caption('Space Invaders')
    pantalla = pygame.display.set_mode((ANCHO_PANTALLA, ALTO_PANTALLA))

    caza_imagen = pygame.image.load('Imagenes/fighter.png').convert()
    caza_imagen.set_colorkey((BLANCO))
    caza_imagen_ancho = caza_imagen.get_width()
    caza_imagen_alto = caza_imagen.get_height()

    caza = Caza()

    while True:
        reloj.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        tecla_presionada = pygame.key.get_pressed()
..........


if __name__=='__main__': main()
[/code]

Al ser local la variable tecla_presionada, la clase Caza o Figther no la conoce.
Funciona si quitas ese bloque y lo dejas todo global.

En este código funciona, no esta comentado, pero las clases tienen una mejor organización.
Lo que hace es mover una imagen en la parte inferior de la ventana de izquierda a derecha.
Tampoco el programador tenía costumbre de usar constante y si números mágicos, aunque
luego en el libro explicaba el significado de esos números.

Fijaros que la tecla pulsada se le pasa al objeto tipo "caza" en su método mover, desde la clase Juego.

El movimiento no se encuentra en la parte de dibujar en la ventana, en este caso, mostrar frames.
En cambio se encuentra en la parte del código que se detecta los eventos.

[code linenumbers=false syntax=python]
#!/usr/bin/env python3

import pygame, sys
from pygame.locals import *

NEGRO = (0, 0, 0)
BLANCO = (255, 255, 255)
ANCHO_PANTALLA = 640
ALTO_PANTALLA = 650

class Caza:

    def __init__(self):
        self.x = 320
        self.caza_imagen = pygame.image.load('Imagenes/fighter.png').convert()
        self.caza_imagen.set_colorkey((BLANCO))
        self.caza_imagen_ancho = self.caza_imagen.get_width()
        self.caza_imagen_alto = self.caza_imagen.get_height()

    def mover(self, tecla_presionada):
        tecla_presionada = pygame.key.get_pressed()
        if tecla_presionada[K_LEFT] and self.x > 0:
            self.x -= 3
        elif tecla_presionada[K_RIGHT] and self.x < ANCHO_PANTALLA - self.caza_imagen_ancho:
            self.x += 3

    def dibujar(self, pantalla):
        pantalla.blit(self.caza_imagen,(self.x, ALTO_PANTALLA - self.caza_imagen_alto))

class Juego:

    def __init__(self):
        self.caza = Caza()        

    def proceso_eventos(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
               return True                          
        self.caza.mover(pygame.key.get_pressed())

        return False

    def mostrar_frames(self, pantalla):        
        pantalla.fill(NEGRO)      
        self.caza.dibujar(pantalla)
        pygame.display.update()

def main():

    pygame.init()
   
    pygame.display.set_caption('Space Invaders')
    pantalla = pygame.display.set_mode((ANCHO_PANTALLA, ALTO_PANTALLA))

    hecho = False
    reloj = pygame.time.Clock()

    juego = Juego()

    while not hecho:

        hecho = juego.proceso_eventos()        

        juego.mostrar_frames(pantalla)        

        reloj.tick(60)       


if __name__=='__main__': main()
[/code]

Este código lo pasaré a Gambas, pero en este cambia tanto para la clase Paint como el uso de SDL,
en el que ya usaría el evento Key_Press.

Saludos


