python - pygame中面向对象的圆形按钮?

标签 python python-3.x pygame

我想在pygame中制作一个圆形按钮。

我为矩形按钮创建了一个类。 (以下) 但我想把它做成一个圆(还有其他多边形)。 我知道 Surface 中没有 get_cir,它甚至无法使用它。 那我该怎么做呢?

import pygame

class Button():

    def __init__(self, text, x, y, width, height, normal_color, hovered_color,
                 label_color, font_type, font_size, command = None):

        self.text = text
        self.normal_color = normal_color
        self.hovered_color = hovered_color
        self.label_color = label_color
        self.font_type = font_type
        self.font_size = font_size
        self.command = command

        self.image_normal = pygame.Surface((width, height))
        self.image_normal.fill(self.normal_color)

        self.image_hovered = pygame.Surface((width, height))
        self.image_hovered.fill(self.hovered_color)

        self.image = self.image_normal
        self.rect = self.image.get_rect()

        font = pygame.font.SysFont(self.font_type, self.font_size)

        text_image = font.render(text, True, self.label_color)
        text_rect = text_image.get_rect(center = self.rect.center)

        self.image_normal.blit(text_image, text_rect)
        self.image_hovered.blit(text_image, text_rect)

        self.rect.topleft = (x, y)

        self.hovered = False

    def update(self):
        if self.hovered:
            self.image = self.image_hovered
        else:
            self.image = self.image_normal

    def draw(self, surface):
        surface.blit(self.image, self.rect)

    def handle_event(self, event):
        if event.type == pygame.MOUSEMOTION:
            self.hovered = self.rect.collidepoint(event.pos)
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if self.hovered == True:
                self.command()

最佳答案

您可以保持(快速有效的)矩形碰撞检测,当它指示点击时,然后检查事件的 (x,y) 位置距圆心的距离。

distance formula给我们一个函数:

def lineLength( pos1, pos2 ): 
    """Return the distance between the points (pos1) and (pos2)"""
    x1,y1 = pos1
    x2,y2 = pos2
    # length = sqrt((x2 - x1)^2 + (y2 - y1)^2)
    x_squared = ( x2 - x1 ) * ( x2 - x1 )
    y_squared = ( y2 - y1 ) * ( y2 - y1 )
    length = math.sqrt( x_squared + y_squared )
    return length

然后添加一个额外的检查来计算按钮中心和鼠标点击点之间的距离。这应该小于按钮的半径,以便悬停/单击按钮:

def handle_event( self, event ):
    if event.type == pygame.MOUSEMOTION:
        self.hovered = False
        if ( self.rect.collidepoint( event.pos ) ):
            # check click is over the circular button ~
            radius = self.width / 2
            click_distance = lineLength( self.rect.center, event.pos )
            if ( click_distance <= radius ):
                self.hovered = True

关于python - pygame中面向对象的圆形按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57914996/

相关文章:

python - 如何从 Python 中解析 sql 文件?

python - 如何使用python从文件中读取复数

python-3.x - Adafruit 树莓派 neopixel 库抛出错误 "ImportError: No module named _rpi_ws281x"

python - 奇怪的语法错误,我不知道如何解决

python - 来自列表元素的 Dict() ——降低时间复杂度

python - 我无法让 'player' 在 pygame 中双向移动,我该怎么做?

python - 为什么我的二维列表最多包含 2 个项目

python - 访问 if __name__ == "main"中的变量

python - Django on Dreamhost with Passenger : no response to browsers, 没有错误

python - 检测用户是否在pygame中按下@登录