2016-03-01 75 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

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