2016-03-01 79 views
0

我进口pixelperfect和使用其功能之一称为check_collision(object1,object2)这里是我从http://www.pygame.org/wiki/FastPixelPerfect 的网站当我使用函数它总是返回false,我有不知道为什么。如果任何人都可以帮助我,或者有更好的方法来完成像素完美的碰撞,我将不胜感激。Pygame像素完美的碰撞代码不工作

它总是返回false这就是问题所在。

下面的代码:

import pygame, pixelperfect 
from pygame.locals import * 
from pixelperfect import * 

screen = pygame.display.set_mode([640, 480]) 
screen.fill([255,255,255]) 
pygame.display.flip() 

class Ball(object): 
    def __init__(self, picture, speed, loc): 
     self.image = pygame.image.load(picture) 
     self.rect = self.image.get_rect() 
     self.rect.left, self.rect.top = loc 
     self.speed = speed 

    def move(self): 
     self.rect = self.rect.move(self.speed) 

     if self.rect.left < 0 or self.rect.right > screen.get_width(): 
      self.speed[0] = - self.speed[0] 
     elif self.rect.top < 0 or self.rect.bottom > screen.get_height(): 
      self.speed[1] = - self.speed[1] 

ball = Ball("beach_ball.png", [5,5], [0,0]) 
ball.rect.center = [80, 50] 
ball2 = Ball("beach_ball.png", [-5,-5], [200, 200]) 
ball2.rect.center = [100, 200] 
clock = pygame.time.Clock() 

running = True 
while running: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
    screen.fill([255,255,255]) 
    ball.move() 
    ball2.move() 
    if check_collision(ball, ball2): 
     print 'hit' 

    screen.blit(ball.image, ball.rect) 
    screen.blit(ball2.image, ball2.rect) 
    pygame.display.flip() 
    clock.tick(30) 
pygame.quit() 
+0

你的'Ball'类没有'hitmask'属性,所以'check_collision'在它的第一行产生一个AttributeError。 (我发布这个作为评论,而不是一个答案,因为我不知道是否解决这个问题将完全解决问题,或者如果有几个其他的障碍物需要克服,或什么) – Kevin

回答

3

从你提供的页面:

所有对象都必须有一个 '矩形' 属性和 'hitmask' 属性。

您只实施了rect。它使用hitmap来检查是否存在冲突,并且由于您没有提供它会返回false。

编辑: 尝试使用get_full_hitmask(image,rect)来获取一个hitmask,并将其添加到该对象。

+0

你可以给我一个例如,我很新的python和pygame。感谢您的快速回答。 –

+1

我没有安装pixelperfect,只有pygame的,但请尝试以下操作: 添加 'self.hitmask = get_full_hitmask(self.image,self.rect)' 到你的球后级self.speed – JeD

+0

谢谢, 有效!非常感谢。 –