Moreno
Moreno

Reputation: 31

How do i fix the error "TypeError: argument 1 must be pygame.Surface, not list" when making a simple flappy bird game?

Im following a tutorial on youtube for making a flappy bird game with python and pygame. I have done what he's done so far but when i try to run the code i get an error:

TypeError: argument 1 must be pygame.Surface, not list

I really don't know what could be causing the issue.

I have tried googling and found some threads with potenial answers to my question, but because I dont have much experience in python and pygame it's hard for me to understand what other peoples code have in common with mine to fix the problem.

Here is my code:

import pygame
import neat
import time
import random
import os

WIN_WIDTH= 600
WIN_HEIGHT= 800

BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load("imgs/bird1.png")), pygame.transform.scale2x(pygame.image.load("imgs/bird2.png")), pygame.transform.scale2x(pygame.image.load(("imgs/bird3.png")))]
PIPE_IMG = [pygame.transform.scale2x(pygame.image.load("imgs/pipe.png"))]
BASE_IMG = [pygame.transform.scale2x(pygame.image.load("imgs/base.png"))]
BG_IMG = [pygame.transform.scale2x(pygame.image.load("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.velocity = 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 < sel.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)



((((THIS IS WHERE I GET MY ERROR CODE))))))

def draw_window(win, bird):
HERE--> win.blit(BG_IMG, (0,0))
    bird.draw(win)
    pygame.display.update()

((((ABOVE HERE IS WHERE I GET MY ERROR CODE))))))

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()

Upvotes: 3

Views: 139

Answers (1)

Rabbid76
Rabbid76

Reputation: 211166

The error is caused, because in

win.blit(BG_IMG, (0,0))

BG_IMG is a list with a single element:

BG_IMG = [pygame.transform.scale2x(pygame.image.load("imgs/bg.png"))]

Get the 1st element of the list to solve the issue (BG_IMG[0]):

win.blit(BG_IMG[0], (0,0))

Of course you can make BG_IMG a single surface rather than a list of surfaces instead:

BG_IMG = pygame.transform.scale2x(pygame.image.load("imgs/bg.png"))

Further self.vel = 0 is missing in the constructor of the class Bird:

class Bird:
    # [...]

    def __init__(self,x,y):
        self.vel = 0
        # [...]

Upvotes: 2

Related Questions