Partage
  • Partager sur Facebook
  • Partager sur Twitter

Collision entre 2 personnages en mouvement

    16 mai 2015 à 15:38:31

    Bonjour a vous, je créer ce sujet pour vous demander de l'aide par rapport a un mini-jeu sur lequel je travaille. Il s'agit d'une sorte de mini "zelda" dans lequel on a un link de super nes, on se déplace sur une petite map et il y a un ennemi a tuer. Rien de très compliqué, j'ai réussi une bonne parti des étapes mais il me reste tout ce qui concerne de se battre avec le monstre. Mon soucis c'est que j'ai regardé de nombreux topic au niveau de la collision mais, pour la plupart il s'agit de sprite (mur) et moi ce sont des classes (des personnages qui se mouvent). Je vous demande votre aide car j'ai très envie de pouvoir apprendre a faire tout ça et continuer mon mini-jeux ! Merci beaucoup  a vous :)

    Je vous mets mon code : (j'ai déjà essayé pas mal de chose mais sans succès jusqu’à maintenant..)

    """
    Jeu The Legend Of Zelda
    Jeu dans lequel il faut battre les ennemies afin de d'obtenir la triforce.
    
    Script Python
    Fichiers : dklabyrinthe.py, classes.py, constantes.py, n1 + 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))
    #Icone
    icone = pygame.image.load(image_icone)
    pygame.display.set_icon(icone)
    #Titre
    pygame.display.set_caption(titre_fenetre)
    
    import time
    import random
    
    #BOUCLE PRINCIPALE
    continuer = 1
    while continuer:        
            #Chargement et affichage de l'écran d'accueil
            accueil = pygame.image.load(image_accueil).convert()
            fenetre.blit(accueil, (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
                                    
                            
                    
    
            #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 Link et de l'Ennemy
                    lk = Perso("images/lk_droite.png", "images/lk_gauche.png", "images/lk_haut.png", "images/lk_bas.png", "images/lk_space_droite.png", "images/lk_space_gauche.png", "images/lk_space_haut.png", "images/lk_space_bas.png", niveau)
                    
                    enmy = Ennemy("images/enmy_droite.png", "images/enmy_gauche.png", "images/enmy_haut.png", "images/enmy_bas.png", niveau)
                    
            dep = ("droite", "gauche", "haut", "bas")
            timer = time.clock()                        
            #BOUCLE DE JEU
            while continuer_jeu:
            
                    #Limitation de vitesse de la boucle
                    pygame.time.Clock().tick(80)
                    
                    if time.clock() - timer > 1:  
                                    r = random.randrange(4)
                                    enmy.deplacer("enmy"+dep[r])
     
                            #Modification du précédent timer
                                    timer = time.clock()
                                    
                            
                                    if r == 0:
                                            enmy.deplacer('enmy.droite')
                                            
                                    if r == 1:
                                            enmy.deplacer('enmy.gauche')
                                            
                                    if r == 2:
                                            enmy.deplacer('enmy.haut')
                                            
                                    if r == 3:
                                            enmy.deplacer('enmy.bas')
    
                                    print(r)
    
                    
                    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 Link
                                    if event.key == K_RIGHT:
                                            lk.deplacer('lk.droite')
                                            
                                    if event.key == K_LEFT:
                                            lk.deplacer('lk.gauche')
                                            
                                    if event.key == K_UP:
                                            lk.deplacer('lk.haut')
                                            
                                    if event.key == K_DOWN:
                                            lk.deplacer('lk.bas')
                                            
                                    if event.key == K_SPACE:
                                            lk.deplacer('space_droite')      
                                            
                                    if event.key == K_a:
                                            lk.deplacer('space_gauche')
                                            
                                    if event.key == K_w:
                                            lk.deplacer('space_haut')
                                            
                                    if event.key == K_s:
                                            lk.deplacer('space_bas')
    
    
                            
                    #Affichages aux nouvelles positions
                    fenetre.blit(fond, (0,0))
                    niveau.afficher(fenetre)
                    fenetre.blit(lk.direction, (lk.x, lk.y)) #lk.direction = l'image dans la bonne direction
                    fenetre.blit(enmy.direction, (enmy.x, enmy.y))
                    pygame.display.flip()
    
                    #Victoire -> Retour à l'accueil
                    if niveau.structure[lk.case_y][lk.case_x] == 'a':
                            continuer_jeu = 0
    

    Il y'a aussi une autre dossier classes (que j'ai importé tout en haut) je ne l'ai pas mis la pour évité de faire trop long mais si vous voulez le voir dite le moi ! :)

    • Partager sur Facebook
    • Partager sur Twitter
      16 mai 2015 à 18:34:11

      Je re-écris un commentaire car en me relisant j'ai trouvé que ma question n'était pas assez explicite, pour ce qui est du combat (j'ai maintenant réussi a faire une parti ^^). Je voudrais savoir comment faire pour que lorsque j'appui sur une touche si l'ennemi est a côté celui-ci meurt. J'ai tenté quelque chose comme ça : 
      if event.key == K_d:
                                              lk.deplacer('space_droite')
                                              if ((lk.x, lk.y) == (enmy.x + 1, enmy.y)):
                                                      enmy = 0
      sauf que j'arrive pas a faire disparaître ma classe ennemy (enmy).. Help :/
      • Partager sur Facebook
      • Partager sur Twitter
        16 mai 2015 à 21:04:28

        Pourquoi tu t’embêtes avec les classes et les coordonnées pour gérer le positionnement... ?


        Je pense que tu aurais bien plus à gagner à utiliser l'objet Rect.

        • Partager sur Facebook
        • Partager sur Twitter
          16 mai 2015 à 21:26:28

          Alors c'est vraiment tout con.. Mais j'ai jamais réussi a utilisé ce #@%§£$*µ d'objet Rect. Non plus sérieusement je me perd a chaque fois avec ça et mon prof me l'a expliqué 15x et rien a faire je comprend toujours pas... Si tu te sens en mesure de m'éclairé je te suis mais alors va vraiment falloir m'expliquer comme un enfant de 2 mois ^^

          • Partager sur Facebook
          • Partager sur Twitter
            17 mai 2015 à 14:33:06

            Nan parce que moi aussi j'utilise des classes ( notamment pour gérer l'orientation, mais aussi pour certaines aptitudes que peuvent avoir mes persos par exemple ), mais pour le positionnement j'utilise l'objet rect...


            Il y a effectivement beaucoup de sujets qui demandent de l'aide concernant la collision, car sans l'objet Rect, c'est un peu compliqué à manipuler, alors vraiment, il faudrait que t'essayes de le comprendre.

            Je ne suis malheureusement pas le plus apte à t'expliquer comment il fonctionne, mes explications sont trop foireuses et je débute aussi dans Python, as-tu lu des tutos tel que celui de openclassroom au sujet de Pygame ?

            Je me demande vraiment comment tu peux arriver à comprendre tout ce que tu as fait mais pas le fonctionnement de l'objet Rect...

            • Partager sur Facebook
            • Partager sur Twitter
              17 mai 2015 à 19:46:54

              Bah je sais pas trop non plus.. Fin je connais quand même Rec mon prof me l'a expliqué 10x mais je suis vraiment naze avec donc j'essaie vraiment de l'utiliser le moins possible.. (tu ne saurais pas comment résoudre mon problème par hasard ? Même avec Rec ! Je prend tout ça m'énerve de rester bloquer la.. :/)

              • Partager sur Facebook
              • Partager sur Twitter

              Collision entre 2 personnages en mouvement

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown