Partage
  • Partager sur Facebook
  • Partager sur Twitter

collisions de tirs (space invader)

    19 mai 2022 à 17:31:11

    Bonjour à tous.

    Pour un projet , nous créons un jeu de type space invader sur python et pygame. Nous sommes à l'étape des collisions des tirs avec les vaisseaux ennemis mais nous bloquons. Et nous ne savons pas par où commencer.

    Voici notre code.

    Merci de votre aide.

    import pygame
    import time
    
    surf = pygame.display.set_mode((800,1000))
    Vaisseau = pygame.image.load("vaisseau.png")
    Tirs = pygame.image.load("tirs.png")
    Ennemi = pygame.image.load("ennemi1.png")
    Ennemi2 = pygame.image.load("ennemi2.png")
    
    run = True
    
    x = 336
    y = 800
    o = 327
    width2 = 1
    height2 = 1
    rectTirs = Tirs.get_rect()
    rectTirs.center = 355, 800
    rectTirs2 = Tirs.get_rect()
    rectTirs2.center = 355, 800
    rectEnnemi = Ennemi.get_rect()
    rectEnnemi.center = 20, -120
    rectEnnemi2 = Ennemi.get_rect()
    rectEnnemi2.center = 230, -120
    
    vel = 5
    #win = pygame.display.set_mode((500, 500))
    
    pygame.display.set_caption("Galaxy Shooter")
    pygame.time.delay(10)
    pygame.init()
    clock=pygame.time.Clock()
    
    #compteur
    compteur = 0
    
    while run :
        compteur+=1
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
    
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and x>0:
            x -= vel
        if keys[pygame.K_RIGHT] and x<664:
            x += vel
    
        surf.fill((0, 0, 0))
    
        if compteur>25 :
            rectTirs = rectTirs.move(0,-9)
            surf.blit(Tirs, rectTirs.center)
            if rectTirs.center[1]==-28:
                rectTirs.center = x+21, 800
        if compteur>80 :
            rectTirs2 = rectTirs2.move(0,-9)
            surf.blit(Tirs, rectTirs2.center)
            if rectTirs2.center[1]==-28:
                rectTirs2.center = x+21, 800
    
        surf.blit(Vaisseau, (x, y))
    
        #pygame.display.update()
    
        m=[
        [0,1,0,0,2,2,0,0,1,0],
        [0,0,1,0,0,0,0,1,0,0],
        [0,0,0,1,0,0,1,0,0,0],
        [0,0,1,0,1,1,0,1,0,0],
        [0,0,0,0,2,2,0,0,0,0],
        [0,0,1,0,0,0,0,1,0,0],
        [0,0,0,0,0,0,0,0,0,0],
        ]
    
        if compteur>150 :
            rectEnnemi = rectEnnemi.move(0,2)
            rectEnnemi2 = rectEnnemi2.move(0,2)
            for t in range(10) :
                for u in range (7) :
                    if m[u][t]==1:
                        surf.blit(Ennemi, (t*80+4,u*80+15))
                    elif m[u][t]==2:
                        surf.blit(Ennemi2, (t*80+1,u*80+15))
    
    
        #colonnes
        pygame.draw.line(surf,(255,255,255),(80,00),(80,1000),2)
        pygame.draw.line(surf,(255,255,255),(160,00),(160,1000),2)
        pygame.draw.line(surf,(255,255,255),(240,00),(240,1000),2)
        pygame.draw.line(surf,(255,255,255),(320,00),(320,1000),2)
        pygame.draw.line(surf,(255,255,255),(400,00),(400,1000),2)
        pygame.draw.line(surf,(255,255,255),(480,00),(480,1000),2)
        pygame.draw.line(surf,(255,255,255),(560,00),(560,1000),2)
        pygame.draw.line(surf,(255,255,255),(640,00),(640,1000),2)
        pygame.draw.line(surf,(255,255,255),(720,00),(720,1000),2)
        pygame.draw.line(surf,(255,255,255),(800,00),(800,1000),2)
        #lignes
        pygame.draw.line(surf,(255,255,255),(00,80),(800,80),2)
        pygame.draw.line(surf,(255,255,255),(00,160),(800,160),2)
        pygame.draw.line(surf,(255,255,255),(00,240),(800,240),2)
        pygame.draw.line(surf,(255,255,255),(00,320),(800,320),2)
        pygame.draw.line(surf,(255,255,255),(00,400),(800,400),2)
        pygame.draw.line(surf,(255,255,255),(00,480),(800,480),2)
        pygame.draw.line(surf,(255,255,255),(00,560),(800,560),2)
    
    
        pygame.display.flip()
    
    pygame.quit()
    
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      19 mai 2022 à 18:10:38

      Salut !

      Ce qui me paraîtrait logique de faire c'est de faire un peu de POO et tester la position des "missiles" et des "vaisseaux" à chaque "rafraichissement" ou moins si trop gourmand. 

      Petits conseils supplémentaires :

      • Il vous faudra certainement limiter les FPS clock = pygame.time.Clock() (avant la boucle - à vérifier) et clock.tick(fps) (dans la boucle)

      • Mais aussi la répétition des touches pygame.key.set_repeat(delay, interval) (avant la boucle)

      • Capturer les touches pressées avec keys = pygame.key.get_pressed() n'est pas la bonne façon de procédée (cf. documentation)

      • Utiliser pygame.display.flip() n'est pas optimal (cf. documentation)

      • Partager sur Facebook
      • Partager sur Twitter
        19 mai 2022 à 19:09:26

        pour les collisions voir pygame.Rect.colliderect ou collidelist  https://www.pygame.org/docs/ref/rect.html#pygame.Rect.colliderect
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          19 mai 2022 à 21:40:11

          umfred a écrit:

          pour les collisions voir pygame.Rect.colliderect ou collidelist  https://www.pygame.org/docs/ref/rect.html#pygame.Rect.colliderect


          Je ne connaissais pas du tout cette partie de pygame, ça doit pas être super optimale si ?
          • Partager sur Facebook
          • Partager sur Twitter
            20 mai 2022 à 11:53:13

            aucune idée des perfs, mais les fonctions existent (il y en a d'autres que celles que j'ai mentionné selon le besoin)
            • Partager sur Facebook
            • Partager sur Twitter

            collisions de tirs (space invader)

            × 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