我正在做一个小游戏,如果你点击一个圆圈,它会发出砰砰的声音并返回到底部.我的问题是,当我切换到使用类和精灵来允许多个圆圈时,它将不再检测是否点击了一个圆圈.我做错了什么?

class Bubble(pygame.sprite.Sprite):
    def __init__(self):

        self.radius = random.randint(50,100)
        self.image = pygame.Surface([self.radius/2,self.radius/2])
        self.image.fill(blue)
        self.image = pygame.image.load(bPath+"Images\\Bubble.png")
        self.rect = self.image.get_rect()
        self.bx = random.randint(70, 1466)
        self.x = self.bx
        self.y = 930
        self.way = 0
        self.rect.x = self.x
        self.rect.y = self.y

    def move(self):
        pygame.draw.circle(tv,blue,(self.x,self.y),self.radius)
        
        self.y -= 2

        if self.x == self.bx+20:
            self.way = 1
        elif self.x == self.bx-20:
            self.way = 0
        else:
            pass

        if self.way == 0:
            self.x += 1
        else:
            self.x -= 1

        if self.y <= 0:
            self.bx = random.randint(70, 1466)
            self.x = self.bx
            self.y = 930
            self.radius=random.randint(50,100)
        else:
            pass

bubbleList = []

nBubble = 0
while True:
    tv.fill(white)

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            for b in bubbleList:
                if b.rect.collidepoint(pygame.mouse.get_pos()):
                    print("hi")
                    pygame.mixer.music.play()

    if pygame.time.get_ticks() > nBubble:
        nBubble += 5000

        if len(bubbleList) < 10:
            bubbleList.append(Bubble())
        else:
            pass
        
    for b in bubbleList:
        b.move()
    
    pygame.display.update()
    FramePerSec.tick(fps)

我已经在这里查看了其他几个类似的帖子,并实现了它们,正如您可能看到的那样.它不会在我的电脑上抛出任何错误,只是单击时什么也不做.

推荐答案

self.xself.y是干什么的?您不需要这些属性.你有self.rect.xself.rect.y.碰撞检测取决于rect属性中存储的位置.

if b.rect.collidepoint(pygame.mouse.get_pos()):

然而,当你改变self.xself.y时,self.rect.xself.rect.y不会神奇地改变.存储在rect属性中的位置与self.xself.y无关.go 掉self.xself.y:

class Bubble(pygame.sprite.Sprite):
   def __init__(self):

       self.radius = random.randint(50,100)
       self.image = pygame.Surface([self.radius/2,self.radius/2])
       self.image.fill(blue)
       self.image = pygame.image.load(bPath+"Images\\Bubble.png")
       self.rect = self.image.get_rect()
       self.bx = random.randint(70, 1466)
       self.way = 0
       self.rect.x = self.bx
       self.rect.y = 930

   def move(self):
       pygame.draw.circle(tv, blue, self.rect.center, self.radius)
       
       self.rect.y -= 2
       if self.rect.x == self.bx+20:
           self.way = 1
       elif self.rect.x == self.bx-20:
           self.way = 0
       else:
           pass

       if self.way == 0:
           self.rect.x += 1
       else:
           self.rect.x -= 1

       if self.rect.y <= 0:
           self.bx = random.randint(70, 1466)
           self.rect.x = self.bx
           self.rect.y = 930
           self.radius=random.randint(50,100)
       else:
           pass

另请参见How do I detect collision in pygame?.

Python相关问答推荐

大Pandas 胚胎中产生组合

使用索引列表列表对列进行切片并获取行方向的向量长度

使可滚动框架在tkinter环境中看起来自然

如何在polars(pythonapi)中解构嵌套 struct ?

Telethon加入私有频道

django禁止直接分配到多对多集合的前端.使用user.set()

递归访问嵌套字典中的元素值

使用NeuralProphet绘制置信区间时出错

如何在TensorFlow中分类多个类

未调用自定义JSON编码器

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

如何在Great Table中处理inf和nans

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

为什么dict. items()可以快速查找?

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

比较两个有条件的数据帧并删除所有不合格的数据帧

高效地计算数字数组中三行上三个点之间的Angular

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?

如何在表单中添加管理员风格的输入(PDF)

try 在单个WITH_COLUMNS_SEQ操作中链接表达式时,使用Polars数据帧时出现ComputeError