I’ve been following the python flappy bird ai tutorial from techwithtim, and I get this error;
Traceback (most recent call last): File "c:UserskahraDesktopprojectsflappy bird aiflappy_bird_ai.py", line 109, in <module> main() File "c:UserskahraDesktopprojectsflappy bird aiflappy_bird_ai.py", line 103, in main draw_window(win, bird) File "c:UserskahraDesktopprojectsflappy bird aiflappy_bird_ai.py", line 90, in draw_window bird.draw(win) File "c:UserskahraDesktopprojectsflappy bird aiflappy_bird_ai.py", line 78, in draw rotated_image = pygame.transform.rotate(self.img, self.tilt) TypeError: argument 1 must be pygame.Surface, not list
My code is like this
import pygame import neat import time import os import random WIN_WIDTH = 600 WIN_HEIGHT = 800 BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png")))], [pygame.transform.scale2x( pygame.image.load(os.path.join("imgs", "bird2.png")))], [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird3.png")))] PIPE_IMG = pygame.transform.scale2x( pygame.image.load(os.path.join("imgs", "pipe.png"))) BASE_IMG = pygame.transform.scale2x( pygame.image.load(os.path.join("imgs", "base.png"))) BG_IMG = pygame.transform.scale2x( pygame.image.load(os.path.join("imgs", "bg.png"))) class Bird: IMGS = BIRD_IMGS MAX_ROTATION = 25 ROT_VEL = 20 ANIMATION_TIME = 5 def __init__(self, x, y): self.x = x self.y = y self.tilt = 0 self.tick_count = 0 self.vel = 0 self.height = self.y self.img_count = 0 self.img = self.IMGS[0] def jump(self): self.vel = -10.5 self.tick_count = 0 self.height = self.y def move(self): self.tick_count += 1 d = self.vel*self.tick_count + 1.5*self.tick_count**2 if d >= 16: d = 16 if d < 0: d -= 2 self.y = self.y + d if d < 0 or self.y > self.height + 50: if self.tilt < self.MAX_ROTATION: self.tilt = self.MAX_ROTATION else: if self.tilt > -90: self.tilt -= self.ROT_VEL def draw(self, win): self.img_count += 1 if self.img_count < self.ANIMATION_TIME: self.img = self.IMGS[0] elif self.img_count < self.ANIMATION_TIME*2: self.img = self.IMGS[1] elif self.img_count < self.ANIMATION_TIME*3: self.img = self.IMGS[2] elif self.img_count < self.ANIMATION_TIME*4: self.img = self.IMGS[1] elif self.img_count == self.ANIMATION_TIME*4+1: self.img = self.IMGS[0] self.img_count = 0 if self.tilt <= -80: self.img = self.IMGS[1] self.img_count = self.ANIMATION_TIME*2 rotated_image = pygame.transform.rotate(self.img, self.tilt) new_rect = rotated_image.get_rect( center=self.img.get_rect(topleft=(self.x, self.y)).center) win.blit(rotated_image, new_rect.topleft) def get_mask(self): return pygame.mask.from_surface(self.img) def draw_window(win, bird): win.blit(BG_IMG, (0, 0)) bird.draw(win) pygame.display.update() def main(): bird = Bird(200, 200) win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT)) run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False draw_window(win, bird) pygame.quit() quit() main()
I read the other posts with the same problem and I understand it, but BG_IMG
is not a list like BIRD_IMGS
. I don’t know what to do.
I tried doing BG_IMGS[0]
to get the first image of the “list” but it says the object is not a list. Why?
Advertisement
Answer
[i1], [i2], [i3]
is not the same as [i1, i2, i3]
The following is not a list, but a tuple with 3 components, where each component is a list with 1 element:
BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png")))], [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird2.png")))], [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird3.png")))]
Change it:
BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird2.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird3.png")))]