Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to fix Error with pygame "object is not iterable"

Here is my code



import pygame as pg



RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
WIDTH = 1920
HEIGHT = 1080
pg.init()
FPS = 50
fpsClock = pg.time.Clock()
screen = pg.display.set_mode((WIDTH, HEIGHT), 0, 32)
ball1Img = pg.image.load('test/sferoid.png')
x1 = y1 = 200  # координаты
xv1 = yv1 = 4  # скорость
check = parity = False


class Ball(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.image.load('test/sferoid.png')
        self.rect = self.image.get_rect(centerx=200, bottom=200)

    def update(self) -> None:
        global xv1
        global yv1
        xv1 = -xv1 if (self.rect.x > 1920 - 49 or self.rect.x < 0) else xv1  # отскок
        yv1 = -yv1 if (self.rect.y > 1080 - 49 or self.rect.y < 0) else yv1  # от стенок
        self.rect.x += xv1
        self.rect.y += yv1


class Basket(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        # self.image = pg.image.load('test/desk.png')\
        self.image = pg.image.load('test/desk.png')
        self.image = pg.transform.scale(self.image, (100, 25))
        self.rect = self.image.get_rect(centerx=WIDTH // 2, bottom=HEIGHT - 50)

    def update(self) -> None:
        klavisha = pg.key.get_pressed()
        if klavisha[pg.K_a] and self.rect.x >= 0:
            self.rect.x -= 20
        if klavisha[pg.K_d] and self.rect.right <= WIDTH:
            self.rect.x += 20


basket = Basket()
ball = Ball()
while True:
    fpsClock.tick(FPS)
    screen.fill(BLACK)
    basket.update()
    ball.update()
    screen.blit(basket.image, basket.rect)
    screen.blit(ball.image, ball.rect)
    pg.display.update()
    if pg.sprite.spritecollide(basket, ball, dokill=False):
        xv1 = -xv1
        yv1 = -yv1
    for event in pg.event.get():
        if event.type == pg.QUIT:
            pg.quit()

I apologize for such a crooked code, but please understand and forgive.
sferoid
desk

When I try to run the program, I get a TypeError: ‘Ball’ object is not iterable at the line:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

if pg.sprite.spritecollide(basket, ball, dokill=False):
    xv1 = -xv1
    yv1 = -yv1

But if you remove this line, then the code will work.

I don’t get why is is doing this but if someone can help me that would be greatly appreciated.

>Solution :

pypame.sprite.spritecollide is used to detect the collision between a pygame.sprite.Sprite and the sprites in a pygame.sprite.Group. However, basket and ball are both pygame.sprite.Sprite objects. You have to use pygame.sprite.collide_rect:

if pg.sprite.spritecollide(basket, ball, dokill=False):

if pygame.sprite.collide_rect(basket, ball):
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading