IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

renseignement utilisation pygame userevent


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    mai 2019
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : mai 2019
    Messages : 187
    Points : 36
    Points
    36
    Par défaut renseignement utilisation pygame userevent
    Bonjour a toutes et a tous ,

    Je souhaiterai dans mon jeu déclencher une instance vaisseau2 = Vaisseau2() , lorsque mon score ( dans mon code la variable " score._scoreCourant ") a atteint 10 point .

    Est il possible d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AJOUTE_VAISSEAU  = pygame.USEREVENT + 3 
     ....
    Je ne vois pas comment faire . Merci de votre aide
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    import pygame
    import random
    import time
    from pygame import *
     
     
    LARGEUR_ECRAN = 1500
    HAUTEUR_ECRAN = 844
     
    class Etoile(pygame.sprite.Sprite):
        def __init__(self):
            super(Etoile,self).__init__()
            self.surface = pygame.image.load('etoile.png')
            self.surface.set_colorkey((255,255,255),RLEACCEL)
     
            self.rect = self.surface.get_rect(center=(
                LARGEUR_ECRAN + 20,
                random.randint(0,HAUTEUR_ECRAN),
                )
            )
     
        def update(self):
            self.rect.move_ip(-3.5,0)
            if self.rect.left < 0:
                self.kill()
     
     
    class Explosion(pygame.sprite.Sprite):
        def __init__(self,center_vaisseau):
            super(Explosion,self).__init__()
            self.compteur = 40
            self.surface = pygame.image.load('explosion.png').convert()
            self.surface.set_colorkey((255,255,255),RLEACCEL)
            self.rect = self.surface.get_rect( center = center_vaisseau)
            for sprite in explosions:
                screen.blit(sprite.surface, sprite.rect)
            son_explosion.play()
     
        def update(self):
            self.compteur = self.compteur - 1
            if self.compteur == 0:
                self.kill()
     
     
    class Ennemi(pygame.sprite.Sprite):
        def __init__(self):
            super(Ennemi,self).__init__()
            self.surface = pygame.image.load('ennemi.png').convert()
            self.surface.set_colorkey((255,255,255),RLEACCEL)
            self.rect = self.surface.get_rect(center=(LARGEUR_ECRAN + 50,
                                                      random.randint(0,HAUTEUR_ECRAN)
                                                      )
                                              )
            self.speed = random.randint(5,10)
     
        def update(self):
            self.rect.move_ip(-self.speed,0)
            if self.rect.right < 0:
                self.kill()
     
    class Vaisseau(pygame.sprite.Sprite):
        def __init__(self):
            super(Vaisseau,self).__init__()
            self.surface = pygame.image.load('vaiss1.png')
            self.surface.set_colorkey((255,255,255),RLEACCEL)
            self.rect = self.surface.get_rect(topleft=(100, 300))
     
        def update(self,pressed_keys):
            if pressed_keys[K_UP]:
                self.rect.move_ip(0,-5)
            if pressed_keys[K_DOWN]:
                self.rect.move_ip(0,5)
            if pressed_keys[K_LEFT]:
                self.rect.move_ip(-5,0)
            if pressed_keys[K_RIGHT]:
                self.rect.move_ip(5,0)
            if pressed_keys[K_SPACE]:
                if len(missiles_vaiss1) < 1:
                    missile = Missile(self.rect.center)
                    missiles_vaiss1.add(missile)
                    all_sprites.add(missile)
     
            if self.rect.left < 0:
                self.rect.left = 0
            if self.rect.right > LARGEUR_ECRAN:
                self.rect.right = LARGEUR_ECRAN
            if self.rect.top <= 0:
                self.rect.top = 0
            if self.rect.bottom >= HAUTEUR_ECRAN:
                self.rect.bottom = HAUTEUR_ECRAN
     
    class Vaisseau2(pygame.sprite.Sprite):
        def __init__(self):
            super(Vaisseau2,self).__init__()
            self.surface = pygame.image.load('vaiss2.png')
            self.surface.set_colorkey((255,255,255),RLEACCEL)
            self.rect = self.surface.get_rect(topleft=(100, 400))
     
        def update(self,pressed_keys):
            if pressed_keys[K_UP]:
                if self.rect.y > 100:
                    self.rect.move_ip(0,-5)
            if pressed_keys[K_DOWN]:
                if self.rect.y < HAUTEUR_ECRAN :
                    self.rect.move_ip(0,5)
            if pressed_keys[K_LEFT]:
                self.rect.move_ip(-5,0)
            if pressed_keys[K_RIGHT]:
                self.rect.move_ip(5,0)
            if pressed_keys[K_SPACE]:
                if len(missiles_vaiss2) < 1:
                    missile = Missile(self.rect.center)
                    missiles_vaiss2.add(missile)
                    all_sprites.add(missile)
     
            if self.rect.left < 0:
                self.rect.left = 0
            if self.rect.right > LARGEUR_ECRAN:
                self.rect.right = LARGEUR_ECRAN
            if self.rect.top <= 0:
                self.rect.top = 0
            if self.rect.bottom >= HAUTEUR_ECRAN:
                self.rect.bottom = HAUTEUR_ECRAN
     
     
    class Missile(pygame.sprite.Sprite):
        def __init__(self,center_missile):
            super(Missile,self).__init__()
            self.surface = pygame.image.load('missile.png').convert()
            self.surface.set_colorkey((255,255,255),RLEACCEL)
            self.rect = self.surface.get_rect(center=center_missile)
            son_missile.play()
     
        def update(self):
            self.rect.move_ip(15,0)
            if self.rect.left > LARGEUR_ECRAN:
                self.kill()
     
    class Score(pygame.sprite.Sprite):
        def __init__(self):
            super(Score,self).__init__()
            self._scoreCourant = 0
            self._setText()
     
        def _setText(self):
            self.surface = police_score.render(
                'Score : ' + str(self._scoreCourant),False,(250,0,0)
            )
            self.rect = self.surface.get_rect(
                center=(LARGEUR_ECRAN / 2, 30)
            )
     
        def update(self):
            self._setText()
        def incremente(self,valeur):
            self._scoreCourant += valeur
     
     
    clock = pygame.time.Clock()
     
    pygame.mixer.init()
    son_missile = pygame.mixer.Sound('laser.ogg')
    son_explosion = pygame.mixer.Sound('explosion.ogg')
    fond_sonore = pygame.mixer.music.load('payday.ogg')
    pygame.mixer.music.play(-1,0.0)
     
    pygame.font.init()
    police_score = pygame.font.SysFont('Comic Sans MS',60)
     
    #############
    pygame.init()
    #############
     
    pygame.display.set_caption('Shooter')
    AJOUTE_ENEMY = pygame.USEREVENT + 1
    pygame.time.set_timer(AJOUTE_ENEMY,1000)
     
    AJOUTE_ETOILE = pygame.USEREVENT + 2
    pygame.time.set_timer(AJOUTE_ETOILE,1500)
     
    screen = pygame.display.set_mode([LARGEUR_ECRAN,HAUTEUR_ECRAN])
    background = pygame.image.load('nuit.png').convert()
    x_background = 0
     
    all_sprites = pygame.sprite.Group()
    missiles_vaiss1 = pygame.sprite.Group()
    missiles_vaiss2 = pygame.sprite.Group ()
    ennemies = pygame.sprite.Group()
    explosions = pygame.sprite.Group()
    etoiles = pygame.sprite.Group()
    vaisseaux = pygame.sprite.Group()
     
    vaisseau1 = Vaisseau()
    vaisseaux.add(vaisseau1)
    all_sprites.add(vaisseau1)
    score = Score()
    all_sprites.add(score)
     
     
    run = True
    while run:
     
        x_background -= 2
        if x_background > -1500:
            screen.blit(background,(x_background,0))
            screen.blit(background, (x_background + 1500,0))
        else:
            x_background = 0
            screen.blit(background,(x_background , 0))
     
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            elif event.type == AJOUTE_ENEMY:
                nouvel_ennemi = Ennemi()
                ennemies.add(nouvel_ennemi)
                all_sprites.add(nouvel_ennemi)
     
            elif event.type == AJOUTE_ETOILE:
                etoile = Etoile()
                etoiles.add(etoile)
                all_sprites.add(etoile)
     
     
        for v in vaisseaux:
            liste_vaisseaux_touche = pygame.sprite.spritecollide(v,ennemies,True)
            if len(liste_vaisseaux_touche) > 0:
                v.kill()
                for vaiss in liste_vaisseaux_touche:
                    explosion = Explosion(vaiss.rect.center)
                    explosions.add(explosion)
                    all_sprites.add(explosion)
                    run = False
                    pygame.mixer.music.stop()
     
     
        for missile in missiles_vaiss1:
            liste_ennemis_touché = pygame.sprite.spritecollide(missile,ennemies,True)
            if len(liste_ennemis_touché) > 0:
                missile.kill()
                score.incremente(len(liste_ennemis_touché))
                for ennemi in liste_ennemis_touché:
                    explosion = Explosion(ennemi.rect.center)
                    explosions.add(explosion)
                    all_sprites.add(explosion)
     
        for missile in missiles_vaiss2:
            liste_ennemis_touché = pygame.sprite.spritecollide(missile,ennemies,True)
            if len(liste_ennemis_touché) > 0:
                missile.kill()
                score.incremente(len(liste_ennemis_touché))
                for ennemi_2 in liste_ennemis_touché:
                    explosion = Explosion(ennemi.rect.center)
                    explosions.add(explosion)
                    all_sprites.add(explosion)
     
        touche_appuyee = pygame.key.get_pressed()
     
        vaisseau1.update(touche_appuyee)
        explosions.update()
        missiles_vaiss1.update()
        missiles_vaiss2.update()
        ennemies.update()
        etoiles.update()
        score.update()
     
     
        for sprite in all_sprites:
            screen.blit(sprite.surface,sprite.rect)
        pygame.display.flip()
        clock.tick(60)
     
    pygame.time.delay(3000)
    pygame.quit()

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    mai 2019
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : mai 2019
    Messages : 187
    Points : 36
    Points
    36
    Par défaut
    J'ai finalement trouvé une solution .
    J'ai d'abord crée mon instance vaiss2 = Vaisseau2() en dehors de ma boucle sans l'ajouter a mes groupes de sprites ( all_sprites = pygame.sprite.Group() et vaisseaux = pygame.sprite.Group() ), crée pour les collisions et l'affichage .
    Puis cette fois dans la boucle j'ai fait ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     if score._scoreCourant > 9:
            vaisseaux.add(vaiss2)
            all_sprites.add(vaiss2)
            vaiss2.update(touche_appuyee)
            fond_ecran(background)
        else:
            fond_ecran(background2)
    Par contre , j'ai de nouveau un autre soucis .
    A chaque tour de boucle , les coordonnées x , y de mon premier vaisseau sont actualisées . Je souhaiterai les récupérer et surtout pouvoir les envoyer en dehors de ma boucle while a destination de ma classe Vaisseau2 .

    D'avance , mille merci pour votre aide .

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    26 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 26 660
    Points : 216 709
    Points
    216 709
    Billets dans le blog
    109
    Par défaut
    Bonjour,

    Pour récupérer les coordonnées hors du boucle, il faudrait créer une variable, définie hors de la boucle.
    Pour envoyer les données, vous pouvez créer une nouvelle fonction, pour votre classe.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    mai 2019
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : mai 2019
    Messages : 187
    Points : 36
    Points
    36
    Par défaut
    Merci beaucoup d'avoir pris la peine de me répondre .
    Ok pour la variable hors boucle .
    Concretement , il faudrait que je passe la derniere valeur de vaiss1.rect.x ainsi que vaiss1.rect.y pour l'initialisation de l'instance vaiss2 dans ma classe Vaisseau2.
    Voici cette classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      class Vaisseau2(pygame.sprite.Sprite):
        def __init__(self):
            super(Vaisseau2, self).__init__()
            self.surface = pygame.image.load('vaiss2.png')
            self.surface.set_colorkey((255, 255, 255), RLEACCEL)
            self.rect = self.surface.get_rect(center=( ... , ... ))
    J'avoue ne pas trop comment savoir faire pour implémenter cette nouvelle fonction que vous me suggérez et ou la placer exactement .

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    26 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 26 660
    Points : 216 709
    Points
    216 709
    Billets dans le blog
    109
    Par défaut
    Ce que vous pourriez faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vaisseau2 = Vaisseau2()
    vaisseau2.rect.x = vaisseau1.rect.x
    Et cela devrait marcher.

    Autrement, je vous conseille la lecture d'un cours Python, car votre problématique n'est pas pygame, mais la façon d'écrire du code.
    Aussi, un autre conseil, je dirai qu'il ne faut pas faire une nouvelle classe par vaisseau, mais une classe Vaisseau, qui prend un identifiant ou la texture à utilisée en paramètre. Ainsi, vous pouvez utiliser la même classe pour deux vaisseaux différents (et plus).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    mai 2019
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : mai 2019
    Messages : 187
    Points : 36
    Points
    36
    Par défaut
    Merci pour vos conseils en particulier sur la classe unique Vaisseau , je n' y avais pas pensé . En revanche ce que vous m'avez proposé ne fonctionne pas a l'intérieur de la boucle , ni a l'extérieur d'ailleurs.
    Il n'y a aucun doute que je vais trouver une solution , ce n'est qu'une question de temps . En attendant , je vous remercie pour l'aide que vous m'avez apporté
    Bonne semaine a toutes et a tous

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    26 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 26 660
    Points : 216 709
    Points
    216 709
    Billets dans le blog
    109
    Par défaut
    Soyez plus précis pour exposer votre problème.
    Par exemple, donnez nous :
    • votre code complet (afin que nous puissions essayer de notre côté) ;
    • les messages d'erreur que vous avez.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    mai 2019
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : mai 2019
    Messages : 187
    Points : 36
    Points
    36
    Par défaut
    Bonsoir ,
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
     
    import pygame
    import random
    import time
    import sys
    from pygame import *
     
    LARGEUR_ECRAN = 1500
    HAUTEUR_ECRAN = 844
     
    class Etoile(pygame.sprite.Sprite):
        def __init__(self):
            super(Etoile, self).__init__()
            self.surface = pygame.image.load('etoile.png')
            self.surface.set_colorkey((255, 255, 255), RLEACCEL)
            self.rect = self.surface.get_rect(center=(
                LARGEUR_ECRAN + 20,
                random.randint(0, HAUTEUR_ECRAN),
            )
            )
     
        def update(self):
            self.rect.move_ip(-3.5, 0)
            if self.rect.left < 0:
                self.kill()
     
     
    class Explosion(pygame.sprite.Sprite):
        def __init__(self, center_vaisseau):
            super(Explosion, self).__init__()
            self.compteur = 20
     
            self.surface = pygame.image.load('explosion.png').convert()
            self.surface.set_colorkey((255, 255, 255), RLEACCEL)
            self.rect = self.surface.get_rect(center=center_vaisseau)
            for sprite in explosions:
                screen.blit(sprite.surface, sprite.rect)
            son_explosion.play()
     
        def update(self):
            self.compteur = self.compteur - 1
            if self.compteur == 0:
                self.kill()
     
     
    class Ennemi(pygame.sprite.Sprite):
        def __init__(self):
            super(Ennemi, self).__init__()
            self.surface = pygame.image.load('ennemi.png').convert()
            self.surface.set_colorkey((255, 255, 255), RLEACCEL)
            self.rect = self.surface.get_rect(center=(LARGEUR_ECRAN + 50,
                                                      random.randint(0, HAUTEUR_ECRAN)
                                                      )
                                              )
            self.speed = random.randint(5, 10)
     
        def update(self):
            self.rect.move_ip(-self.speed, 0)
            if self.rect.right < 0:
                self.kill()
     
     
    class Vaisseau(pygame.sprite.Sprite):
        def __init__(self):
            super(Vaisseau, self).__init__()
            self.surface = pygame.image.load('vaiss1.png')
            self.surface.set_colorkey((255, 255, 255), RLEACCEL)
            self.rect = self.surface.get_rect(center=(0, 300))
     
        def update(self, pressed_keys):
            if pressed_keys[K_UP]:
                self.rect.move_ip(0, -5)
            if pressed_keys[K_DOWN]:
                if self.rect.y < HAUTEUR_ECRAN - 100:
                    self.rect.move_ip(0, 5)
            if pressed_keys[K_LEFT]:
                self.rect.move_ip(-5, 0)
            if pressed_keys[K_RIGHT]:
                self.rect.move_ip(5, 0)
            if pressed_keys[K_SPACE]:
                if len(missiles_vaiss1) < 1:
                    missile = Missile(self.rect.center)
                    missiles_vaiss1.add(missile)
                    all_sprites.add(missile)
     
            if self.rect.left < 0:
                self.rect.left = 0
            if self.rect.right > LARGEUR_ECRAN:
                self.rect.right = LARGEUR_ECRAN
            if self.rect.top <= 0:
                self.rect.top = 0
            if self.rect.bottom >= HAUTEUR_ECRAN:
                self.rect.bottom = HAUTEUR_ECRAN
     
     
     
     
    class Vaisseau2(pygame.sprite.Sprite):
        def __init__(self):
            super(Vaisseau2, self).__init__()
            self.surface = pygame.image.load('vaiss2.png')
            self.surface.set_colorkey((255, 255, 255), RLEACCEL)
            self.rect = self.surface.get_rect(center=(self.x,self.y))
     
        def position(self,x,y):
            self.x = x
            self.y = y
     
        def update(self, pressed_keys):
            if pressed_keys[K_UP]:
                if self.rect.y > 50:
                    self.rect.move_ip(0, -5)
            if pressed_keys[K_DOWN]:
                if self.rect.y < HAUTEUR_ECRAN:
                    self.rect.move_ip(0, 5)
            if pressed_keys[K_LEFT]:
                self.rect.move_ip(-5, 0)
            if pressed_keys[K_RIGHT]:
                self.rect.move_ip(5, 0)
            if pressed_keys[K_SPACE]:
                if len(missiles_vaiss2) < 1:
                    missile = Missile(self.rect.center)
                    missiles_vaiss2.add(missile)
                    all_sprites.add(missile)
     
            if self.rect.left < 0:
                self.rect.left = 0
            if self.rect.right > LARGEUR_ECRAN:
                self.rect.right = LARGEUR_ECRAN
            if self.rect.top <= 0:
                self.rect.top = 0
            if self.rect.bottom >= HAUTEUR_ECRAN:
                self.rect.bottom = HAUTEUR_ECRAN
     
    class Missile(pygame.sprite.Sprite):
        def __init__(self, center_missile):
            super(Missile, self).__init__()
            self.surface = pygame.image.load('missile.png').convert()
            self.surface.set_colorkey((255, 255, 255), RLEACCEL)
            self.rect = self.surface.get_rect(center=center_missile)
            son_missile.play()
     
        def update(self):
            self.rect.move_ip(15, 0)
            if self.rect.left > LARGEUR_ECRAN:
                self.kill()
     
     
    class Score(pygame.sprite.Sprite):
        def __init__(self):
            super(Score, self).__init__()
            self._scoreCourant = 0
            self._setText()
     
        def _setText(self):
            self.surface = police_score.render(
                'Score : ' + str(self._scoreCourant), False, (250, 0, 0)
            )
            self.rect = self.surface.get_rect(
                center=(LARGEUR_ECRAN / 2, 30)
            )
     
        def update(self):
            self._setText()
     
        def incremente(self, valeur):
            self._scoreCourant += valeur
     
     
    clock = pygame.time.Clock()
     
    pygame.mixer.init()
    son_missile = pygame.mixer.Sound('laser.ogg')
    son_explosion = pygame.mixer.Sound('explosion.ogg')
    fond_sonore = pygame.mixer.music.load('payday.ogg')
    pygame.mixer.music.play(-1, 0.0)
    pygame.font.init()
    police_score = pygame.font.SysFont('Comic Sans MS', 60)
     
    #############
    pygame.init()
    #############
     
    pygame.display.set_caption('SHOOTER')
    AJOUTE_ENEMY = pygame.USEREVENT + 1
    pygame.time.set_timer(AJOUTE_ENEMY, 1000)
     
    AJOUTE_ETOILE = pygame.USEREVENT + 2
    pygame.time.set_timer(AJOUTE_ETOILE, 1500)
     
    screen = pygame.display.set_mode([LARGEUR_ECRAN, HAUTEUR_ECRAN])
     
    all_sprites = pygame.sprite.Group()
    missiles_vaiss1 = pygame.sprite.Group()
    missiles_vaiss2 = pygame.sprite.Group()
    ennemies = pygame.sprite.Group()
    explosions = pygame.sprite.Group()
    etoiles = pygame.sprite.Group()
    vaisseaux = pygame.sprite.Group()
     
    vaiss1 = Vaisseau()
    vaisseaux.add(vaiss1)
    all_sprites.add(vaiss1)
     
    score = Score()
    all_sprites.add(score)
     
    background = pygame.image.load('nuit.png').convert()
    background2 = pygame.image.load('nuit2.png').convert()
     
    def fond_ecran(background):
        x_background = 0
        x_background -= 2
        if x_background > -1500:
            screen.blit(background, (x_background, 0))
            screen.blit(background, (x_background + 1500, 0))
        else:
            x_background = 0
            screen.blit(background, (x_background, 0))
     
    vaiss2 = Vaisseau2()
    x,y = 0
     
    run = True
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            elif event.type == AJOUTE_ENEMY:
                nouvel_ennemi = Ennemi()
                ennemies.add(nouvel_ennemi)
                all_sprites.add(nouvel_ennemi)
     
            elif event.type == AJOUTE_ETOILE:
                etoile = Etoile()
                etoiles.add(etoile)
                all_sprites.add(etoile)
     
        for v in vaisseaux:
            liste_vaisseaux_touche = pygame.sprite.spritecollide(v, ennemies, True)
            if len(liste_vaisseaux_touche) > 0:
                v.kill()
                for vaiss in liste_vaisseaux_touche:
                    explosion = Explosion(vaiss.rect.center)
                    explosions.add(explosion)
                    all_sprites.add(explosion)
                    run = False
                    pygame.mixer.music.stop()
     
        for missile in missiles_vaiss1:
            liste_ennemis_touché = pygame.sprite.spritecollide(missile, ennemies, True)
            if len(liste_ennemis_touché) > 0:
                missile.kill()
                score.incremente(len(liste_ennemis_touché))
                for ennemi in liste_ennemis_touché:
                    explosion = Explosion(ennemi.rect.center)
                    explosions.add(explosion)
                    all_sprites.add(explosion)
     
        for missile in missiles_vaiss2:
            liste_ennemis_touché = pygame.sprite.spritecollide(missile, ennemies, True)
            if len(liste_ennemis_touché) > 0:
                missile.kill()
                score.incremente(len(liste_ennemis_touché))
                for ennemi_2 in liste_ennemis_touché:
                    explosion = Explosion(ennemi.rect.center)
                    explosions.add(explosion)
                    all_sprites.add(explosion)
     
        touche_appuyee = pygame.key.get_pressed()
     
        if score._scoreCourant > 9:
            vaiss2.position(x,y)
            vaisseaux.add(vaiss2)
            all_sprites.add(vaiss2)
            vaiss2.update(touche_appuyee)
            fond_ecran(background)
        else:
            fond_ecran(background2)
     
        vaiss1.update(touche_appuyee)
        explosions.update()
        missiles_vaiss1.update()
        missiles_vaiss2.update()
        ennemies.update()
        etoiles.update()
        score.update()
     
        x = vaiss1.rect.x
        y = vaiss1.rect.y
     
        for sprite in all_sprites:
            screen.blit(sprite.surface, sprite.rect)
        pygame.display.flip()
        clock.tick(60)
     
    pygame.time.delay(3000)
    pygame.quit()
    sys.exit()
    voici le message d'erreur :


    /home/chris/PycharmProjects/shoot_again/venv/bin/python /home/chris/PycharmProjects/shoot_again/main.py
    pygame 2.1.2 (SDL 2.0.16, Python 3.8.10)
    Hello from the pygame community. https://www.pygame.org/contribute.html
    Traceback (most recent call last):
    File "/home/chris/PycharmProjects/shoot_again/main.py", line 227, in <module>
    vaiss2 = Vaisseau2()
    File "/home/chris/PycharmProjects/shoot_again/main.py", line 108, in __init__
    self.rect = self.surface.get_rect(center=(self.x,self.y))
    AttributeError: 'Vaisseau2' object has no attribute 'x'

    Process finished with exit code 1
    Merci de votre aide .

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    mai 2019
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : mai 2019
    Messages : 187
    Points : 36
    Points
    36
    Par défaut
    J'ai trouvé la solution au problème . Merci de votre aide .
    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Problème au lancement d'un script utilisant PyGame.
    Par Arthur83 dans le forum Programmation multimédia/Jeux
    Réponses: 6
    Dernier message: 04/01/2020, 16h48
  2. Frankie Primerano utilise Pygame pour reproduire le jeu Space Invaders en 1 h 30
    Par Olivier Famien dans le forum Programmation multimédia/Jeux
    Réponses: 11
    Dernier message: 15/12/2015, 12h22
  3. Réponses: 2
    Dernier message: 01/05/2015, 14h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo