2017-08-19 59 views
1

即时尝试检测pacman和盒子之间的碰撞,但它不检测任何碰撞,任何帮助或建议?目前我试图创建一个实例列表,但没有奏效,我不知道还有什么要做。它也告诉我要增加更多的细节,但我真的不知道我可以添加要诚实,对不起pygame/python不会检测到精灵之间的碰撞

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) 

回答

2

1 - 您需要更新moviment方法的顶部和左侧位置。看:

# 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 - 你必须与所有的框将verificate碰撞成环,验证

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

不是所有的英雄都穿披肩 – cdd

+0

谢谢。成功在您的项目中! –

0

使用rect.collidelist测试如果吃豆子与在墙上的精灵列表中的墙壁精灵碰撞。只要没有检测到碰撞,它将返回-1

+0

我怎么会在我的代码 – cdd

+0

实现这个我如何落实到我的代码,其有这个错误:Axel Villalonga TypeError:描述符'collidelist'需要一个'pygame.Rect'对象,但收到一个'boxcollisions' – cdd

+0

你应该创建一个列表,用于存储所有用你的边界创建的盒子,然后使用pacman .rect.collidelist(my_boxes_list),而不是只绘制它们,然后使用在后台中绘制它们中的每一个的方法,所以你可以测试pacman和你的盒子之间的碰撞 –