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 :

Faire défiler une image sous pygame pour un menu [Python 3.X]


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Invité
    Invité(e)
    Par défaut Faire défiler une image sous pygame pour un menu
    Bonsoir,

    voila je doit crée un jeu mais j'ai un probleme pour le menu je voudrais que quand j'appuis sur la fleche ca me mette une autre image en menu, comment faire ? voici mon code j'ai commencé mais j'obtient une erreur
    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
    #!/usr/bin/python3
    # -*- coding: Utf-8 -*
     
    """
    Jeu Donkey Kong Labyrinthe
    Jeu dans lequel on doit déplacer DK jusqu'aux bananes à travers un labyrinthe.
     
    Script Python
    Fichiers : dklabyrinthe.py, classes.py, constantes.py, n1, n2 + images
    """
     
    import pygame
    from pygame.locals import *
     
    from classes import *
    from constantes import *
     
    pygame.init()
     
    #Ouverture de la fenêtre Pygame (carré : largeur = hauteur)
    fenetre = pygame.display.set_mode((cote_fenetre, cote_fenetre))
    #Son
    #Tone = pygame.mixer.music.load("mvt.wav")
    #pygame.mixer.music.play(-1)
    #Icone
    icone = pygame.image.load(image_icone)
    pygame.display.set_icon(icone)
    #Titre
    pygame.display.set_caption(titre_fenetre)
    #score
    points=100
    #fond
    imf = [image_ac1,
           image_ac2]
    imon = [0]
     
    #BOUCLE PRINCIPALE
    continuer = 1
     
    def imfond():
            global continuer, image_selectionner
            for event in pygame.event.get():
                    if event.type == KEYDOWN:
                            if event.key == K_RIGHT and imon ==[0]:
                                    imon = imf[1]
                            elif pressed[pygame.K_LEFT] and imon ==[1]:
                                    imon = imf[0]
     
    while continuer:
     
    	#Chargement et affichage de l'écran d'accueil
    	imfond()
    	fenetre.blit(imon, (0,0))
     
    	#Rafraichissement
    	pygame.display.flip()
     
    	#On remet ces variables à 1 à chaque tour de boucle
    	continuer_jeu = 1
    	continuer_accueil = 1
     
    	#BOUCLE D'ACCUEIL
    	while continuer_accueil:
     
    		#Limitation de vitesse de la boucle
    		pygame.time.Clock().tick(30)
     
    		for event in pygame.event.get():
     
    			#Si l'utilisateur quitte, on met les variables 
    			#de boucle à 0 pour n'en parcourir aucune et fermer
    			if event.type == QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
    				continuer_accueil = 0
    				continuer_jeu = 0
    				continuer = 0
    				#Variable de choix du niveau
    				choix = 0
     
    			elif event.type == KEYDOWN:				
    				#Lancement du niveau 1
    				if event.key == K_F1:
    					continuer_accueil = 0	#On quitte l'accueil
    					choix = 'n1'		#On définit le niveau à charger
    				#Lancement du niveau 2
    				elif event.key == K_F2:
    					continuer_accueil = 0
    					choix = 'n2'
                                    #Lancement du niveau 3
    				elif event.key == K_F3:
    					continuer_accueil = 0
    					choix = 'n3'
    				#Lancement du niveau 4
    				elif event.key == K_F4:
    					continuer_accueil = 0
    					choix = 'n4'
     
     
    	#on vérifie que le joueur a bien fait un choix de niveau
    	#pour ne pas charger s'il quitte
    	if choix != 0:
    		#Chargement du fond
    		fond = pygame.image.load(image_fond).convert()
     
    		#Génération d'un niveau à partir d'un fichier
    		niveau = Niveau(choix)
    		niveau.generer()
    		niveau.afficher(fenetre)
     
    		#Création de Donkey Kong
    		dk = Perso("images/dk_droite.png", "images/dk_gauche.png", 
    		"images/dk_haut.png", "images/dk_bas.png", niveau)
     
     
    	#BOUCLE DE JEU
    	while continuer_jeu:
     
    		#Limitation de vitesse de la boucle
    		pygame.time.Clock().tick(30)
     
    		for event in pygame.event.get():
     
    			#Si l'utilisateur quitte, on met la variable qui continue le jeu
    			#ET la variable générale à 0 pour fermer la fenêtre
    			if event.type == QUIT:
    				continuer_jeu = 0
    				continuer = 0
     
    			elif event.type == KEYDOWN:
    				#Si l'utilisateur presse Echap ici, on revient seulement au menu
    				if event.key == K_ESCAPE:
    					continuer_jeu = 0
     
    				#Touches de déplacement de Donkey Kong
    				elif event.key == K_RIGHT:
    					dk.deplacer('droite')
    					points = points-1
    				elif event.key == K_LEFT:
    					dk.deplacer('gauche')
    				elif event.key == K_UP:
    					dk.deplacer('haut')
    				elif event.key == K_DOWN:
    					dk.deplacer('bas')			
     
    		#Affichages aux nouvelles positions
    		fenetre.blit(fond, (0,0))
    		niveau.afficher(fenetre)
    		fenetre.blit(dk.direction, (dk.x, dk.y)) #dk.direction = l'image dans la bonne direction
    		pygame.display.flip()
     
    		#Victoire -> Retour à l'accueil
    		if niveau.structure[dk.case_y][dk.case_x] == 'a':
    			continuer_jeu = 0
    mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:\Users\Megaport\Desktop\Mini projet 3 donkey kong\dklabyrinthe.py", line 53, in <module>
        fenetre.blit(imon, (0,0))
    TypeError: argument 1 must be pygame.Surface, not list

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Il faut revoir la notion de portée des variables.

    La variable imon de ta fonction imfond ne modifie pas celle définie dans l'espace global de ton script.

    Donc plusieurs moyen de faire cela, soit ta fonction imfond retourne un entier servant d'indice à utiliser sur ta liste imf, soit elle agit directement sur cette liste en inversant les éléments par exemple.
    Le temps ronge l'amour comme l'acide.

  3. #3
    Invité
    Invité(e)
    Par défaut
    je n'est pas tres bien compris, peut tu me donner un debut de code ?

    Cordialement

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Un début de code, non, mais bien te faire comprendre, oui.

    Voici en gros ce que tu fais.

    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
    import random
     
    imon = [0]
    imf = ['A', 'B']
     
    def test():
        i = random.randint(0, 1)
        if i == 0:
            imon = imf[0]
        else:
            imon = imf[1]
        print('imon dans test vaut :', imon)
     
    print('imon au départ vaut', imon)
    test()
    print('imon après appel de test()  vaut :', imon)
    Tu comprends bien qu'à part en indiquant que imon est global dans ta fonction, ça ne peut fonctionner.

    Maintenant en modifiant la fonction test ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def test():
        i = random.randint(0, 1)
        if i == 1:
            imon[0] = imf[0]
        else:
            imon[0] = imf[1]
        print('imon dans test vaut :', imon)
    Là, on modifie le premier élément de la variable globale imon du script.

    C'est plus clair ?
    Le temps ronge l'amour comme l'acide.

  5. #5
    Invité
    Invité(e)
    Par défaut
    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
    imf = [image_ac1,
           image_ac2]
    imon = imf[0]
     
    #BOUCLE PRINCIPALE
    continuer = 1
     
    def imfond():
            for event in pygame.event.get():
                    if event.type == KEYDOWN:
                            if event.key == K_RIGHT and imon ==imf[0]:
                                    imon = imf[1]
                            elif pressed[pygame.K_LEFT] and imon ==imf[1]:
                                    imon = imf[0]
     
    while continuer:
     
    	#Chargement et affichage de l'écran d'accueil
    	imfond()
            accueil = pygame.image.load(imon).convert()
    	fenetre.blit(accueil, (0,0))
     
    	#Rafraichissement
    	pygame.display.flip()
    je viens de voir que le code que j'ai mis n'etait pas bon c'est celui la que j'ai mais qui bug
    sinon j'ai compris votre code mais je ne voit pas trop comment je pourrais l'utiliser

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Ça bug car tu n'as pas pris en compte le premier commentaire. L'index c'est une bonne idée, surtout que ton menu pourrait avoir plus de 2 entrées, et préférer un passage du tableau en paramètre plutôt qu'utiliser une globale.

    Sinon je connais très peu pygame mais le load convert me semble bizarre. Comme ça boucle faudrait que ça soit fait en amont si tes images sont pas déjà des surfaces à blitter.

  7. #7
    Invité
    Invité(e)
    Par défaut
    salut, merci j'ai trouvé ^^ mais j'ai une autre question,
    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
    	while continuer_accueil:
     
    		#Limitation de vitesse de la boucle
    		pygame.time.Clock().tick(30)
     
    		for event in pygame.event.get():
     
    			#Si l'utilisateur quitte, on met les variables 
    			#de boucle à 0 pour n'en parcourir aucune et fermer
    			if event.type == QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
    				continuer_accueil = 0
    				continuer_jeu = 0
    				continuer = 0
    				#Variable de choix du niveau
    				choix = 0
     
    			elif event.type == KEYDOWN:				
    				#Lancement du niveau 1
    				if event.key == K_F1:
    					continuer_accueil = 0
    					choix = 'n1'
    				#Lancement du niveau 2
    				elif event.key == K_F2:
    					continuer_accueil = 0
    					choix = 'n2'
                                    #Lancement du niveau 3
    				elif event.key == K_F3:
    					continuer_accueil = 0
    					choix = 'n3'
    				#Lancement du niveau 4
    				elif event.key == K_F4:
    					continuer_accueil = 0
    					choix = 'n4'
    				#Lancement du niveau 5
    				elif event.key == K_F5:
    					continuer_accueil = 0
    					choix = 'n5'
     
     
    	#on vérifie que le joueur a bien fait un choix de niveau
    	#pour ne pas charger s'il quitte
    	if choix != 0:
    		#Chargement du fond
    		fond = pygame.image.load(image_fond).convert()
     
    		#Génération d'un niveau à partir d'un fichier
    		niveau = Niveau(choix)
    		niveau.generer()
    		niveau.afficher(fenetre)
     
    		#Création de Donkey Kong
    		dk = Perso("images/dk_droite.png", "images/dk_gauche.png", 
    		"images/dk_haut.png", "images/dk_bas.png", niveau)
     
     
    	#BOUCLE DE JEU
    	while continuer_jeu:
     
    		#Limitation de vitesse de la boucle
    		pygame.time.Clock().tick(30)
     
    		for event in pygame.event.get():
     
    			#Si l'utilisateur quitte, on met la variable qui continue le jeu
    			#ET la variable générale à 0 pour fermer la fenêtre
    			if event.type == QUIT:
    				continuer_jeu = 0
    				continuer = 0
     
    			elif event.type == KEYDOWN:
    				#Si l'utilisateur presse Echap ici, on revient seulement au menu
    				if event.key == K_ESCAPE:
    					continuer_jeu = 0
    					defaite = 0
    					score = 80
     
    				#Touches de déplacement de Donkey Kong
    				elif event.key == K_RIGHT:
    					dk.deplacer('droite')
    					score = score-1
    				elif event.key == K_LEFT:
    					dk.deplacer('gauche')
    					score = score-1
    				elif event.key == K_UP:
    					dk.deplacer('haut')
    					score = score-1
    				elif event.key == K_DOWN:
    					dk.deplacer('bas')
    					score = score-1
     
    		#Affichages aux nouvelles positions
    		fenetre.blit(fond, (0,0))
    		niveau.afficher(fenetre)
    		fenetre.blit(dk.direction, (dk.x, dk.y)) #dk.direction = l'image dans la bonne direction
    		smallfont = pygame.font.SysFont("comicsansms", 25)
    		score_aff=smallfont.render(str(score), True, (255,255,255))
    		fenetre.blit(score_aff, (400,-5))
     
    		Startps=time.time()
    		Actualtps=Startps-t
    		text = smallfont.render(str(Actual_Time), True, (255,255,255))
    		textpos = text.get_rect()
    		textpos.centerx = fenetre.get_rect().centerx
    		fenetre.blit(text, textpos)
     
    		pygame.display.flip()
     
     
    		#Victoire -> Retour à l'accueil
    		if niveau.structure[dk.case_y][dk.case_x] == 'a':
    			continuer_jeu = 0
    			defaite = 0
    			score = 80
     
    		#Défaite
    		if score <=0 :
    			continuer_jeu=0
    			score = 80
    			defaite = 1
    	while defaite:
    		gameover = pygame.image.load(image_gameover).convert()
    		fenetre.blit(gameover, (0,0))
    		pygame.display.flip()
    		for event in pygame.event.get(): 
    			if event.type == KEYDOWN:
    				if event.key == K_SPACE:
    					pygame.quit()
    				if event.key == K_ESCAPE:
    					defaite = 0
    					continuer_jeu = 0
    j'ai crée un chrono, mais quand je lance un niveau que je gagne et que je le relance le temps continue de défiller, mais je voudrais que ca recommence a 0 quand je lance un niveau ( meme ou different ) et aussi comment je fait pour que ca ne m'affiche que les secondes car la j'ai par exemple 4......... avec tout les chiffres derriere

  8. #8
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par Ertale Voir le message
    j'ai crée un chrono, mais quand je lance un niveau que je gagne et que je le relance le temps continue de défiller, mais je voudrais que ca recommence a 0 quand je lance un niveau ( meme ou different )
    Si j'ai bien saisi, il suffit d'affecter à la variable t la valeur que tu as défini au départ du jeu, ce qui par déduction semble être time.time()Mais comme je ne comprends pas cette partie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Startps=time.time()
    Actualtps=Startps-t
    text = smallfont.render(str(Actual_Time), True, (255,255,255))
    Cela ne devrait pas être Actualtps au lieu de Actual_Time ?

    Citation Envoyé par Ertale Voir le message
    et aussi comment je fait pour que ca ne m'affiche que les secondes car la j'ai par exemple 4......... avec tout les chiffres derriere
    round ?
    Le temps ronge l'amour comme l'acide.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par Ertale Voir le message
    merci j'ai trouvé ^^ mais j'ai une autre question,
    Cool mais c'est mieux d'indiquer ta solution et créer une nouvelle discussion pour dissocier les sujets. À faire : (re)lire les règles du forum

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

Discussions similaires

  1. Faire défiler une image en fondu
    Par Drakalex007 dans le forum Développement iOS
    Réponses: 5
    Dernier message: 26/03/2014, 20h55
  2. Faire défiler une image
    Par Alba.1337 dans le forum AWT/Swing
    Réponses: 0
    Dernier message: 20/03/2012, 21h06
  3. Faire défiler une image dans un ScrollBox
    Par Duan dans le forum Débuter
    Réponses: 4
    Dernier message: 06/06/2011, 00h55
  4. Réponses: 2
    Dernier message: 24/02/2010, 04h17
  5. Comment faire défiler une image dans un DBImage
    Par kolac dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/04/2006, 13h45

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