如何检测鼠标是否悬停在按钮上?PyGame按钮类在悬停时不显示文本或更改颜色 [英] How do I detect if the mouse is hovering over a button? PyGame button class is not displaying the text or changing colour on hover

查看:81
本文介绍了如何检测鼠标是否悬停在按钮上?PyGame按钮类在悬停时不显示文本或更改颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have created a button class in pygame and although the button itself is displaying, my text is not showing up. Also I have some conditions to change the colour when the mouse is over the button. I have achieved the desired result using hard coded values in my main function, however I want to use a class the handle my various button as I might have quite a few buttons.

字体

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, color, x, y, width, height, text, 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.x, 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.x, self.y, self.width, self.height))
            buttontext = Fonts(courier_font, True, f"{self.text}", BLACK,
                               (self.width / 2 - text_width / 2), (self.height / 2 - text_height / 2))
            buttontext.draw(screen)

    def isOver(self, pos):
        x, 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, BLACK, (770, 75, 30, 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.width y<self.y + self.height :

is wrong. You have to evaluate if x < self.x + self.width and y < self.y + self.height:

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

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

Anyway, I recommend to pygame.Rect / collidepoint() for the collision test:

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

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

button_rect can be used further for drawing the rectangle:

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

通过使用属性 rect 而不是单独的属性 x y ,可以大大简化代码.宽度高度:

The code can be simplified a lot by the use of an attribute rect rather than the separate attributes x, y, width, height:

class Button:
    def __init__(self, color, x, y, width, height, text, fontsize):
        self.color = color
        self.rect = pygame.Rect(x, y, width, 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, 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)

这篇关于如何检测鼠标是否悬停在按钮上?PyGame按钮类在悬停时不显示文本或更改颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆