Menu

Python AttributeError [Résolu]

Messages postés
17
Date d'inscription
mercredi 24 avril 2019
Statut
Membre
Dernière intervention
29 avril 2019
-
Bonjour à tous,

Débutante avec Python et plus précisément avec la bibliothèque pygame, j'essaie de créer un jeu qui consiste à faire bouger une voiture sur une route, (accélérer, ralentir, se déplacer sur les cotés), de façon à éviter les obstacles qui sont ici des animaux.

Seulement, je rencontre une difficulté depuis quelques jours :
Pour gérer la collision entre la voiture et un obstacle, je souhaite utiliser la formule 'pygame.sprite.spritecollide' suivie des paramètres entre parenthèse.


 """collision voiture obstacle"""
        hit_list = pygame.sprite.spritecollide(Voiture,Obstacles_sprite_list, False)
        for hit in hit_list:
            son_boum.play()
            fondgameover=pygame.image.load('ecrangameover.png').convert_alpha()
            screen.blit(fondgameover, (0, 0))
            pygame.display.update()
            pygame.time.delay(4000)
            main()


Mais rien à faire, j'ai toujours la même erreur : "AttributeError: type object 'Voiture' has no attribute 'rect'"...
Il me semble pourtant avoir correctement paramétré la 'class Voiture':

class Voiture(pygame.sprite.Sprite):

    # initialisation
    def __init__(self):
        super().__init__()

        #chargement des images
        self.image=pygame.image.load('voiture1.png').convert_alpha()
        self.rect = self.image.get_rect()
        self.change_x =0
        self.change_y =0
    def update(self):
        """Mouvement de la voiture"""
        self.rect.x += self.change_x
        if self.rect.x<250:
            self.rect.x-=self.change_x

        if self.rect.x>550:
            self.rect.x-=self.change_x

        self.rect.y += self.change_y
        if self.rect.y<0:
            self.rect.y-= self.change_y

        if self.rect.y>450:
            self.rect.y-=self.change_y

    def mvtgauche(self):
        """Mouvement gauche """
        self.change_x = -1
        self.change_y = 0

    def mvtdroit(self):
        """Mouvement droite"""
        self.change_x = 1
        self.change_y = 0

    def mvthaut(self):
        """Mouvement haut """
        self.change_x = 0
        self.change_y = -1

    def mvtbas(self):
        """Mouvement bas"""
        self.change_x = 0
        self.change_y = 1

    def stop(self):
        """arret"""
        self.change_x=0
        self.change_y=0

Si quelqu'un qui s'y connais mieux que moi peut m'aider je lui en serais reconnaissante.

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
326
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
6 mai 2019
76
1
Merci
Bonjour,
tout d'abord, merci d'utiliser les balises de code (explications ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code) car sinon le site ne conserve pas les indentations, or elles sont indispensables en Python. De plus cela permet d'avoir la coloration syntaxique qui permet de rendre le code plus lisible.

Pour réponde à votre question, lorsque vous faites
pygame.sprite.spritecollide(Voiture, ...)
, vous utilisez la classe Voiture au lieu d'utiliser un objet de type Voiture. Il faut donc instancier cette classe en faisant
pygame.sprite.spritecollide(Voiture(), ...)
.

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 42982 internautes nous ont dit merci ce mois-ci

PY2019
Messages postés
17
Date d'inscription
mercredi 24 avril 2019
Statut
Membre
Dernière intervention
29 avril 2019
-
C'est la première fois que j'écris un message ici, mais la prochaine fois je penserai à utiliser les balises de codes. Merci pour votre réponse, c'était la bonne explication. Je n'y aurais jamais pensé seule..
Commenter la réponse de quent217
Messages postés
17
Date d'inscription
mercredi 24 avril 2019
Statut
Membre
Dernière intervention
29 avril 2019
0
Merci
Je rencontre un nouveau problème. Python n'affiche plus de message d'erreur, mais il n'applique pas pour autant la collision voiture-obstacles. J'ai pensé que ça pouvait être dû à l'emplacement de mon paragraphe collision dans mon programme principal... Pourriez vous me donner votre avis ?

def main():
    """programme principal"""
    pygame.init()

    #definition de la fenetre
    screen= pygame.display.set_mode((900, 600),0,32)
    pygame.display.set_caption("josette en voiture")
    fond=pygame.image.load('fondforet.png').convert_alpha() #chargement et collage du fond
    son_fond.play()

    #creation des listes de sprites
    active_sprite_list = pygame.sprite.Group()
    liste_lignes=pygame.sprite.Group()
    Obstacles_sprite_list= pygame.sprite.Group()

    # creation voiture
    voiture = Voiture()
    voiture.rect.x = 300
    voiture.rect.y = 300
    active_sprite_list.add(voiture)

    # lignes centrales
    compteurligne=0
    ligne=Line()
    ligne.rect.y=0
    liste_lignes.add(ligne)
    ligne=Line()
    ligne.rect.y=250
    liste_lignes.add(ligne)
    ligne=Line()
    ligne.rect.y=500
    liste_lignes.add(ligne)

    compteurbarriere1=0
    compteurbarriere2=0
    compteurdecors1=0
    compteurdecors2=0
    compteurobstacle=0

    # Boucle principale
    continuer=1
    while continuer:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                continuer=0

            # touches enfoncees
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    voiture.mvtgauche()
                if event.key == pygame.K_RIGHT:
                    voiture.mvtdroit()
                if event.key == pygame.K_UP:
                    voiture.mvthaut()
                if event.key == pygame.K_DOWN:
                    voiture.mvtbas()

              # touches relevees
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    voiture.stop()
                if event.key == pygame.K_RIGHT:
                    voiture.stop()
                if event.key == pygame.K_UP:
                    voiture.stop()
                if event.key == pygame.K_DOWN:
                    voiture.stop()
        #mise a jour des sprites
        active_sprite_list.update()
        liste_lignes.update()
        Obstacles_sprite_list.update()

        #lignes centrales
        compteurligne+=1
        if compteurligne>250:
           ligne=Line()
           liste_lignes.add(ligne)
           compteurligne=0

        compteurbarriere1+=1
        if compteurbarriere1>45:
           barriere1=fence1()
           active_sprite_list.add(barriere1)
           compteurbarriere1=0
        compteurbarriere2+=1
        if compteurbarriere2>45:
           barriere2=fence2()
           active_sprite_list.add(barriere2)
           compteurbarriere2=0

        compteurdecors1+=1
        if compteurdecors1>250:
            decors=decorsforet()
            active_sprite_list.add(decors)
            compteurdecors1=0

        compteurdecors2+=1
        if compteurdecors2>100:
            sapin=sapins()
            active_sprite_list.add(sapin)
            compteurdecors2=0

        compteurobstacle+=randint(1,10)*0.1
        if compteurobstacle>200:
            choix=randint(1,3)
            if choix==1:
                vache1=vache()
                vache1.rect.x=randint(250,560)
                active_sprite_list.add(vache1)
            if choix==2:
                cheval1=cheval()
                cheval1.rect.x=randint(250,560)
                active_sprite_list.add(cheval1)
            compteurobstacle=0

        #mise a jour des sprites
        active_sprite_list.update()
        liste_lignes.update()
        Obstacles_sprite_list.update()

        #Gestion des collisions
        """collision voiture obstacle"""
        hit_list = pygame.sprite.spritecollide(voiture,Obstacles_sprite_list,False)
        for hit in hit_list:
            son_boum.play()
            fondgameover=pygame.image.load('ecrangameover.png').convert_alpha()
            screen.blit(fondgameover,(0, 0))
            pygame.display.update()
            pygame.time.delay(4000)
            main()

        # affichage
        screen.blit(fond,(0,0))
        liste_lignes.draw(screen)
        active_sprite_list.draw(screen)

        pygame.display.flip()
PY2019
Messages postés
17
Date d'inscription
mercredi 24 avril 2019
Statut
Membre
Dernière intervention
29 avril 2019
-
J'ai supprimé les deux lignes
Obstacles_sprite_list.update()
et en effet les obstacles se déplacent maintenant à la même vitesse que le décors. Cependant, je ne comprend pas pourquoi quand je supprime la mise à jour des groupes à un endroit mon décors paraît tout "écrasé"... J'ai l'impression que ça modifie( diminue) la distance entre mes images, mais je ne saurais pas dire pourquoi.
Vous avez également parlez des éléments qui "se déplacent deux fois par frame". Je ne connais pas ce mot mais sans doute faite vous référence au fait que mes éléments se déplacent par à-coups. Savez vous régler se problème?..
PY2019
Messages postés
17
Date d'inscription
mercredi 24 avril 2019
Statut
Membre
Dernière intervention
29 avril 2019
-
Bon du coup j'ai laissé les deux mises à jour des groupes. Et je souhaite maintenant faire quelque chose qui me paraissais assez simple : faire défiler les arbres du décors de façon aléatoire de chaque côté de la route, en m'inspirant de ce que j'ai fais pour que les obstacles défilent de manière aléatoire sur la route. Je l'ai fait, sauf qu'il y a un million d'arbre qui s'entassent de chaque côté de la route au lieu de 1 ou 2 :

import pygame,sys
from random import *
from pygame.locals import*

pygame.mixer.init(44100, -16, 2, 2048)

son_klaxon=pygame.mixer.Sound("son_klaxon.wav")
son_moteurintro=pygame.mixer.Sound("son_moteurintro.wav")
son_fond=pygame.mixer.Sound("oiseaux.wav")
son_boum=pygame.mixer.Sound("son_boum.wav")


class Line (pygame.sprite.Sprite):
    """classe pour la ligne centrale"""

    # initialisation
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('lignecentrale.png').convert_alpha() #image de ligne 20*100
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=440

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()

class Voiture(pygame.sprite.Sprite):

    # initialisation
    def __init__(self):
        super().__init__()

        #chargement des images
        self.image=pygame.image.load('voiture2.png').convert_alpha()
        self.rect = self.image.get_rect()
        self.change_x =0
        self.change_y =0
    def update(self):
        """Mouvement de la voiture"""
        self.rect.x += self.change_x
        if self.rect.x<250:
            self.rect.x-=self.change_x

        if self.rect.x>550:
            self.rect.x-=self.change_x

        self.rect.y += self.change_y
        if self.rect.y<0:
            self.rect.y-= self.change_y

        if self.rect.y>450:
            self.rect.y-=self.change_y

    def mvtgauche(self):
        """Mouvement gauche """
        self.change_x = -1
        self.change_y = 0

    def mvtdroit(self):
        """Mouvement droite"""
        self.change_x = 1
        self.change_y = 0

    def mvthaut(self):
        """Mouvement haut """
        self.change_x = 0
        self.change_y = -1

    def mvtbas(self):
        """Mouvement bas"""
        self.change_x = 0
        self.change_y = 1

    def stop(self):
        """arret"""
        self.change_x=0
        self.change_y=0

class fence1 (pygame.sprite.Sprite):
    """ classe pour les barrieres"""

    #initialisation
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('barriere2.png').convert_alpha() #image de la barriere
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=240

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()

class fence2 (pygame.sprite.Sprite):
    """ classe pour les barrieres"""

    #initialisation
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('barriere2.png').convert_alpha() #image de la barriere
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=640

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()

class arbre1 (pygame.sprite.Sprite):
    """ classe pour le decors"""

    #initialisation
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('arbre1.png').convert_alpha() #image de l arbre
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=50

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()

class sapin (pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('arbre2.png').convert_alpha() #image du sapin
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=750

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()


class vache (pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('vache2.png').convert_alpha() #image de la vache
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=500
    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()

class cheval (pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('cheval2.png').convert_alpha() #image du cheval
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=500

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()

class cerf (pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('cerf2.png').convert_alpha() #image du cerf
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=500

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()

class mouton (pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('mouton2.png').convert_alpha() #image du mouton
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=500

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()

class herisson (pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('herisson2.png').convert_alpha() #image du herisson
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=500

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()


def gameover():
    pygame.init()
    screen = pygame.display.set_mode((900,600),0,32)
    pygame.display.set_caption("Josette en voiture !")
    fondgameover=pygame.image.load('ecrangameover.png').convert_alpha()
    screen.blit(fondgameover, (0, 0))
    pygame.display.update()
    reprendre=1
    while reprendre:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                reprendre=0
            # touches enfoncees
            if event.type == pygame.KEYDOWN:
                reprendre=0
                main()

def victoire():
    pygame.init()
    screen = pygame.display.set_mode((900,600),0,32)
    pygame.display.set_caption("Josette en voiture !")
    victoire1=pygame.image.load('ecranvictoire.png').convert_alpha()
    screen.blit(victoire1, (0, 0))
    pygame.display.update()
    reprendre=1
    while reprendre:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                reprendre=0
            # touches enfoncees
            if event.type == pygame.KEYDOWN:
                reprendre=0
                intro()

def intro():
  pygame.init()
  screen = pygame.display.set_mode((900,600),0,32)
  pygame.display.set_caption("Josette en voiture !")
  fondpelouse=pygame.image.load('fondpelouse.png').convert_alpha()
  screen.blit(fondpelouse, (0, 0))
  pygame.display.update()
  voiture=pygame.image.load('voitureintro.png').convert_alpha()
  J=pygame.image.load('J.png').convert_alpha()
  O=pygame.image.load('O.png').convert_alpha()
  S=pygame.image.load('S.png').convert_alpha()
  E=pygame.image.load('E.png').convert_alpha()
  T=pygame.image.load('T.png').convert_alpha()
  T2=pygame.image.load('T2.png').convert_alpha()
  E2=pygame.image.load('E2.png').convert_alpha()
  E3=pygame.image.load('E3.png').convert_alpha()
  N=pygame.image.load('N.png').convert_alpha()
  V=pygame.image.load('V.png').convert_alpha()
  O2=pygame.image.load('O2.png').convert_alpha()
  I=pygame.image.load('I.png').convert_alpha()
  T3=pygame.image.load('T3.png').convert_alpha()
  U=pygame.image.load('U.png').convert_alpha()
  R=pygame.image.load('R.png').convert_alpha()
  E4=pygame.image.load('E4.png').convert_alpha()
  Jouer=pygame.image.load('Jouerimage.png')
  voiturey=325
  voiturex=0
  for i in range (20):
        voiturex+=4
        screen.blit(fondpelouse, (0, 0))
        screen.blit(voiture,(voiturex,voiturey))
        pygame.display.update()
        pygame.time.delay(50)
  son_klaxon.play()
  for i in range (25):
        voiturex+=0
        screen.blit(fondpelouse, (0, 0))
        screen.blit(voiture,(voiturex,voiturey))
        screen.blit(J,(30,30))
        screen.blit(O,(70,30))
        screen.blit(S,(110,30))
        screen.blit(E,(145,30))
        screen.blit(T,(170,30))
        screen.blit(T2,(210,30))
        screen.blit(E2,(250,30))
        pygame.display.update()
        pygame.time.delay(50)
  for i in range (25):
        voiturex+=0
        screen.blit(fondpelouse, (0, 0))
        screen.blit(voiture,(voiturex,voiturey))
        screen.blit(J,(30,30))
        screen.blit(O,(70,30))
        screen.blit(S,(110,30))
        screen.blit(E,(145,30))
        screen.blit(T,(170,30))
        screen.blit(T2,(210,30))
        screen.blit(E2,(250,30))
        screen.blit(E3,(420,30))
        screen.blit(N,(460,30))
        pygame.display.update()
        pygame.time.delay(50)
  for i in range (25):
        voiturex+=0
        screen.blit(fondpelouse, (0, 0))
        screen.blit(voiture,(voiturex,voiturey))
        screen.blit(J,(30,30))
        screen.blit(O,(70,30))
        screen.blit(S,(110,30))
        screen.blit(E,(145,30))
        screen.blit(T,(170,30))
        screen.blit(T2,(210,30))
        screen.blit(E2,(250,30))
        screen.blit(E3,(420,30))
        screen.blit(N,(460,30))
        screen.blit(V,(585,30))
        screen.blit(O2,(640,30))
        screen.blit(I,(680,30))
        screen.blit(T3,(720,30))
        screen.blit(U,(760,30))
        screen.blit(R,(800,30))
        screen.blit(E4,(840,30))
        pygame.display.update()
        pygame.time.delay(50)
  son_moteurintro.play()
  for i in range (130):
        voiturex+=15
        screen.blit(fondpelouse, (0, 0))
        screen.blit(voiture,(voiturex,voiturey))
        screen.blit(J,(30,30))
        screen.blit(O,(70,30))
        screen.blit(S,(110,30))
        screen.blit(E,(145,30))
        screen.blit(T,(170,30))
        screen.blit(T2,(210,30))
        screen.blit(E2,(250,30))
        screen.blit(E3,(420,30))
        screen.blit(N,(460,30))
        screen.blit(V,(585,30))
        screen.blit(O2,(640,30))
        screen.blit(I,(680,30))
        screen.blit(T3,(720,30))
        screen.blit(U,(760,30))
        screen.blit(R,(800,30))
        screen.blit(E4,(840,30))
        pygame.display.update()
        pygame.time.delay(50)


  for i in range (40):
   reprendre=1
   compteur=0
  while reprendre:
         for event in pygame.event.get():
            if event.type == pygame.QUIT:
                reprendre=0
            # touches enfoncees
            if event.type == pygame.KEYDOWN:
                reprendre=0
                main()
         compteur+=1
         if compteur<50:
            screen.blit(fondpelouse,(0, 0))
            screen.blit(Jouer,(300, 180))
            screen.blit(J,(30,30))
            screen.blit(O,(70,30))
            screen.blit(S,(110,30))
            screen.blit(E,(145,30))
            screen.blit(T,(170,30))
            screen.blit(T2,(210,30))
            screen.blit(E2,(250,30))
            screen.blit(E3,(420,30))
            screen.blit(N,(460,30))
            screen.blit(V,(585,30))
            screen.blit(O2,(640,30))
            screen.blit(I,(680,30))
            screen.blit(T3,(720,30))
            screen.blit(U,(760,30))
            screen.blit(R,(800,30))
            screen.blit(E4,(840,30))
            pygame.display.update()
            pygame.time.delay(10)
         else :
            screen.blit(fondpelouse, (0, 0))
            screen.blit(J,(30,30))
            screen.blit(O,(70,30))
            screen.blit(S,(110,30))
            screen.blit(E,(145,30))
            screen.blit(T,(170,30))
            screen.blit(T2,(210,30))
            screen.blit(E2,(250,30))
            screen.blit(E3,(420,30))
            screen.blit(N,(460,30))
            screen.blit(V,(585,30))
            screen.blit(O2,(640,30))
            screen.blit(I,(680,30))
            screen.blit(T3,(720,30))
            screen.blit(U,(760,30))
            screen.blit(R,(800,30))
            screen.blit(E4,(840,30))
            pygame.display.update()
            pygame.time.delay(10)
            if compteur>100:
             compteur=0


def main():
    """programme principal"""
    pygame.init()

    #definition de la fenetre
    screen= pygame.display.set_mode((900, 600),0,32)
    pygame.display.set_caption("josette en voiture")
    fond=pygame.image.load('fondforet.png').convert_alpha() #chargement et collage du fond
    son_fond.play()

    #creation des listes de sprites
    active_sprite_list = pygame.sprite.Group()
    liste_lignes=pygame.sprite.Group()
    Obstacles_sprite_list= pygame.sprite.Group()

    # creation voiture
    voiture = Voiture()
    voiture.rect.x = 300
    voiture.rect.y = 300
    active_sprite_list.add(voiture)

    #lignes centrales
    compteurligne=0
    ligne=Line()
    ligne.rect.y=0
    liste_lignes.add(ligne)
    ligne=Line()
    ligne.rect.y=250
    liste_lignes.add(ligne)
    ligne=Line()
    ligne.rect.y=500
    liste_lignes.add(ligne)

    compteurbarriere1=0
    compteurbarriere2=0
    compteurdecors=0
    compteurdecors2=0
    compteurobstacle=0


    #reglage de l'horloge
    clock = pygame.time.Clock()


    # Boucle principale
    continuer=1
    while continuer:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                continuer=0

            # touches enfoncees
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    voiture.mvtgauche()
                if event.key == pygame.K_RIGHT:
                    voiture.mvtdroit()
                if event.key == pygame.K_UP:
                    voiture.mvthaut()
                if event.key == pygame.K_DOWN:
                    voiture.mvtbas()

              # touches relevees
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    voiture.stop()
                if event.key == pygame.K_RIGHT:
                    voiture.stop()
                if event.key == pygame.K_UP:
                    voiture.stop()
                if event.key == pygame.K_DOWN:
                    voiture.stop()

        #mise a jour des sprites
        active_sprite_list.update()
        liste_lignes.update()

        #lignes centrales
        compteurligne+=1
        if compteurligne>250:
           ligne=Line()
           liste_lignes.add(ligne)
           compteurligne=0

        compteurbarriere1+=1
        if compteurbarriere1>45:
           barriere1=fence1()
           active_sprite_list.add(barriere1)
           compteurbarriere1=0
        compteurbarriere2+=1
        if compteurbarriere2>45:
           barriere2=fence2()
           active_sprite_list.add(barriere2)
           compteurbarriere2=0

##        compteurdecors1+=1
##        if compteurdecors1>250:
##            decors1=arbre1()
##            active_sprite_list.add(decors1)
##            compteurdecors1=0
##
##        compteurdecors2+=1
##        if compteurdecors2>100:
##            decors2=sapins()
##            active_sprite_list.add(decors2)
##            compteurdecors2=0

        compteurdecors+=randint(1,10)*0.1
        if compteurdecors>150:
            choix=randint(1,3)
            if choix==1:
                arbre=arbre1()
                arbre.rect.x=randint(0,120)
                active_sprite_list.add(arbre)
            if choix==2:
                sapin1=sapin()
                sapin1.rect.x=randint(0,120)
                active_sprite_list.add(sapin1)
            compteurobstacle=0

        compteurdecors2+=randint(1,10)*0.1
        if compteurdecors2>150:
            choix=randint(1,3)
            if choix==1:
                arbre=arbre1()
                arbre.rect.x=randint(630,850)
                active_sprite_list.add(arbre)
            if choix==2:
                sapin1=sapin()
                sapin1.rect.x=randint(630,850)
                active_sprite_list.add(sapin1)
            compteurobstacle=0

        compteurobstacle+=randint(1,10)*0.1
        if compteurobstacle>200:
            choix=randint(1,6)
            if choix==1:
                vache1=vache()
                vache1.rect.x=randint(250,560)
                active_sprite_list.add(vache1)
                Obstacles_sprite_list.add(vache1)
            if choix==2:
                cheval1=cheval()
                cheval1.rect.x=randint(250,560)
                active_sprite_list.add(cheval1)
                Obstacles_sprite_list.add(cheval1)
            if choix==3:
                cerf1=cerf()
                cerf1.rect.x=randint(250,560)
                active_sprite_list.add(cerf1)
                Obstacles_sprite_list.add(cerf1)
            if choix==4:
                mouton1=mouton()
                mouton1.rect.x=randint(250,560)
                active_sprite_list.add(mouton1)
                Obstacles_sprite_list.add(mouton1)
            if choix==5:
                herisson1=herisson()
                herisson1.rect.x=randint(250,560)
                active_sprite_list.add(herisson1)
                Obstacles_sprite_list.add(herisson1)
            compteurobstacle=0

        #mise a jour des sprites
        active_sprite_list.update()
        liste_lignes.update()

        #Gestion des collisions
        """collision voiture obstacle"""
        hit_list = pygame.sprite.spritecollide(voiture,Obstacles_sprite_list,False)
        for hit in hit_list:
         son_boum.play()
         fondgameover=pygame.image.load('ecrangameover.png').convert_alpha()
         screen.blit(fondgameover,(0, 0))
         pygame.display.update()
         pygame.time.delay(4000)
         main()
         return

        # On limite le nombre d'images a 60 images par seconde
        clock.tick(150)


        # affichage
        screen.blit(fond,(0,0))
        liste_lignes.draw(screen)
        active_sprite_list.draw(screen)

        pygame.display.flip()

pygame.quit()

main()

quent217
Messages postés
326
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
6 mai 2019
76 > PY2019
Messages postés
17
Date d'inscription
mercredi 24 avril 2019
Statut
Membre
Dernière intervention
29 avril 2019
-
Pour faire simple, une frame correspond à un passage dans la boucle principale. Comme il y a 2 endroits où les éléments sont actualisés, ils se déplacent donc "deux fois par frame". Je n'ai pas l'impression que les éléments se déplacent par à-coups donc je ne sais pas vraiment à quoi vous faites référence.
Si vous enlevez l'une des deux mise à jour, les éléments vont se déplacer 2 fois moins vite car ils se déplacent maintenant de 1 pixel par frame au lieu de 2, mais ils sont créés toujours aussi régulièrement. Il est donc normal qu'ils soient 2 fois plus proche les uns des autres. Pour corriger ce problème, vous pouvez faire en sorte qu'ils soient créés 2 fois moins souvent pour compenser la perte de vitesse. Par exemple pour la barriere1 vous pouvez remplacer cette ligne
if compteurbarriere1>45
par
if compteurbarriere1>90
. Ensuite tout se déplacera 2 fois moins vite donc pour le remettre à la même vitesse qu'avant vous pouvez augmenter le frame rate, c'est à dire le nombre de fois que la boucle sera exécutée par seconde. Cela se fait en remplacant
clock.tick(150)
par
clock.tick(300)
.
Par contre en faisant tout ça, l'ordinateur va faire 2 fois plus de claculs. Ca va peut-être réglé votre problème d'à-coups bien que je ne sache pas exactement de quoi vous parlez, mais sinon ce n'est pas forcément nécessaire d'augmenter le nombre de calculs effectués.
Une autre solution est de supprimer l'une des deux mises à jours puis d'incrémenter les ordonnées de 2 au lieu de 1 en remplacant dans les différentes classes
self.rect.y+=1
par
self.rect.y+=2
. Le résultat sera exactement le même qu'avant mais le code sera quand même un peu plus efficace et un peu plus propre.

Pour votre deuxième question, ce que vous avez fait est correct à l'exception de la ligne
compteurobstacle=0
que vous avez oublié de modifier quand vous avez copier le code pour les obstacles. Il faut remplacer la variable
compteurobstacle
par
compteurdecors
et
compteurdecors2
.
PY2019
Messages postés
17
Date d'inscription
mercredi 24 avril 2019
Statut
Membre
Dernière intervention
29 avril 2019
-
J'ai appliqué vos conseils et mon programme fonctionne parfaitement. Merci pour votre aide, je vais maintenant ajouter un chrono qui devra s'afficher sur la fenêtre, pour qu'au bout d'un certain temps l'écran victoire s'affiche.. Puis de l'essence que la voiture devra récupérer régulièrement. Pour moi le sujet est clos.. J'en ouvrirai un nouveau si je suis confrontée à un nouveau problème :)
quent217
Messages postés
326
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
6 mai 2019
76 > PY2019
Messages postés
17
Date d'inscription
mercredi 24 avril 2019
Statut
Membre
Dernière intervention
29 avril 2019
-
Super ! Bon courage pour la suite :)
Je vous laisse mettre le sujet en résolu en haut à droite de votre premier message.
Commenter la réponse de PY2019