es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error en la recreación del juego Space Invader de TechWithTim: el argumento 1 debe ser pygame.Surface, no None.

He estado trabajando en un video tutorial para recrear un modelo de Space Invaders, pero me he encontrado con un pequeño problema que me tiene confundido. Estoy recibiendo un mensaje de error que dice “el argumento 1 debe ser pygame.Surface, no None” dentro del código para una clase base que va a ser heredada por otras clases. Dentro de la clase base establecemos img = None, y luego otras clases heredan y llenan self.img con una imagen correcta para ellas.

Aquí abajo se encuentra una vista de la clase base Ship que he escrito. El error viene de la línea que dice: window.blit(self.ship_img, (self.x, self.y))

class Ship():
  COOLDOWN = 30 

  def __init__(self, x, y, health=100):
    self.x = x 
    self.y = y 
    self.health = health 
    self.ship_img = None 
    self.laser_img = None 
    self.lasers = []
    self.laser_cool_down = 0

  def draw(self, window):
    window.blit(self.ship_img, (self.x, self.y))
    for laser in self.lasers: 
        laser.draw(window)

def move_lasers(self, speed, obj):
    self.cooldown()
    for laser in self.lasers:
        laser.move(speed)
        if laser.off_screen(height):
            self.lasers.remove(laser)
        elif laser.collision(obj): # comprobar colisión con el jugador
            obj.health -= 10 
            self.laser.remove(laser)


  def cooldown(self):
    if self.laser_cool_down >= self.COOLDOWN:
        self.laser_cool_down = 0 
    elif self.laser_cool_down > 0:
        self.laser_cool_down += 1 


  def shoot(self):
    if self.laser_cool_down == 0: 
        laser = Laser(self.x, self.y, self.laser_img)
        self.lasers.append(laser)
        self.laser_cool_down = 1 



  def get_width(self):
    return self.ship_img.get_width()
  def get_height(self):
    return self.ship_img.get_height()
Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “el argumento 1 debe ser pygame.Surface, no None” se produce porque el atributo ship_img de la clase Ship se establece en None de forma predeterminada. Para corregir este error, es necesario asegurarse de que el atributo ship_img se establezca en un objeto válido de pygame.Surface antes de llamar a window.blit en él.

    Para hacer esto, puede pasar un objeto de pygame.Surface como argumento al crear el objeto Ship, o puede establecer el atributo ship_img en un objeto válido de pygame.Surface dentro del método de inicialización de la clase Ship.

    Aquí hay un ejemplo de cómo puede hacerlo dentro del método __init__ de la clase Ship:

    class Ship():
      COOLDOWN = 30 
    
      def __init__(self, x, y, health=100, ship_img=None):
        self.x = x 
        self.y = y 
        self.health = health 
        self.ship_img = ship_img
        self.laser_img = None 
        self.lasers = []
        self.laser_cool_down = 0
    
      ...
    
    ship_image = pygame.image.load("path/to/ship/image.png")
    my_ship = Ship(0, 0, ship_img=ship_image)
    

    Con esta modificación, puede pasar un argumento ship_img al método de inicialización de la clase Ship que sea un objeto válido de pygame.Surface.

    Otra opción es establecer el atributo ship_img dentro del método __init__ de la clase Ship, de la siguiente manera:

    class Ship():
      COOLDOWN = 30 
    
      def __init__(self, x, y, health=100):
        self.x = x 
        self.y = y 
        self.health = health 
        self.ship_img = pygame.image.load("path/to/ship/image.png")
        self.laser_img = None 
        self.lasers = []
        self.laser_cool_down = 0
    
      ...
    
    my_ship = Ship(0, 0)
    

    Con esta modificación, el atributo ship_img se establece en un objeto válido de pygame.Surface dentro del método __init__ de la clase Ship. De esta manera, no es necesario pasar un argumento separado para la imagen del barco al crear objetos Ship.

Comments are closed.