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 04/12/2022, à 11:19

chris7522

defilement images horizontal dans jeux pygame

Bonjour a toutes et a tous ,
     J'ai l'impréssion que le  code de ma class Background n'est pas correct car lorsque je lance le jeu , j'ai dabord la 5 eme image de fond d'ecran qui apparait , puis la 3 eme , puis la 4 eme ,puis la premiere , pour finir avec la 2 eme et ca recommence en boucle .
    J'ai essayé de rendre testable ce code mais il manque tout de meme le dossier " background" avec mes 5 images .jpeg . Peut etre que vous pourriez le tester avec vos images perso .
Merci de votre aide !

import pygame
import random
import os
pygame.init()
clock = pygame.time.Clock()

class Enemyspaceship:
    def __init__(self):
        self.x = 1800
        self.y = 500
        self.vel = 4
        self.cote = 'up'

    def draw(self, win):
        pygame.draw.rect(win, red, (self.x, self.y, 100, 40))
        self.move()

    def move(self):
        if self.x > 1100:
            self.x -= self.vel
        if self.x == 1100:
            if self.cote == 'up':
                if self.y > 0:
                    self.y -= 10
                    if self.y == 100:
                        self.cote = 'down'
            else:
                self.y += 10
                if self.y == 900:
                    self.cote = 'up'

class Background:
    def __init__(self):
        self.image_list = []
        self.images_width = []
        self.n = 0
        self.offset = 0

    def load_images(self):
        for file in os.listdir('background/'):
            image = pygame.image.load(f"background/{file}")
            rect = image.get_rect()
            largeur = rect.width
            self.image_list.append(image)
            self.images_width.append(largeur)

    def update_background(self, screen):
        image1 = self.image_list[self.n]
        image2 = self.image_list[self.n + 1]
        largeur1 = self.images_width[self.n]
        screen.blit(image1, (self.offset, 0))
        screen.blit(image2, (self.offset + largeur1, 0))
        self.offset -= 2
        if abs(self.offset) >= largeur1:
            self.n += 1
            self.offset = 0
        if self.n == len(self.image_list) - 1:
            self.n = 0

screen_w = 1800
screen_h = 1000
win = pygame.display.set_mode((screen_w, screen_h))

backg = Background()
backg.load_images()
enemy = Enemyspaceship()

red = 255, 0, 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    backg.update_background(win)
    enemy.draw(win)
    pygame.display.update()
    clock.tick(60)

Hors ligne

#2 Le 04/12/2022, à 13:39

lann

Re : defilement images horizontal dans jeux pygame

Je ne suis pas très bon en python mais dans ce code :

 def load_images(self):
        for file in os.listdir('background/'):
            image = pygame.image.load(f"background/{file}")
            rect = image.get_rect()
            largeur = rect.width
            self.image_list.append(image)
            self.images_width.append(largeur)

Peut être charge-t-il aléatoirement les images ?

Hors ligne

#3 Le 04/12/2022, à 14:23

chris7522

Re : defilement images horizontal dans jeux pygame

Bonjour Lann et merci beaucoup pour ta réponse .
A chaque fois que je lance le jeu , les fonds d'écran se succèdent dans cet ordre précis et pas de façon aléatoire . Je comprends pas pourquoi ça se déroule de cette façon.

Hors ligne

#4 Le 04/12/2022, à 14:58

pingouinux

Re : defilement images horizontal dans jeux pygame

Bonjour,
Peut-être l'ordre d'affichage est-il l'ordre alphabétique des images, ou l'ordre de leur création ?

Hors ligne

#5 Le 04/12/2022, à 17:12

chris7522

Re : defilement images horizontal dans jeux pygame

Bonjour et merci Pingouinux .
     J'ai renommé mes fichiers image : 1 , 2 , 3 , 4 , 5 .  J'ai annoté a l'aide de gimp pour que je puissse les identifier . Cette fois-ci l'ordre de passage a changé et est toujours le meme : dabord la 1 , puis la 4 , puis la 2, puis la 5 et la 3 pour finir .
Ce sont des images identique , meme taille , meme poids .

Hors ligne

#6 Le 04/12/2022, à 18:07

pingouinux

Re : defilement images horizontal dans jeux pygame

En te plaçant dans le répertoire contenant les images, peux-tu donner le retour de :

ls -lt

Hors ligne

#7 Le 04/12/2022, à 19:11

Compte supprimé

Re : defilement images horizontal dans jeux pygame

Bonjour à tous,

Je vois que ta fonction update_background(self, screen) traite deux images à la fois. Pourquoi? je n'en comprends pas l'intention. Je ne serais pas étonné que ton souci vienne de là.
Tu veux une image de fond qui vient de droite à gauche? C'est ça?
Si oui, je ferais plutôt:

def update_background(self, screen):
        image = self.image_list[self.n]
        largeur = self.images_width[self.n]
        screen.blit(image, (self.offset + largeur, 0))
        self.offset -= 2
        if abs(self.offset) == largeur:
            self.n += 1
            self.offset = 0
        if self.n == len(self.image_list) - 1:
            self.n = 0

#8 Le 04/12/2022, à 20:11

chris7522

Re : defilement images horizontal dans jeux pygame

Bonsoir ,
      Voici le résultat de la commande ls -lt:

chris@chris:~/PycharmProjects/Paris_invaders/background$ ls -lt
total 6676
-rw-rw-r-- 1 chris chris 1413511 déc.   4 07:39 5.jpg
-rw-rw-r-- 1 chris chris 1418797 déc.   4 07:38 4.jpg
-rw-rw-r-- 1 chris chris 1417289 déc.   4 07:31 3.jpg
-rw-rw-r-- 1 chris chris 1415824 déc.   4 07:30 2.jpg
-rw-r--r-- 1 chris chris 1158689 août  21 18:10 1.jpg

@MPython Alaplancha:
     Il faut qu'il y ai 2 images d'engagé pour qu'il n'y ai pas de rupture , puis lorsque les 2 sont passé , ca recommence ...
     Le code ne vient pas de moi , je n'y serai pas parvenu seul .

La c'est un peu le meme principe mais avec 1 seule image :

width = 1000
height = 500
bg_img = pygame.image.load('Images/bg.jpg')

i = 0
runing = True
while runing:
    window.fill((0, 0))
    window.blit(bg_img, (i, 0))
    window.blit(bg_img, (width + i, 0))
    if (i == -width):
        window.blit(bg_img,(bg_img,(width + i , 0))
        i = 0
    i  -= 1
    for event in pygame.event.get():
        if event.type == QUIT:
            runing = False
    pygame.display.update()
pygame.quit()

J'oubliai , les images doivent avancer de droite a gauche
Voila l'ensemble :
https://github.com/chris2275/Paris_invaders1.git

Dernière modification par chris7522 (Le 04/12/2022, à 20:17)

Hors ligne

#9 Le 04/12/2022, à 20:56

Compte supprimé

Re : defilement images horizontal dans jeux pygame

chris7522 a écrit :

@MPython Alaplancha:
     Il faut qu'il y ai 2 images d'engagé pour qu'il n'y ai pas de rupture , puis lorsque les 2 sont passé , ca recommence ...

Ok, je vois.
Du coup, j'ai testé (avec 3 images) et ça semble faire le job
J'ai juste par habitude utilisé Pathlib au lieu de os pour lire les images:

import pygame
import random
from pathlib import Path 

pygame.init()
clock = pygame.time.Clock()

class Background:
    def __init__(self):
        self.image_list = []
        self.images_width = []
        self.n = 0
        self.offset = 0

    def load_images(self):
        path = Path('/tmp/backround')
        for file in path.glob('*'):
            image = pygame.image.load(str(file))
            rect = image.get_rect()
            largeur = rect.width
            self.image_list.append(image)
            self.images_width.append(largeur)

    def update_background(self, screen):
        image1 = self.image_list[self.n]
        image2 = self.image_list[self.n + 1]
        largeur1 = self.images_width[self.n]
        screen.blit(image1, (self.offset , 0))
        screen.blit(image2, (self.offset + largeur1, 0))
        self.offset -= 2
        if abs(self.offset) >= largeur1:
            self.n += 1
            self.offset = 0
        if self.n == len(self.image_list)-1:
            self.n = 0


screen_w = 1800
screen_h = 1000
win = pygame.display.set_mode((screen_w, screen_h))

backg = Background()
backg.load_images()
#enemy = Enemyspaceship()
red = 255, 0, 0
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    backg.update_background(win)
    #enemy.draw(win)
    pygame.display.update()
    clock.tick(60)

#10 Le 05/12/2022, à 09:55

chris7522

Re : defilement images horizontal dans jeux pygame

De mon coté , j'ai éssayé avec une autre série d'image et toujours confronté au meme probleme . Je vais passer a autre chose , je finirai par trouver une solution en temps voulu .
      Merci de m'avoir apporté votre aide . Bonne semaine

Hors ligne

#11 Le 05/12/2022, à 10:41

Compte supprimé

Re : defilement images horizontal dans jeux pygame

Bonjour,
Il n'y a aucune raison que cela ne marche pas aussi chez toi. ( J'ai refait le test avec 5 images )
Fais un copié collé du code présenté en #9.
Au lieu de  path = Path('/tmp/backround'), met le chemin complet de ton dossier.
Ajoute un print(file) dans la boucle for file in path.glob('*.jpg'): , histoire de voir dans quel ordre sont lus les fichiers...

Dernière modification par Compte supprimé (Le 05/12/2022, à 10:41)

#12 Le 05/12/2022, à 10:50

pingouinux

Re : defilement images horizontal dans jeux pygame

chris7522 #1 a écrit :
   def load_images(self):
        for file in os.listdir('background/'):
            image = pygame.image.load(f"background/{file}")
            rect = image.get_rect()
            largeur = rect.width
            self.image_list.append(image)
            self.images_width.append(largeur)

D'après le help, os.listdir retourne une liste dans un ordre arbitraire. Tu pourrais essayer de trier le résultat.

   def load_images(self):
        ma_liste=os.listdir('background/')  # Ligne ajoutée
        ma_liste.sort()                     # Ligne ajoutée
        for file in ma_liste:               # Ligne modifiée
            image = pygame.image.load(f"background/{file}")
            rect = image.get_rect()
            largeur = rect.width
            self.image_list.append(image)
            self.images_width.append(largeur)

Hors ligne

#13 Le 05/12/2022, à 10:55

Compte supprimé

Re : defilement images horizontal dans jeux pygame

D'après le help, os.listdir retourne une liste dans un ordre arbitraire. Tu pourrais essayer de trier le résultat.

Ce qui expliquerait pourquoi chez moi cela fonctionne. Encore une raison de préfèrer pathlib à os ... wink

#14 Le 05/12/2022, à 12:38

chris7522

Re : defilement images horizontal dans jeux pygame

Après le tri avec .sort() , ca fonctionne !  Un grand merci  pour avoir , une nouvelle fois , solutionner mon probleme !
Un petit bémol tout de meme , avec une liste de 5 images par exemple , la 5 eme n'est pas lu , on passe de l'image 4  a l'image 0 directement . Mais c'est pas grave .

Hors ligne

#15 Le 05/12/2022, à 14:05

pingouinux

Re : defilement images horizontal dans jeux pygame

Dans update_background, j'ai l'impression que ce test

        if self.n == len(self.image_list) - 1:
            self.n = 0

devrait être

        if self.n == len(self.image_list):
            self.n = 0

Hors ligne

#16 Le 05/12/2022, à 19:04

chris7522

Re : defilement images horizontal dans jeux pygame

J'avais éssayé mais lorsque  la derniere image arrive , ca plante :

Traceback (most recent call last):
  File "/home/chris/PycharmProjects/code_minimal/main.py", line 55, in <module>
    backg.update_background(win)
  File "/home/chris/PycharmProjects/code_minimal/main.py", line 29, in update_background
    image2 = self.image_list[self.n + 1]
IndexError: list index out of range

Process finished with exit code 1

Hors ligne

#17 Le 05/12/2022, à 19:54

pingouinux

Re : defilement images horizontal dans jeux pygame

Essaye ceci (que je ne peux pas tester) :

    def update_background(self, screen):
        longueur_liste=len(self.image_list)                      # Ligne ajoutée
        num_suivant= 0 if self.n==longueur_liste-1 else self.n+1 # Ligne ajoutée
        image1 = self.image_list[self.n]
        image2 = self.image_list[num_suivant]                    # Ligne modifiée
        largeur1 = self.images_width[self.n]
        screen.blit(image1, (self.offset, 0))
        screen.blit(image2, (self.offset + largeur1, 0))
        self.offset -= 2
        if abs(self.offset) >= largeur1:
            self.n = num_suivant                                 # Ligne modifiée
            self.offset = 0
#       if self.n == len(self.image_list) - 1:                   # Lignes supprimées
#           self.n = 0

Hors ligne

#18 Le 05/12/2022, à 21:18

chris7522

Re : defilement images horizontal dans jeux pygame

Félicitation , ca fonctionne !
La 3 eme ligne est une sorte de compréhension ou pas du tout ?

Hors ligne

#19 Le 05/12/2022, à 21:48

pingouinux

Re : defilement images horizontal dans jeux pygame

chris7522 #18 a écrit :

La 3 eme ligne est une sorte de compréhension ou pas du tout ?

C'est une expression conditionnelle.

X if condition else Y

L'expression vaut X si condition est vraie, et Y si elle est fausse.

Hors ligne