Reputation: 31
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
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