Python Pygame spritecollide给了我一个很严重的错误

Python Pygame spritecollide给了我一个很严重的错误,python,pygame,collision,Python,Pygame,Collision,我正在使用pygame创建一个破砖游戏。除了碰撞之外,我已经把所有的事情都安排好了。我尝试使用collide_rect,但它不起作用,但没有给我错误消息。我尝试使用SpriteClide,但它给我错误消息Ball对象不可编辑。我的目标是检测障碍,移除它,并增加分数。对不起,我的代码有点乱。 这是我的代码(碰撞检测在底部附近): 我正在使用PyCharm 请告诉我该怎么办。 谢谢问题在于条件 if(ballX>=mouseX或ballX=mouseX或ballX欢迎使用堆栈溢出!请将您的代码简化为

我正在使用pygame创建一个破砖游戏。除了碰撞之外,我已经把所有的事情都安排好了。我尝试使用collide_rect,但它不起作用,但没有给我错误消息。我尝试使用SpriteClide,但它给我错误消息Ball对象不可编辑。我的目标是检测障碍,移除它,并增加分数。对不起,我的代码有点乱。 这是我的代码(碰撞检测在底部附近):

我正在使用PyCharm 请告诉我该怎么办。
谢谢

问题在于条件


if(ballX>=mouseX或ballX=mouseX或ballX欢迎使用堆栈溢出!请将您的代码简化为问题的一部分。您当前的代码包含许多与您的问题无关的内容-最小样本通常看起来类似于良好的单元测试:仅执行一项任务,并指定输入值用于再现性。我还没有全部阅读但是这个立即的重新分配看起来很可疑:
balls=pygame.sprite.Group()\balls=ball.ball(ballX,ballY,ballSize)
。另外,如果您使用的是PyCharm,那么我会处理所有灰色的曲线:-)。@FiddleStix设置balls=ball.ball(ballX,ballY,ballSize)使调用代码更容易。我也尝试过不调用“balls”,但仍然不起作用。感谢提示。我尝试检查与块的碰撞(block1)使用collide_-rect但这不起作用。对于桨,我使用坐标对桨进行了编码。我没有收到错误消息,但当我运行代码时,什么都没有发生。如果发生碰撞,它应该会增加分数,但不会。我理想情况下希望使用SpriteClide,但当我尝试使用它时,它会说“'ball'对象不可编辑”。谢谢您的帮助。我可以使用collide_-rect使块碰撞正常工作。SpriteClide仍然会给我iterable错误,但这没关系。我正在尝试使用更多的块,但第二个块没有检测到碰撞。我复制了相同的定义和collide_-rect函数,并将其从block1更改为block3。block1仍然有效s、 但是block3没有。@MiPlayer123对于组中的多个块,您必须使用
spritecollide
对于单个精灵,您必须使用
collide\u rect
如果pygame.Sprite.spritecollide(球,block1,True):打印(“碰撞”)但是它给了我一个错误“Block”对象没有属性“sprites”,我不知道为什么
import pygame
import paddle
import ball
import block
import time
import random
import math
screenW, screenH = 1280, 720

backroundColor = [0,0,0]

offset = 30
PaddleW = 200
PaddleH = 25
PaddleX = screenW / 2 - PaddleW / 2
PaddleY = screenH - PaddleH - offset

n = 10
blockW = screenW / n #128 per block
blockH = blockW /4 + 10
pygame.init()
pygame.display.set_caption("Brick Breaker")
Display = pygame.display.set_mode((screenW, screenH))
Display.fill(backroundColor)

player = paddle.Paddle(PaddleX, PaddleY, PaddleW, PaddleH)

ballSize = 12
ballX = PaddleX
ballY = PaddleY-20
ballSpeed = -4
ballMoveY = ballSpeed
ballMoveX = ballSpeed
balls = pygame.sprite.Group()
balls = ball.Ball(ballX, ballY, ballSize)
#ballDraw = ball.Ball.draw(Display)

lives = 3
score = 0
shiftX = 0
shiftY = 0

#blocks init
'''blocks = pygame.sprite.Group()
blocks = []'''

#block1 = pygame.sprite.Group()
block1 = block.Block(10,60,blockW,blockH)

counter = 0
def displayText(text, color, posX, posY, size):
    str(text)
    font = pygame.font.SysFont('impact', size)
    textWrite = font.render(text, True, color)
    Display.blit(textWrite, (posX, posY))
def waitForKey():
    wait = True
    while wait:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                    pygame.quit()
            keys = pygame.key.get_pressed()
            if keys[pygame.K_SPACE]:
                wait = False


'''m=3
for y in range (4): #Spawn blocks
    for i in range (0, int(screenW), int(blockW)):
        blocks.append(block.Block(i+2, blockH*(y+2), blockW-4, blockH-4))'''
block1.draw(Display)
#blocks.draw = (14,14,14,14)

FPSClock = pygame.time.Clock()
FPS = 144

GameOver = False
Display.fill([130,140,230])
displayText('Brick Breaker', [200,230,100], 450,100, 80)
displayText('Use the mouse to move the paddle and bounce the ball. Try to break the bricks and not die.', [220,10,10], 120, 300,30)
displayText('Press space to begin', [0,0,0],520,510, 30)
pygame.display.flip()
waitForKey()
while not GameOver:
    counter += 1/FPS
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            if GameOver == False:
                GameOver = True
    mouseX = pygame.mouse.get_pos()[0]
    Display.fill(backroundColor)
    player.draw(Display)
    player.move(mouseX)

    balls.move(ballX, ballY) #pygame.draw.circle(Display, [0, 120, 120], [int(ballX), int(ballY)], ballSize)
    balls.draw(Display)

    '''
    for x in range(len(blocks)):
        blocks[x].draw(Display)
    '''
    #Draw blocks
    block1.draw(Display)

    if ballX <= 0:
        ballMoveX = -ballSpeed
        pygame.mixer.music.load("GungaGinga.mp3")
        pygame.mixer.music.play(1)
        #shiftX = random.randint(-2,2)
        #shiftY = -shiftX
    elif ballX >= screenW:
        ballMoveX = ballSpeed
        pygame.mixer.music.load("GungaGinga.mp3")
        pygame.mixer.music.play(1)
        #shiftX = random.randint(-2, 2)
        #shiftY = -shiftX
    if ballY <= 0:
        ballMoveY = -ballSpeed
        pygame.mixer.music.load("GungaGinga.mp3")
        pygame.mixer.music.play(1)
        #shiftY = random.randint(-2, 2)
        #shiftX = -shiftY
    elif ballY >= screenH:

        pygame.mixer.music.load("OOF.mp3")
        pygame.mixer.music.play(1)
        ballMoveY = ballSpeed
        lives -= 1
        ballX = PaddleX
        ballY = PaddleY - 20
        balls.move(ballX, ballY)
        #shiftX = 0
        #shiftY = 0
        time.sleep(1)

    if ballY <= PaddleY + PaddleW and ballY +ballSize >= PaddleY:
        if (ballX >= mouseX or ballX <= mouseX) and (ballX + ballSize <= mouseX + PaddleW/2 and ballX + ballSize >= mouseX - PaddleW/2): # or ballX + ballSize >= mouseX - PaddleW/2
            ballMoveY = -ballMoveY#ballSpeed
            pygame.mixer.music.load("GungaGinga.mp3")
            pygame.mixer.music.play(1)
            pygame.mixer.music.load("OOF.mp3")
            pygame.mixer.music.play(1)
    ballX += ballMoveX
    ballX = ballX +shiftX
    ballY += ballMoveY
    ballY = ballY + shiftY

    displayText('Lives: %s'%lives, [90,190,90], 20, 10, 40)
    displayText('Time: %.1f' %counter, [20,190,90], 1100, 10, 40)
    displayText('Score: %s' % score, [90, 190, 90], 570, 10, 40)
    if counter == 5:
        ballSpeed -= 1

#Collision Test
    #if pygame.sprite.spritecollideany(balls, blocks):
        #blocks.kill(blocks)
    #hitBlock = pygame.sprite.collide_mask(blocks, player)
    '''    def hit(self):
        hit_block = pygame.sprite.groupcollide(blocks, self.balls, False, True)
        if hit_block:
            return True
        else:
            return False'''
    #is_a_collision = pygame.sprite.collide_mask(blocks, balls)
    '''
    if self.hit():
        print("collision")
        score += 10
        blocks.kill(blocks)
        '''
    #collision
    #hit_block = pygame.sprite.spritecollide(balls, block1, False, True)
    #hit_block()
    #pygame.Surface.get_rect(block1)
    #Current colliderect not working
    if pygame.sprite.collide_rect(block1, balls):
        score += 10
        #block1.kill()
        print("collision")

    #Spritecollide not working -  gives error message

    if pygame.sprite.spritecollide(block1, balls,False):
        #block1.kill()
        score += 10



    pygame.display.flip()
    pygame.display.update()
    FPSClock.tick(FPS)
    if (lives <= 0):
        #You died
        Display.fill([130, 140, 230])
        displayText('You Lost', [200, 230, 100], 500, 100, 80)
        displayText('Thanks for trying',[250, 10, 10], 540, 300, 35)
        displayText('Press space to exit', [0, 0, 0], 540, 510, 30)
        pygame.display.flip()
        waitForKey()
        GameOver = True
    #balls.hit()
    '''
    if balls.collide():
        print("collide")
        score += 10
        '''
pygame.quit()
import pygame

class Block(pygame.sprite.Sprite):
    def __init__(self, posx, posy, width, height):
        pygame.sprite.Sprite.__init__(self)
        super().__init__()
        #self.rect = self.image.get_rect()
        self.rect = pygame.Rect(posx, posy, width, height)
        self.posx = posx
        self.posy = posy
        self.height = height
        self.width = width
    def draw (self, Display):
        pygame.draw.rect(Display, [6,130,183], [self.posx, self.posy, self.width, self.height])