微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检测鼠标是否悬停在按钮上? PyGame按钮类在悬停时不显示文本或更改颜色

如何解决如何检测鼠标是否悬停在按钮上? PyGame按钮类在悬停时不显示文本或更改颜色

我在pygame中创建了一个按钮类,尽管按钮本身在显示,但我的文本没有显示。另外,当鼠标悬停在按钮上时,我还有一些条件可以更改颜色。我已经在主要功能中使用硬编码值实现了预期的结果,但是我想使用一个类来处理各种按钮,因为我可能有很多按钮。


以下是我正在使用的一些类


字体

class Fonts:
    def __init__(self,font,antialias,text,color,x,y):
        self.font = font
        self.antialias = antialias
        self.text = text
        self.color = color
        self.x = x
        self.y = y

    def draw(self,win):
        win.blit(self.font.render(self.text,self.antialias,(self.color)),(self.x,self.y))

按钮

class Button:
    def __init__(self,y,width,height,fontsize):
        self.color = color
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.text = text
        self.fontsize = fontsize
        self.courier_button_font = pygame.font.SysFont("Courier",self.fontsize)

    def draw(self,pos):
        x,y = pos
        text_width,text_height = self.courier_button_font.size(self.text)
        if self.x < x < self.width and self.y < y < self.height:
            pygame.draw.rect(screen,(211,211,211),self.y,self.width,self.height))
            buttontext = Fonts(courier_font,True,f"{self.text}",BLACK,int(self.width / 2 - text_width / 2),int(self.height / 2 - text_height / 2))
            buttontext.draw(screen)


        else:
            pygame.draw.rect(screen,self.color,(self.width / 2 - text_width / 2),(self.height / 2 - text_height / 2))
            buttontext.draw(screen)

    def isOver(self,y = pos
        if self.x < x < self.width and self.y < y < self.height:
            return True
        else:
            pass

我使用按钮的功能

FiretowerButton = Button(BLACK,810,200,80,30,"Fire Tower",20)

def ShowTowers(mouse):
    mousex,mousey = mouse
    screen.fill((147,207,14))
    FiretowerButton.draw(mouse)

def main():
    run = True
    screen.fill(BLACK)
    # screen.blit(enemy1,(90,90))
    while run:
        mouse = pygame.mouse.get_pos()
        ShowTowers(mouse)
        screen.blit(money_image,(790,0))
        screen.blit(background_image,(0,0))
        enemy1_spawn(wave_number)
        pygame.draw.rect(screen,(770,75,90))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()

        clock.tick(FPS)
        pygame.display.update()

解决方法

条件

if self.x < x < self.width and self.y < y < self.height:

是错误的。您必须评估x < self.x + self.widthy < self.y + self.height

if self.x < x < self.x + self.width and self.y < y < self.y + self.height:
    # [...]

无论如何,我建议pygame.Rect / collidepoint()进行碰撞测试:

button_rect = pygame.Rect(self.x,self.y,self.width,self.height)
if button_rect.collidepoint((x,y):
    # [...]

button_rect可进一步用于绘制矩形:

pygame.draw.rect(screen,(211,211,211),button_rect)

通过使用属性rect而不是单独的属性xywidthheight,可以大大简化代码:

class Button:
    def __init__(self,color,x,y,width,height,text,fontsize):
        self.color = color
        self.rect = pygame.Rect(x,height)
        self.text = text
        self.fontsize = fontsize
        self.courier_button_font = pygame.font.SysFont("Courier",self.fontsize)

    def draw(self,pos):

        button_color = (211,211) if self.rect.collidepoint(pos) else self.color
        pygame.draw.rect(screen,button_color,self.rect)

        text_width,text_height = self.courier_button_font.size(self.text)
        textpos = (self.rect.centerx - text_width // 2,self.rect.centery - text_height // 2)
        buttontext = Fonts(courier_font,True,self.text,BLACK,textpos)
        buttontext.draw(screen)

    def isOver(self,pos):
        return self.rect.collidepoint(pos)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。