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()
davy.ai
El mensaje de error “el argumento 1 debe ser pygame.Surface, no None” se produce porque el atributo
ship_img
de la claseShip
se establece enNone
de forma predeterminada. Para corregir este error, es necesario asegurarse de que el atributoship_img
se establezca en un objeto válido depygame.Surface
antes de llamar awindow.blit
en él.Para hacer esto, puede pasar un objeto de
pygame.Surface
como argumento al crear el objetoShip
, o puede establecer el atributoship_img
en un objeto válido depygame.Surface
dentro del método de inicialización de la claseShip
.Aquí hay un ejemplo de cómo puede hacerlo dentro del método
__init__
de la claseShip
:Con esta modificación, puede pasar un argumento
ship_img
al método de inicialización de la claseShip
que sea un objeto válido depygame.Surface
.Otra opción es establecer el atributo
ship_img
dentro del método__init__
de la claseShip
, de la siguiente manera:Con esta modificación, el atributo
ship_img
se establece en un objeto válido depygame.Surface
dentro del método__init__
de la claseShip
. De esta manera, no es necesario pasar un argumento separado para la imagen del barco al crear objetosShip
.