Python Pygame像素完美碰撞代码不工作

Python Pygame像素完美碰撞代码不工作,python,pixel-perfect,Python,Pixel Perfect,我正在导入pixelperfect并使用它的一个名为check_collision(object1,object2)的函数。这是我从网站上获得的 当我使用这个函数时,它总是返回false,我不知道为什么。如果有人能帮助我或有更好的方法来做像素完美碰撞,我将不胜感激 总是返回false,这就是问题所在 代码如下: import pygame, pixelperfect from pygame.locals import * from pixelperfect import * screen =

我正在导入pixelperfect并使用它的一个名为check_collision(object1,object2)的函数。这是我从网站上获得的 当我使用这个函数时,它总是返回false,我不知道为什么。如果有人能帮助我或有更好的方法来做像素完美碰撞,我将不胜感激

总是返回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()
导入pygame,pixelperfect
从pygame.locals导入*
从像素完美导入*
screen=pygame.display.set_模式([640480])
屏幕填充([255255])
pygame.display.flip()
类球(对象):
定义初始(自身、图片、速度、位置):
self.image=pygame.image.load(图片)
self.rect=self.image.get_rect()
self.rect.left,self.rect.top=loc
自身速度=速度
def移动(自我):
self.rect=self.rect.move(self.speed)
如果self.rect.left<0或self.rect.right>screen.get_width():
自速度[0]=-自速度[0]
elif self.rect.top<0或self.rect.bottom>screen.get_height():
自速度[1]=-自速度[1]
ball=ball(“beach_ball.png”[5,5],[0,0])
ball.rect.center=[80,50]
ball2=Ball(“beach_Ball.png”[-5,-5],[200200])
ball2.rect.center=[100200]
clock=pygame.time.clock()
运行=真
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
屏幕填充([255255])
球移动
ball2.move()
如果检查碰撞(球、球2):
打印“命中”
screen.blit(ball.image,ball.rect)
screen.blit(ball2.image,ball2.rect)
pygame.display.flip()
时钟滴答(30)
pygame.quit()

从您提供的页面:

所有对象都必须具有“rect”属性和“hitmask”属性

您只实现了rect。它使用hitmap检查是否存在冲突,因为您没有提供冲突,所以返回false

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

从您提供的页面:

所有对象都必须具有“rect”属性和“hitmask”属性

您只实现了rect。它使用hitmap检查是否存在冲突,因为您没有提供冲突,所以返回false

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

您的
Ball
类没有
hitmask
属性,因此
check_collision
在其第一行引发AttributeError。(我将此作为评论而不是答案发布,因为我不知道修复此问题是否能完全解决问题,或者是否还有其他一些障碍需要克服,或者是什么)您的
Ball
类没有
hitmask
属性,因此
check\u collision
在其第一行引发AttributeError。(我将此作为评论而不是答案发布,因为我不知道修复此问题是否能完全解决问题,或者是否还有其他一些障碍需要克服,或者什么)请给我举个例子,我对python和pygame非常陌生。谢谢您的快速回答。我没有安装pixelperfect,只有pygame,但请尝试以下操作:在self之后向球类添加
self.hitmask=get_full\u hitmask(self.image,self.rect)
。speed@MrBengtg如果答案解决了你的问题,别忘了把它标记为“接受答案”。提前感谢您,欢迎使用SO。请您给我举个例子,我对python和pygame非常陌生。谢谢您的快速回答。我没有安装pixelperfect,只有pygame,但请尝试以下操作:在self之后向球类添加
self.hitmask=get_full\u hitmask(self.image,self.rect)
。speed@MrBengtg如果答案解决了你的问题,别忘了把它标记为“接受答案”。提前感谢您,欢迎光临。