2017-08-19 4 views
1

ich versuche eine Kollision zwischen Pacman und den Boxen zu erkennen, aber keine Kollisionen, irgendwelche Hilfe oder Ratschläge? Im Moment habe ich versucht, eine Liste von Instanzen zu erstellen, aber das hat nicht funktioniert, ich weiß nicht, was ich sonst tun soll. auch sein sagt mir mehr Details hinzufügen, aber ich weiß nicht wirklich, was ich ehrlich zu sein hinzufügen kann, sorrypygame/python erkennt keine Kollision zwischen Sprites

import pygame 
import os 
import sys 

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

y = 320 
x = 216 

#sets up clock and loads pacman image 
clock = pygame.time.Clock() 
PACMANSPRITE = pygame.image.load("pacman.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, 15, 15) 
     self.color = (0, 128, 255) 

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



#pacmans class 
class pacman(pygame.sprite.Sprite): 
    def __init__(self, image, x, y): 
     self.image = image 
     self.y=y 
     self.x=x 
     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 


    def draw(self, surface): 
     """ Draw on surface """ 
     # blit yourself at your current position 
     surface.blit(self.image, (self.x, 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((100,0,0)) 

    #co-ordinates for boxes to set up map boundaries 
    boundaries=[ 

     [], 
     [], 
     [], 
     [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],    

     ] 

    #builds the boxes 
    bx=0 
    by=-16 
    for row in boundaries: 
     #y co ordinate 
     by=by+16  
     for n in row: 
      #x co ordinate 
      n=n-1 
      bx=n*16 
      box = boxcollisions(bx, by) 
      box.draw(screen) 


    #moves pacman 
    sprite.movement() 
    sprite.draw(screen) 

    #tests for collision 
    print(pygame.sprite.collide_rect(sprite, box)) 



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

Antwort

2

1 - Sie müssen die obere und linke Position bei Moviment-Methode aktualisieren. aussehen:

# 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 

2 - Sie haben die Kollision in Schleife verificate, zur Verifikation mit allen Boxen

for row in boundaries: 
    #y co ordinate 
    by=by+16  
    for n in row: 
     #x co ordinate 
     n=n-1 
     bx=n*16 
     box = boxcollisions(bx, by) 
     box_list.append(box) 
     box.draw(screen) 
     if pygame.sprite.collide_rect(sprite, box): 
      print("collided") 
+0

nicht alle Helden tragen Umhänge – cdd

+0

Danke. Erfolg in Ihrem Projekt! –

0

Verwenden rect.collidelist zu testen, ob Pacman mit einer Wand von Sprites in Ihrer Wand Sprites Liste zu kollidieren. Es wird -1 zurückgegeben, solange keine Kollision erkannt wird.

+0

wie würde ich implementieren dies in meinem Code – cdd

+0

wie ich es in meinen Code implementieren, das mit diesem Fehler: Axel Villalonga TypeError: Der Deskriptor 'kollidist' benötigt ein 'pygame.Rect' Objekt aber erhielt eine 'boxcollisions' – cdd

+0

Sie sollten eine Liste erstellen, in der Sie all Ihre Boxen, die mit Ihren Grenzen erstellt wurden, auflisten und dann den Pacman verwenden .rect.collidelist (my_boxes_list), anstatt sie nur zu zeichnen, verwenden Sie eine Methode, die jeden einzelnen im Hintergrund zeichnet, so können Sie die Kollision zwischen Pacman und Ihren Boxen testen –

Verwandte Themen