2017-08-29 4 views
1

Je suis en train de faire un jeu pacman et j'ai du mal à comprendre comment retirer une pelllet de l'écran après une collision avec elle. J'ai essayé de changer la couleur en noir, mais je ne pouvais pas le faire fonctionner. J'ai ensuite essayé de del l'index de l'élément, mais cela ne fonctionnait pas non plus.Faire un jeu pacman et je ne sais pas comment retirer les boulettes de pac après une collision avec

import pygame 
import os 
import sys 


#initialise the game 
pygame.init() 
screen = pygame.display.set_mode((448, 576)) 
done = False 

y = 416 
x = 232 

#sets up clock and loads pacman image 
clock = pygame.time.Clock() 
PACMANSPRITE = pygame.image.load("pacman.png").convert_alpha() 
PACMAN_MAP = pygame.image.load("pacman_map.png").convert_alpha() 

#gets pacman intro music, sets music to lower volume then plays it 
pygame.mixer.music.load('pacman_beginning.WAV') 
pygame.mixer.music.set_volume(0.01) 
pygame.mixer.music.play(0) 


#box class, used for boxes to border pacmans map 
class boxcollisions(pygame.sprite.Sprite): 
    def __init__(self, x, y): 
     self.y = y 
     self.x = x 
     self.rect = pygame.Rect(self.x, self.y, 12, 12) 
     self.colour = (0, 128, 255) 

    def draw(self, screen): 
     pygame.draw.rect(screen, self.color, self.rect) 

class pointclass(pygame.sprite.Sprite): 
    def __init__(self, x, y): 
     self.y = y 
     self.x = x 
     self.rect = pygame.Rect(self.x, self.y, 12, 12) 
     self.colour = (255, 204, 153) 
     self.score=0 

    def draw(self, screen): 
     pygame.draw.rect(screen, self.colour, self.rect) 

    def addpoint(self): 
     self.score+=1 
     print(self.score) 
     self.colour= (0,0,0) 
     print('why isnt it working') 

#pacmans class 
class pacman(pygame.sprite.Sprite): 
    def __init__(self, image, x, y): 
     self.image = image 
     self.y=416 
     self.x=216 
     self.currentx=self.x 
     self.currenty=self.y 
     self.rect = self.image.get_rect() 
     self.rect.left = self.x 
     self.rect.top = self.y 
     self.rect.width=16 
     self.rect.height=16 

    # move pacman 
    def movement(self): 
     pressed= pygame.key.get_pressed() 
     if pressed[pygame.K_UP]: 
      self.y -= 2 
     if pressed[pygame.K_DOWN]: 
      self.y += 2 
     if pressed[pygame.K_LEFT]: 
      self.x -= 2 
     if pressed[pygame.K_RIGHT]: 
      self.x += 2 
     self.rect.left = self.x 
     self.rect.top = self.y 

    def draw(self, surface): 
     # blit yourself at your current position 
     surface.blit(self.image, (self.x, self.y)) 
     self.currentx=self.x 
     self.currenty=self.y 

    def outofbounds(self): 
     self.y=self.currenty 
     self.x=self.currentx 
     self.rect.left = self.x 
     self.rect.top = self.y 

#instances the pacman class 
sprite = pacman(PACMANSPRITE, x ,y) 


#main game loop 
while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
        done = True 
        pygame.quit() 
        sys.exit() 


    screen.fill((0,0,0)) 
    screen.blit(PACMAN_MAP, (0, 0)) 

    #co-ordinates for boxes to set up map boundaries 
    boxboundaries=[ 
     [], 
     [], 
     [], 
     [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], 
     [1,14,15,28], #5 
     [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28], 
     [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28], 
     [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28], 
     [1,28], 
     [1,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,28], #10 
     [1,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,28], 
     [1,8,9,14,15,20,21,28], 
     [1,2,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,27,28], 
     [1,2,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,27,28], 
     [6,8,9,20,21,23], #15 
     [6,8,9,11,12,13,14,15,16,17,18,20,21,23], 
     [1,2,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,27,28], 
     [1,11,12,13,14,15,16,17,18,28], 
     [1,2,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,27,28], 
     [6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,27,28], #20 
     [6,8,9,20,21,23], 
     [6,8,9,11,12,13,14,15,16,17,18,20,21,23], 
     [1,2,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,27,28], 
     [1,14,15,28], 
     [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28], #25 
     [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28], 
     [1,5,6,23,24,28], 
     [1,2,3,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,26,27,28], 
     [1,2,3,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,26,27,28], 
     [1,8,9,14,15,20,21,28], # 30 
     [1,3,4,5,6,7,8,9,10,11,12,14,15,17,18,19,20,21,22,23,24,25,26,28], 
     [1,3,4,5,6,7,8,9,10,11,12,14,15,17,18,19,20,21,22,23,24,25,26,28], 
     [1,28], 
     [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],     
     ] 


    #point spawn locations 
    pointspawns=[ 
     [], 
     [], 
     [], 
     [], 
     [2,3,4,5,6,7,8,9,10,11,12,13,16,17,18,19,20,21,22,23,24,25,26,27], #5 
     [2,7,13,16,22,27], 
     [2,7,13,16,22,27], 
     [2,7,13,16,22,27], 
     [2,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], 
     [2,7,10,19,22,27], #10 
     [2,7,10,19,22,27], 
     [2,3,4,5,6,7,10,11,12,13,16,17,18,19,22,23,24,25,26,27], 
     [7,22], 
     [7,22], 
     [7,22], #15 
     [7,22], 
     [7,22], 
     [7,22], 
     [7,22], 
     [7,22], #20 
     [7,22], 
     [7,22], 
     [7,22], 
     [2,3,4,5,6,7,8,9,10,11,12,13,16,17,18,19,20,21,22,23,24,25,26,27], 
     [2,7,13,16,22,27], #25 
     [2,7,13,16,22,27], 
     [2,3,4,7,8,9,10,11,12,13,16,17,18,19,20,21,22,25,26,27], 
     [4,7,10,19,22,25], 
     [4,7,10,19,22,25], 
     [2,3,4,5,6,7,10,11,12,13,16,17,18,19,22,23,24,25,26,27], 
     [2,13,16,27], # 30 
     [2,13,16,27], 
     [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],      
     ] 

    #moves pacman 
    sprite.movement() 

    px=0 
    py=-16 

    for row in pointspawns: 
     #y co ordinate 
     py=py+16  
     for n in row: 
      #x co ordinate 
      n=n-1 
      px=n*16 
      point=(pointclass(px, py)) 
      #used to draw points 
      point.draw(screen) 
      if pygame.sprite.collide_rect(sprite, point): 
       point.addpoint() 


    #builds the boxes 
    bx=0 
    by=-16 


    for row in boxboundaries: 
     #y co ordinate 
     by=by+16  
     for n in row: 
      #x co ordinate 
      n=n-1 
      bx=n*16 
      box=(boxcollisions(bx, by)) 
      #used to draw boxes for visual repsentation 
      #box.draw(screen) 
      if pygame.sprite.collide_rect(sprite, box): 
       sprite.outofbounds() 



    #draws pacman 
    sprite.draw(screen) 


    pygame.display.flip() 
    clock.tick(60) 

Répondre

1

Le Je sais que moyen le plus simple (et je ne sais pas beaucoup) utilise pygame.sprite.Group() et pygame.sprite.spritecollide.

La logique de base ici serait, créer un groupe de sprite pour les pastilles, créer chaque pellet comme un sprite et l'ajouter au groupe. À chaque itération de la boucle de jeu, dessinez le groupe de sprites à l'écran et validez s'il y a eu une collision entre le personnage du joueur et l'une des boulettes du groupe des boulettes avec spritecollide. Spritecollide possède un parametre pour eliminer la pastille en cas de collision, donc vous voulez la regler sur true, afin d'eviter de la dessiner dans la boucle suivante.

#Basic logic as example. 

pellets = pygame.sprite.Group() 
#CREATE PELLETS AND ADD THEM TO THE pellets sprite group. 

player = Sprite() 

... 

#IN THE GAME LOOP 

    #Validate if there was a collision. 
    pellets_hit = pygame.sprite.spritecollide(player, pellets, True) #True indicates that, if there were any hit, remove the pellet from the group. 

    if len(pellet_hit): 
     #Increment score or something. 

    ... 

    #Updating the display 
    player.draw(screen) 
    pellets.draw(screen) #If there were any hit, the pellet won't be in this group and won't be drawn 

Ceci est un exemple de projet qui utilise des groupes de sprites et sprites:

+0

malade essayer de le faire en 10 minutes, merci pour l'aide – cdd

+0

ça ne marche pas du tout, c'est IF len (pellet_hit): ça veut dire être juste comme ça? comment puis-je faire de mes pellets un groupe, est-ce que je déclare des pellets en tant que groupe, puis j'ajoute les pellets chaque fois qu'ils sont dessinés ou quelque chose? merci pour votre aide aussi – cdd

+1

la déclaration 'if' oui, il est destiné à être laissé comme ça. Voir 'spritecollide' retire les pellets de votre groupe de pellets et les ajoute à la liste pellets_hit donc' si len (pellets_hit): 'signifie" s'il y a quelque chose dans la liste de pellets_hit "ou" si des boulettes ont été frappées ". Pour la deuxième partie, dans votre cas, vous ajoutez les pastilles au début (avant la boucle de jeu) et chaque fois que vous appelez 'pellets.draw', toutes les sprites du groupe des sprites sont dessinées. – antorqs

0

je me suis dit il après beaucoup de travail

#spawn pellets function 
def spawnpellets(pointspawns): 
    abc=0 
    efg=0 
    px=0 
    py=-16 
    for row in pointspawns: 
     #y co ordinate 
     py=py+16  
     for n in row: 
      #x co ordinate 
      n=n-1 
      px=n*16 
      point=(pointclass(px, py)) 
      #used to draw points 
      point.draw(screen) 
      if pygame.sprite.collide_rect(sprite, point): 
       tempfunc(pointspawns, row, n , py) 

def tempfunc(pointspawns, row, n, py): 
    abc=n+1 
    efg=py/16 
    efg=int(efg) 
    tempindex=row.index(abc) 
    del pointspawns[efg][tempindex] 
    pointspawns[int(efg)].insert(abc,0) 

essentiellement, je devais mettre le frai des les pastilles dans une fonction, puis la détection des collsions comme une autre fonction, puis en utilisant les va-et-vient et n et dans mes boucles j'ai élaboré la liste exacte et les index que je dois utiliser, puis remplace l'élément par un 0 être retracé pas whe ré. désolé si le code semble un peu dérapé et im conscient mes noms de variables sont terribles, mais j'ai littéralement fini maintenant après 2 heures si im va maintenant prendre une pause bien méritée