Pygame- ventana y clase de sprite – python

Estoy tratando de construir una clase de ventana que se asemeja a una clase en la que viven los sprites. En la clase de ventana quiero tener las siguientes cosas:

  • Definir fondo()
  • set_size ()
  • add_sprite ()
  • remove_sprite ()

En la clase de sprites quiero los siguientes métodos:

  • draw_sprite ()

Por ahora tendré un sprite, pero eventualmente me gustaría tener una lista de sprites.

He intentado ejecutar lo que tengo en una clase principal llamando a estos métodos en sus instancias.

window = Window(200,200) sprite = Sprite(Window) window.set_Background() sprite.draw_sprite() 

Aquí está mi código:

Clase de Sprite:

 import pygame pygame.init() class Sprite(object): def __init__(self, World =None, sprite=[]): self.Window = window def draw_sprite(self,sprite,x,y): sprite=pygame.image.load(sprite) self.World.window.blit(sprite,(x,y)) pygame.display.update() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() 

Clase de ventana

 import pygame,sys,os from pygame.locals import * from Window import * class Panel: def __init__(self, width=None,height=None): self.width= width self.height = height self.foreground=pygame.Surface((width, height)) self.background= pygame.Surface((width, height)) self.rect= self.foreground.get_rect() def clear(self): self.foreground.blit(self.background,(0,0)) def set_background(self, image=None): if sky is not None: bg = Window.draw_world(self,image) self.background.blit(bg,(width,height)) class Window(Panel): pygame.init() def __init__(self,width,height): self.window = pygame.display.set_mode((width,height)) self.width=width self.height=height Panel.__init__(self, width, height) self._foreground = self.window self.set_background() def draw_world(self,image): image=pygame.image.load(image) for x in range(0,(290/image.get_width()+1)): for y in range(0,(230/image.get_height()+1)): self.background.blit(image,(x*200,y*200)) pygame.display.update() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() def window_setSize(width,height): self.width=width self.heght =height 

clase principal:

 from Sprite import * from window import * sprite = Sprite() window=Window() sprite.draw_sprite("sprite.png",100,200) window.set_background("bg.png") 

¿Alguien tiene alguna idea de por qué se está mostrando el sprite pero mi fondo no? Solo muestra un fondo negro.

Estoy usando python 3 y pygame 3.3 Gracias

Tienes un bucle de eventos en draw_sprite() por lo que se está ejecutando hasta el final del juego y window.set_background nunca se ejecuta.

Su código es incorrecto construido.

Intento corregirlo y enviar el código más tarde.


por cierto: ver: pygame.sprite.Sprite .


EDITAR:

Ejemplo simple de cómo organizar el código.

Ahora está en un archivo. En Pygame siempre hay una ventana, por lo que no es necesario hacer Panel + Widnow. Tienes un bucle de evento en run() . Todo el código está dentro de la ventana (crear Sprite, cambiar el fondo, dibujar, etc.).

Agrego sprites a la lista (python) y dibujo todos los sprites de la lista; el jugador es una excepción, así que solo puedo eliminar el último sprite de la lista: / Si necesita algo mejor, vea pygame.sprite.Sprite () y pygame.sprite.Group ( ) .

Usa las Arrows para mover la bola roja, Space para pausar el juego, ESC para salir.

Al final adjunté mis bitmaps.

 import pygame #from pygame.locals import * #-------------------------------------------------------------------- # class for single sprite #-------------------------------------------------------------------- class MySprite(): def __init__(self, image, x, y): self.image = pygame.image.load(image) image_rect = self.image.get_rect() # Rect class to use "Sprite collision detect" - in the future # In rect you have sprite position and size # You can use self.rect.x, self.rect.y, self.rect.width, self.rect.height # and self.rect.center, self.rect.centerx, self.rect.top, self.rect.bottomright etc. self.rect = pygame.rect.Rect(x, y, image_rect.width, image_rect.height) def draw(self, screen): screen.blit(self.image, self.rect) #-------------------------------------------------------------------- # class for player #-------------------------------------------------------------------- class MyPlayer(MySprite): def __init__(self, image, x, y): # parent constructor always as a first in __init__ MySprite.__init__(self, image, x, y) self.speed_x = self.speed_y = 0 #----------------------------- def set_speed(self, x, y): self.speed_x = x self.speed_y = y #----------------------------- def update(self): self.rect.x += self.speed_x self.rect.y += self.speed_y if self.rect.centerx < 0 : self.rect.centerx = 800 elif self.rect.centerx > 800 : self.rect.centerx = 0 if self.rect.centery < 0 : self.rect.centery = 600 elif self.rect.centery > 600 : self.rect.centery = 0 #-------------------------------------------------------------------- class Window(): def __init__(self, width, height): #-------------------- self.rect = pygame.Rect(0, 0, width, height) # or self.width, self.height = width, height #-------------------- pygame.init() # most users and tutorials call it "screen" self.screen = pygame.display.set_mode(self.rect.size) ############################################################# self.foreground = None self.background = None self.set_background("background.jpg") self.set_foreground("ball3.png") ################################################# self.player = MyPlayer("ball1.png", 100, 200) self.sprites_list = [] self.add_sprite(MySprite("ball2.png", 100, 400)) self.add_sprite(MySprite("ball2.png", 300, 500)) self.add_sprite(MySprite("ball2.png", 300, 200)) self.remove_last_sprite() #----------------------------- # red text "PAUSE" font = pygame.font.SysFont("", 72) self.text_pause = font.render("PAUSE", True, (255, 0, 0)) # center text on screen screen_center = self.screen.get_rect().center self.text_pause_rect = self.text_pause.get_rect(center=screen_center) #-------------------------- def add_sprite(self, sprite): self.sprites_list.append(sprite) #-------------------------- def remove_last_sprite(self): if self.sprites_list: del self.sprites_list[-1] #-------------------------- def draw_sprites(self, screen): for sprite in self.sprites_list: sprite.draw(screen) #-------------------------- def draw_background(self, screen): screen.fill((0,64,0)) # clear screen to green if self.background: screen.blit(self.background, (0,0)) #-------------------------- def draw_foreground(self, screen): if self.foreground: screen.blit(self.foreground, (0,0)) #-------------------------- def draw_world(self, image): temp = pygame.Surface(self.rect.size, pygame.SRCALPHA, 32).convert_alpha() image_rect = image.get_rect() for x in range(0, self.rect.width, 60): for y in range(0,self.rect.width, 60): temp.blit(image,(x,y)) return temp #-------------------------- def set_foreground(self, image=None): if image: img = pygame.image.load(image) self.foreground = self.draw_world(img) #-------------------------- def set_background(self, image=None): if image: self.background = pygame.image.load(image) #-------------------------- def run(self): clock = pygame.time.Clock() RUNNING = True PAUSED = False while RUNNING: #--- events --- for event in pygame.event.get(): if event.type == pygame.QUIT: RUNNING = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: RUNNING = False elif event.key == pygame.K_SPACE: PAUSED = not PAUSED if event.key == pygame.K_UP: self.player.set_speed(0,-10) elif event.key == pygame.K_DOWN: self.player.set_speed(0,10) elif event.key == pygame.K_LEFT: self.player.set_speed(-10,0) elif event.key == pygame.K_RIGHT: self.player.set_speed(10,0) if event.type == pygame.KEYUP: if event.key in (pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT): self.player.set_speed(0,0) #--- changes ---- if not PAUSED: # change elements position self.player.update() #--- draws --- self.draw_background(self.screen) self.draw_foreground(self.screen) self.draw_sprites(self.screen) self.player.draw(self.screen) if PAUSED: # draw pause string self.screen.blit(self.text_pause, self.text_pause_rect.topleft) pygame.display.update() #--- FPS --- clock.tick(25) # 25 Frames Per Seconds #--- finish --- pygame.quit() #---------------------------------------------------------------------- Window(800,600).run() 

ball1.png introduzca la descripción de la imagen aquí ball2.png introduzca la descripción de la imagen aquí ball3.png introduzca la descripción de la imagen aquí

fondo.jpg introduzca la descripción de la imagen aquí

captura de pantalla introduzca la descripción de la imagen aquí