#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 ?
<Modéré>
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
@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
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 ...
#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
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