Problème avec mon jeu Pygame

Fermé
Meziane - 17 sept. 2022 à 17:05
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 17 sept. 2022 à 19:29

Bonjour, je cherche à créer un jeu avec Pygame utilisant plusieurs classes pour les différents objets, j'ai donc trouvé le code redondant et j'ai décidé de le simplifier en créant une super-classe Object mais cela ne fonctionne pas, voilà le code : 

import pygame, random, sys

def quit():
    pygame.quit()
    sys.exit()

def e(location):
    return 'C:\\Users\\Meziane\\Desktop\\space\\'+location

pygame.init()

screen = pygame.display.set_mode((640,640))
pygame.display.set_caption("Space")
clock = pygame.time.Clock()
score = 0
ammo = 0
menu = 0
count2 = 0

count=0
maxcount = 10

bg = pygame.image.load(e('BG.png')).convert_alpha()

vectorx = 0



class Object(pygame.sprite.Sprite):

    def __init__(self,x,y,img):
        super().__init__()
        self.sprite = pygame.image.load(e(img)).convert_alpha()
        self.rect = self.sprite.get_rect(center = (x,y))
        self.mask = pygame.mask.from_surface(self.sprite)


class Asteroid(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super().__init__(x,y,'asteroid.png')

class Coin(Object):
    def __init__(self,x,y):
        super().__init__(x,y,'Coin.png')

class Player(Object):
    def __init__(self,x,y):
        super().__init__(x,y,'shiep.png')
class Text:
    def __init__(self,text,x,y,font,w,color,t):
        self.font = pygame.font.Font(font,w)
        self.text = self.font.render(text,t,color).convert_alpha()
        self.rect = self.text.get_rect(midleft = (x, y))

score_text = Text(str(score),50,25,None,50,'White',True)


shiep = Player(0,590)
l = []
c = []

while True:
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
    
    if menu == 0:
      if count < maxcount:
          count+=1
      else:
          count=0
          maxcount = random.randint(10,25)

      if count2 < 60:
          count2+=1
      else:
          count2=0
          ammo +=1
      

      keys_pressed = pygame.key.get_pressed()

      if keys_pressed[pygame.K_LEFT] and vectorx > -15: vectorx -= 3
      if keys_pressed[pygame.K_RIGHT]and vectorx <15: vectorx += 3

      if vectorx > 0: vectorx -=1
      if vectorx < 0: vectorx +=1
      shiep.rect.x += vectorx

      if shiep.rect.right <= 0: shiep.rect.left = 639
      if shiep.rect.left >= 640: shiep.rect.right = 0

      screen.blit(bg, (0,0))
      screen.blit(shiep.sprite, shiep.rect)

    

      if count == 5: l.append(Asteroid(random.randint(0,640), -30))
      if random.randint(0,60) == 5: c.append(Coin(random.randint(0,640), -30)) 

      for i in l:
          i.rect.y += 15
          screen.blit(i.sprite, i.rect)
          if i.rect.y >= 700: l.remove(i)
          if pygame.sprite.collide_mask(shiep, i): quit()

      for i in c:
          i.rect.y += 15
          screen.blit(i.sprite, i.rect)
          if i.rect.y >= 700: c.remove(i)
          if pygame.sprite.collide_mask(shiep, i): 
            c.remove(i)
            score += 100


      score_text = Text("Score : "+str(score),10,25,None,50,'White',True)
      screen.blit(score_text.text, score_text.rect)

      ammo_text = Text("Balles : "+str(ammo),450,25,None,50,'White',True)
      screen.blit(ammo_text.text, ammo_text.rect)
      score += 1

    elif menu == 1:
        pass
    pygame.display.update()
    clock.tick(60) 

Vu que vous ne possedez pas les fichiers nécéssaires, je vous donne l'erreur qu'on m'a donné : 

Traceback (most recent call last):
  File "c:\Users\Meziane\Desktop\space\main.py", line 99, in <module>
    if count == 5: l.append(Asteroid(random.randint(0,640), -30))    
  File "c:\Users\Meziane\Desktop\space\main.py", line 40, in __init__
    super().__init__(x,y,'asteroid.png')
  File "C:\Users\Meziane\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\pygame\sprite.py", line 116, in __init__
    self.add(*groups)
  File "C:\Users\Meziane\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\pygame\sprite.py", line 134, in add
    self.add(*group)
TypeError: pygame.sprite.Sprite.add() argument after * must be an iterable, not int

Merci de votre aide ^^

A voir également:

2 réponses

yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480
17 sept. 2022 à 17:38

bonjour,

es-tu certain de ta ligne 38?

0

la ligne 38 est la ligne 37 dans mon code je pense qu'il y a du avoir un decalement de ligne

0
yg_be Messages postés 22763 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 mai 2024 1 480 > Meziane
17 sept. 2022 à 19:29

Es-tu certain de la déclaration de "class Asteroid"?

0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
17 sept. 2022 à 19:29

Bonjour,

self.add(*group) : argument after * must be an iterable, not int

Apparemment, group contient un entier, alors qu'après * on attend un truc de type liste, par exemple ...

0