繁体   English   中英

Pygame如何从图像列表中检测点击

[英]Pygame how to detect clicks from a list of images

对于我的关卡屏幕,我为每个关卡按钮使用图像,页面上有 15 个。 我能够使用一些迭代和数学以漂亮的布局将它们全部 blit 到屏幕上,我一直试图找出一种方法来通过点击检测来做到这一点。 但我不想在一页上键入“var = get_rect”15 次。

所有的图像都在一个列表中进行迭代,

self.levels_p1 = [self.l1, self.l2, self.l3, self.l4, self.l5,
                     self.l6, self.l7, self.l8, self.l9, self.l10,
                     self.l11, self.l12, self.l13, self.l14, self.l15,]

并像这样以 5 x 3 的尺寸添加到屏幕上,

            for i, lvl in enumerate(self.levels_p1, start=1):
                x = ((WIDTH - 100) * (i % 5) // 6) + 17
                y = HEIGHT // 10 + ((i // 5) * 125)
                if i % 5 == 0:
                    x = ((WIDTH - 100) * 5 // 6) + 17
                    y = HEIGHT // 10 + (((i // 5) - 1) * 125)
                self.screen.blit(lvl, (x, y))
                if self.level_unlocked < i:
                    self.screen.blit(self.level_shade, (x, y))

我一直在检测这样的点击,

            mousepos = pg.mouse.get_pos()

            for event in pg.event.get():
                if event.type == pg.QUIT:
                    pg.quit()
                if event.type == pg.MOUSEBUTTONDOWN:
                    #to menu
                    if self.back_rect.collidepoint(*mousepos):
                        on_levels = False
                        self.swipe.play()
                        self.start()
                    #to levels2 page
                    if self.arrow_rect.collidepoint(*mousepos):
                        on_levels = False
                        self.swipe.play()
                        self.levels_page2()
                    #to level 1
                    if self.l1_rect.collidepoint(*mousepos):
                        on_levels = False
                        self.swipe.play()
                        self.load_level(1)

但这仅适用于所有级别,如果我为所有按钮手动定义一个矩形,这是我试图避免的。

我想知道是否有一种很好的方法来检测每个按钮上的点击次数 与我在第二个代码位中显示它们的方式类似。

非常感激。

pygame.Surface.blit返回一个包含受影响像素区域的矩形:

self.rect = self.screen.blit(self.level_shade, (x, y))

或者,您可以通过get_rect()获取pygame.Surface的边界矩形。 这个矩形的位置是 (0, 0)。 因此,您必须通过关键字参数设置位置:

self.rect = self.level_shade.get_rect(topleft = (x, y)) 
if self.arrow_rect.collidepoint(*mousepos)

我不知道你在上面那行打包的是什么。 如果你想检测点击,我认为你应该先获得鼠标位置。 我会做这样的事情:

for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
            if event.type == pg.MOUSEBUTTONDOWN:
                #to menu
                mousepos = pg.mouse.get_pos() #Here lies the magic and no need to unpack
                if self.back_rect.collidepoint(mousepos):
                    on_levels = False
                    self.swipe.play()
                    self.start()
                #to levels2 page
                if self.arrow_rect.collidepoint(mousepos):
                    on_levels = False
                    self.swipe.play()
                    self.levels_page2()
                #to level 1
                if self.l1_rect.collidepoint(mousepos):
                    on_levels = False
                    self.swipe.play()
                    self.load_level(1) 

如果这解决了您的问题,请告诉我,它仍然不会让我知道!

编辑:尝试 if/elif 块而不是 if。

        mousepos = pg.mouse.get_pos()
        lvls = []

        for i, lvl in enumerate(self.levels_p1):
            #x, y topleft for 5x3 grid with easement and centered
            x = ((WIDTH - 100) * (i % 5) // 5) + 110
            y = HEIGHT // 10 + ((i // 5) * 125)
            #add to screen
            temp = self.screen.blit(lvl, (x, y))
            #if not unlocked
            if self.level_unlocked < i:
                #darken
                self.screen.blit(self.level_shade, (x, y))
            #if unlocked
            else:
                #enlarged version if hovering over and unlocked
                if temp.collidepoint(*mousepos):
                    self.screen.blit(self.levels_1l[i], (x-6, y-6))
                #rect list for click detection
                lvls.append(temp)

        #back button interactive
        if self.back_rect.collidepoint(*mousepos):
            self.screen.blit(self.t_back2, self.back_rect2)  # bigger
        else:
            self.screen.blit(self.t_back, self.back_rect)  # normal
        #arrow button interactive
        if self.arrow_rect.collidepoint(*mousepos):
            self.screen.blit(self.arrowr2, self.arrow_rect2)  # bigger
        else:
            self.screen.blit(self.arrowr, self.arrow_rect)  # normal

        pg.display.flip()
        #all button presses
        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
            if event.type == pg.MOUSEBUTTONDOWN:
                #to menu
                if self.back_rect.collidepoint(*mousepos):
                    on_levels = False
                    self.swipe.play()
                    self.start()
                #to levels2 page
                if self.arrow_rect.collidepoint(*mousepos):
                    on_levels = False
                    self.swipe.play()
                    self.levels_page2()
                #to level
                for i, val in enumerate(lvls):
                    #if clicked pos = level pos
                    if lvls[i].collidepoint(*mousepos):
                        on_levels = False
                        self.swipe.play()
                        #level to load
                        self.load_level(i+1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM