Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/04/2022, à 20:25

chris7522

Creation d'une instance a un certain score ( pygame python)

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 .

Voici on code :

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()

J'ai essayé de faire quelque chose comme ca :

if score._scoreCourant == 2:
    vaisseau2 = Vaisseau2()
    vaisseaux.add(vaisseau2)
    all_sprites.add(vaisseau2)

     Mais j'ai un probleme de portee de variable , mon instance crée " vaisseau2 " , n'est pas reconnu dans ma boucle run  lorsque je fais un vaisseau2.update()  pour actualiser mon deplacement .
     J'ai beau tourner ca dans tous les sens , je ne trouve pas de solution .

Hors ligne

#2 Le 07/04/2022, à 09:14

Compte supprimé

Re : Creation d'une instance a un certain score ( pygame python)

Bonjour,
Tu ne retournes pas l'exception rencontrée. Du coup, je ne sais pas vraiment ce que tu as essayé. De plus, tu fournis un code non testable.
Ceci étant dit, si tu testes ton attribut _scoreCourant dans la boucle while, ça devrait marcher ...

#3 Le 07/04/2022, à 20:45

chris7522

Re : Creation d'une instance a un certain score ( pygame python)

Bonsoir ,
Je te remercie d'avoir pris la peine de me répondre . 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 :

    if score._scoreCourant > 9:
        vaisseaux.add(vaiss2)
        all_sprites.add(vaiss2)
        vaiss2.update(touche_appuyee)
        fond_ecran(background)
    else:
        fond_ecran(background2)

    Lorsque mon score atteint 10 points , mon 2 ème  vaisseau se place a 50 pixels sous le 1 er chacun tirant dans la meme direction simultanément , et j'en profite pour changer le background .

Hors ligne

#4 Le 08/04/2022, à 13:14

chris7522

Re : Creation d'une instance a un certain score ( pygame python)

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 .
    J'ai pensé a faire ca mais ca ne fonctionne pas :

class Vaisseau2(pygame.sprite.Sprite):
    def __init__(self,pos1,pos2):
        super(Vaisseau2, self).__init__()
        self.pos1 = pos1
        self.pos2 = pos2

        self.surface = pygame.image.load('vaiss2.png')
        self.surface.set_colorkey((255, 255, 255), RLEACCEL)
        self.rect = self.surface.get_rect(center=(self.pos1,self.pos2))

     J'ai declaré mes variables avant ma boucle

Hors ligne

#5 Le 11/04/2022, à 08:51

Compte supprimé

Re : Creation d'une instance a un certain score ( pygame python)

Bonjour,

chris7522 a écrit :

et surtout pouvoir les envoyer en dehors de ma boucle while a destination de ma classe Vaisseau2 .

où est le souci?

class Vaisseau:
    pass
v = Vaisseau()

while True:
    v.x = x
    v.y = y
    ....

#6 Le 11/04/2022, à 13:47

chris7522

Re : Creation d'une instance a un certain score ( pygame python)

Bonjour et merci de ta réponse .
Dans la boucle , j'ai fait :
v.x = vaiss1.rect.x
v.y = vaiss1.rect.y
Puis comme tu me l'a dit , hors de la boucle :
v = Vaisseau2()
Ensuite dans ma classe Vaisseau2 , après l'initialisation :
self.x =0
self.y=0
Mais je récupère pas les coordonnées de vaiss1.rect.x et vaiss1.rect.y
Je suis vraiment nul . Tu penses que je devrai plutôt me mettre au tricot ?

Hors ligne

#7 Le 11/04/2022, à 14:45

Compte supprimé

Re : Creation d'une instance a un certain score ( pygame python)

T'es pas nul. Il y a pas de mauvais élèves, juste des mauvais pédagogues...
D'ailleurs je t'ai répondu à la va vite, et mon exemple ne te servira pas à grand chose pour l'écriture de ton code .
Celui ci devrait être plus explicite:

class Vaisseau:
    def bouge(self, x,y):
        print(f"le vaisseau bouge aux coordonnées, x={x}, y={y}")
v = Vaisseau()
x = y = 0
while x<20:
    x += 1
    y += 2
    v.bouge(x, y)

#8 Le 13/04/2022, à 10:17

chris7522

Re : Creation d'une instance a un certain score ( pygame python)

Bonjour,
Merci pour ton aide . J'ai essayé ca dans ma classe :

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 + 50))

    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

Et j'ai ce 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 219, in <module>
    vaiss2 = Vaisseau2()
  File "/home/chris/PycharmProjects/shoot_again/main.py", line 101, in __init__
    self.rect = self.surface.get_rect(center=(self.x , self.y + 50))
AttributeError: 'Vaisseau2' object has no attribute 'x'

Process finished with exit code 1

L'ensemble du code :

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 + 50))

    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 = 0
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 > 1:
        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() 

    Je voulais récupérer les coordonnées du premier vaisseau a la volée au moment meme ou je créer le 2eme vaisseau (pour l'initialiser), c'est a dire lorsque le score est de 10 points , en décalant quand meme la position en y du 2eme de 50 pixels pour ne pas qu'ils se chevauche . Je ne pense pas que ce soit possible de le faire .
    Ne te prends pas la tete , c'est pas grave . Je te remercie quand meme pour tes conseils !

Hors ligne

#9 Le 13/04/2022, à 17:17

Compte supprimé

Re : Creation d'une instance a un certain score ( pygame python)

Lorsque tu instancies ta classe self.x, self.y n'existe pas d'où l'exception rencontrée.
Après comme je ne peux pas tester ton code et que je n'utilise pas pygame, à part des conseils généraux je ne peux guère t'aider d'avantage.
mon conseil: si tu buttes sur quelque chose toujours simplifier une situation à son expression minimale (écrire la partie du code qui pose soucis dépouillé du corps du programme afin de comprendre ce qu'il fait/sur ce qu'il devrait faire)

#10 Le 14/04/2022, à 11:52

kholo

Re : Creation d'une instance a un certain score ( pygame python)

salut...
vu le nombre de demandes que tu fais sur l'avancement de ton jeu,
je pense qu'il serait bien de mettre la totalité de ton code ainsi que des fichiers sur internet
... un dépôt git par exemple...
même si ton jeu n'est pas terminé, ce serait très pratique pour avoir une meilleure vue du fonctionnement complet de ton code wink
... et je serais curieux d'y mettre mon nez lol

Hors ligne

#11 Le 14/04/2022, à 14:00

Compte supprimé

Re : Creation d'une instance a un certain score ( pygame python)

kholo a écrit :

... et je serais curieux d'y mettre mon nez lol

Bonjour Kholo,
Belle proposition! Toujours aussi généreux à ce que je vois wink
J'espère que tout ce passe bien pour toi, ça fait plaisir de te savoir encore là.
(Je suis @pseudofab, si tu me remets ...)

#12 Le 16/04/2022, à 12:25

kholo

Re : Creation d'une instance a un certain score ( pygame python)

salut MPython Alaplancha... oui, bien sûr que je sais bien qui tu es !!!
... et salut chris7522 !
outre ma demande d'avoir tout le code et les images surtout... je commence par qq réflexions...
ps : je ne sais que trop bien que c'est compliqué de coder quand on ne maîtrise pas tout...
tu arrives au moment où ton code se complique pour ajouter des fonctions
alors je vais me permettre des remarques qui te sembleront peut être rébarbatives

c'est bien de faire de la POO... mais c'est dommage que la partie principale du programme change de paradigme...
quelques petites classes pour instancier la partie, le scoring, les mouvements,... seraient un plus...

sinon...
pk ces deux imports :

import pygame
from pygame import *

... et le import * est à éviter !
si tu veux raccourcir tes lignes, par exemple,

import pygame as pg

simplifiera l'écriture et la lecture
comme ça quand tu appelles pygame, tu mets juste pg.xxxx
avec xxxx une méthode ou une propriété

ces valeurs devrait pouvoir se récupérer autrement

LARGEUR_ECRAN = 1500
HAUTEUR_ECRAN = 844
infoObject = pygame.display.Info()
pygame.display.set_mode((infoObject.current_w, infoObject.current_h))

pour l'utilisation de Super(), il faut encore que je potasse les héritages...
ça tombe bien, je cherchais une bonne excuse pour m'y coller...

class Score(pygame.sprite.Sprite):
    def __init__(self):
        super(Score, self).__init__()

je vais voir si c'est une bonne pratique

Vaisseau2 pourrait hériter de Vaisseau

pour tes class Vaisseau, les update() pourraient être gérées différemment...
cette suite de if n'est pas très pythonienne...
j'utiliserais plus un dictionnaire et des méthodes
et en vision de l'héritage et pour une amélioration future (explosion du vaisseau par exemple)
je créerais une propriété pour l'image du vaisseau... et d'autres propriétés pour les emplacements
(pour répondre à ta question de ce fil... mais je vais y revenir)

bien sûr, je n'ai pas pu tester ce code
(d'où ma demande précédente de mise en dépôt de tout ton code !  wink )

class Vaisseau(pygame.sprite.Sprite):
    def __init__(self, v_sprite:str='vaiss1.png'):
        """ """
        super(Vaisseau, self).__init__()
        self.surface = pygame.image.load(v_sprite)
        self.surface.set_colorkey((255, 255, 255), RLEACCEL)
        self.rect = self.surface.get_rect(center=(0, 300))
        ## TODO
        # self.missiles = pygame.sprite.Group()


        self.keys = {
            K_UP : self.k_up,
            K_DOWN : self.k_down,
            K_LEFT : self.k_left,
            K_RIGHT : self.k_right,
            K_SPACE : self.k_space,
        }

    def k_up(self):
        self.rect.move_ip(0, -5)
    def k_down(self):
        if self.rect.y < HAUTEUR_ECRAN - 100:
            self.rect.move_ip(0, 5)
    def k_left(self):
        self.rect.move_ip(-5, 0)
    def k_right(self):
        self.rect.move_ip(5, 0)
    def k_space(self):
        if len(missiles_vaiss1) < 1:
            missile = Missile(self.rect.center)
            missiles_vaiss1.add(missile)
            all_sprites.add(missile)

    def update(self, pressed_keys):
        """ """
        self.keys[pressed_keys]()

        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

là je crée un dictionnaire avec des objets en index, je ne sais pas si c'est fonctionnel...
mais tu auras compris le principe...

pour la fin et la programmation événementielle, je ne suis pas fan des variables globales...
du coup dans tes classes, on voit apparaître des variables qui viennent d'on ne sait où...

if len(missiles_vaiss1) < 1:

pour ne pas en mettre trop... je vais finir par cette histoire de récupérer les coordonnées du vaisseau :
c'est en rapport direct avec les variables globales...

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 + 50))

    def position(self,x,y):
        self.x = x
        self.y = y

comme le dit fab ;°) tu mets deux nouvelles propriétés qui ne viennent de nul part...

        ...
        self.x = x
        self.y = y
        ...

car dans la partie code événementiel...

vaiss2 = Vaisseau2()
x = 0
y = 0

et là tu vas direct au casse pipe !

je pense qu'en suivant mes préconisations, et en restructurant ton code,
ce sera plus facile de le faire évoluer et d'ajouter tes fonctions...

Hors ligne