Pygame: Getting an error which is telling that the sprite is non-iterable

Viewed 45

I was writing a pygame code to make a car game. It is a basic car game where the hero sprite car is supposed to avoid contact with the enemy sprite. So for the collision part we had to create a mask for the enemy car as well as the hero car .

Here is the code:

import pygame
from pygame.locals import *
import sys
import random
 
    
        
road = pygame.image.load(r"C:\Users\Binoy\Downloads\ezgif.com-gif-maker-0.jpg")
screen = pygame.display.set_mode((800, 600))
class Enemy(pygame.sprite.Sprite):
    def __init__(self,image):
        pygame.sprite.Sprite.__init__(self) #call Sprite initializer
        self.image = pygame.image.load(image)
        self.rect=self.image.get_rect()
        self.mask = pygame.mask.from_surface(self.image)
        

class Hero(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self) #call Sprite initializer
        self.image = pygame.image.load("Untitled.png")
        self.rect=self.image.get_rect()
        self.mask = pygame.mask.from_surface(self.image)
hero=Hero()
enemy = Enemy("enemy.png")
enemy2 = Enemy("enemy 2.0.png")
enemy3 = Enemy("enemy 3.0.png")
enemy4 = Enemy("enemy 4.0.png")

if pygame.sprite.spritecollide(hero, enemy2, False, pygame.sprite.collide_mask):
    print("sprites have collided!")
velocity = 2
roadx = 0
roady = 0
x=200 
y=400
y1=100
y2=350

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type== pygame.KEYDOWN and event.key ==pygame.K_LEFT:
            x-=200
            if x==-200:
                x=0
        elif event.type== pygame.KEYDOWN and event.key ==pygame.K_RIGHT:
            x+=200
            if x==800:
                x=600
    

    roady = roady + velocity
    if roady == 600:
        roady = 0
    y=y-2
    y1-=2
    y2-=2
    if y==0:
        y=600
    if y1==0:
        y1=600 
    if y2==0:
        y2=600
    screen.blit(road, [roadx, roady -600])
    screen.blit(road, [roadx, roady])
    screen.blit(pygame.transform.scale(enemy.image , (150, 150)), [0,y1-600])
    screen.blit(pygame.transform.scale(enemy.image , (150, 150)), [0,y1])
    screen.blit(pygame.transform.scale(enemy2.image , (150, 150)), [400,y1-600])
    screen.blit(pygame.transform.scale(enemy2.image , (150, 150)), [400,y1])
    screen.blit(pygame.transform.scale(enemy3.image, (150, 150)), [610, y2-600])
    screen.blit(pygame.transform.scale(enemy3.image , (150, 150)), [610, y2])
    screen.blit(pygame.transform.scale(enemy4.image, (150, 150)), [200, y-600])
    screen.blit(pygame.transform.scale(enemy4.image , (150, 150)), [200, y])
    screen.blit(pygame.transform.scale(hero.image , (150, 150)), [x, 250])
    pygame.display.update()

But on running the script it returns the error:

Traceback (most recent call last):


File "c:\Users\USERNAME\game.py", line 30, in <module>
    if pygame.sprite.spritecollide(hero, enemy2, False, pygame.sprite.collide_mask):
  File "C:\Users\USERNAME\AppData\Roaming\Python\Python39\site-packages\pygame\sprite.py", line 1665, in spritecollide
    return [group_sprite
TypeError: 'Enemy' object is not iterable

So could anyone please help us in this code and give a solution to the error. Thank you.

1 Answers

The 2nd argument of spritecollide must be a pygame.sprite.Group. Create a Group with the enemies and do the collision test:

hero=Hero()
enemy = Enemy("enemy.png")
enemy2 = Enemy("enemy 2.0.png")
enemy3 = Enemy("enemy 3.0.png")
enemy4 = Enemy("enemy 4.0.png")

enemies = pygame.sprite.Group([enemy, enemy2, enemy3, enemy4])
if pygame.sprite.spritecollide(hero, enemies, False, pygame.sprite.collide_mask):
    print("sprites have collided!")

For a collision of 2 pygame.sprite.Sprite objects you can use pygame.sprite.collide_mask directly:

if pygame.sprite.collide_mask(hero, enemy):
    print("sprites have collided!")
Related