悬停只对第一个按钮有效

2024-10-02 10:24:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的代码中:

class text:
    def __init__(self, size, message, color, position, button = False, action = None):
        self.size = size
        self.message = message
        self.color = color
        self.position = position
        self.text_size = pygame.font.SysFont(None, int(size*displaywidth))
        self.Textsurface = self.text_size.render(self.message, True, self.color)
        Textrect = self.Textsurface.get_rect()
        self.Textrect = Textrect
        self.Textwidth = Textrect[2]
        self.Textheight = Textrect[3]
        self.second_x_pos = Textrect[2] + position[0]
        self.second_y_pos = Textrect[3] + position[1]
        self.button = button
        self.action = action



    def display(self):
        self.Textrect.topleft = (self.position)
        gameWindow.blit(self.Textsurface, self.Textrect)




        if self.button == True:
            self.Textrect.topleft = (self.position)
            gameWindow.blit(self.Textsurface, self.Textrect)
            for event in pygame.event.get():
                if event.type == pygame.MOUSEMOTION: 
                    if   self.position[0] < event.pos[0] < self.second_x_pos and self.position[1] < event.pos[1] < self.second_y_pos:
                            print("yee")
                            self.color = white
                            self.Textsurface = self.text_size.render(self.message, True, self.color)
                            gameWindow.blit(self.Textsurface, self.Textrect)
                    else:

                            self.Textsurface = self.text_size.render(self.message, True, self.color)


                    if event.type == pygame.MOUSEBUTTONUP :

                        self.action()  

# menu screen
    def menu_screen():
        global wine 
        global purple 
        menu = True
        global displaywidth
        global displayheight
        global gameWindow
        global compltely_red 
        global brown 
        global red 




    # Texts

    menu_txt = text(0.2,"Timm", red, (displaywidth/2,displayheight/9))
    Play_txt = text(0.04, "Play ", wine, (displaywidth/7, displayheight/1.5), True, game_loop)
    parallel_button = displaywidth - (displaywidth/7) - Play_txt.Textwidth
    Quit_txt = text(0.04, "Quit ", compltely_red, (parallel_button, displayheight/1.5), True, quit_Everything)




    #loop

    while menu == True:


        #the loop
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit_Everything()


            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    quit_Everything()
                if event.key == pygame.K_f:
                        displaywidth = 1920
                        displayheight = 1080
                        gameWindow = pygame.display.set_mode((displaywidth,displayheight), pygame.FULLSCREEN)
                if event.key == pygame.K_g:
                        displaywidth = 960
                        displayheight = 960
                        gameWindow = pygame.display.set_mode((displaywidth,displayheight))
        gameWindow.fill(green)

        menu_txt.display()
        Play_txt.display()
        Quit_txt.display()
        pygame.display.update()

我调用的第一个按钮(“播放”按钮)工作得很好(我还不关心动作,目前对我来说重要的是悬停)。 但是第二个按钮非常容易出错(当我把调用按钮的顺序颠倒过来时,第一个按钮总是很好地工作)


Tags: textselfeventtruesizeifdisplayposition
1条回答
网友
1楼 · 发布于 2024-10-02 10:24:45

第一件事:在“帧”之间没有停顿——即检查程序中的事件——所以一切都尽可能快地完成,使用100%的CPU——更糟糕的选择。正确的方法是在调用pygame.display.update之后等待几十毫秒—在该调用之后立即调用pygame.time.delay(30)

您在那里得到的代码虽然设计不好,但几乎可以正常工作,但有一点——当您调用pygame.event.get时,它会获取队列中的所有事件。因此,在主循环上对get的调用选择所有事件时存在一些竞争条件,但是由于代码的不暂停特性,在第一个按钮的display方法中,第二个调用选择了一些事件

当你放置我上面建议的暂停时,即使是第一个按钮的悬停也应该停止——因为它只是碰巧工作的,帧之间的暂停将修复这个机会

现在,您有两个选项—如果要继续检查对象中代码中的事件,它们不应该自己调用pygame.events.get—而是在每个帧上对此进行一次调用,并将结果分配给一个变量—它们将该变量作为参数传递给应处理事件的所有位置:

在菜单屏幕上,执行以下操作:

while menu:  #
    #the loop
    events = pygame.event.get()
    for event in events:
         ...
    gameWindow.fill(green)
    menu_txt.display(events)
    Play_txt.display(events)
    Quit_txt.display(events)

在课文课上:

def display(self, events):
    ...
    if self.button:  # Please, just stop checking truthiness doing "x == True" 
        self.Textrect.topleft = (self.position)
        gameWindow.blit(self.Textsurface, self.Textrect)
        for event in events:
            if event.type == pygame.MOUSEMOTION: 

这会解决你的问题和你设计中的很多问题。不过,请注意,只有当鼠标实际移动时,它们才会高亮显示文本-如果鼠标悬停,但不移动,则不会生成MOUSEMOTION事件。因此,您可以检查鼠标位置本身是否在button rect内,而不是检查事件—您可以直接获得鼠标位置,而不是依赖于事件。此外,在使用Pygame时,您可能更喜欢使用Pygame的矩形计算函数,而不是令人不快的self.position[0] < event.pos[0] < self.second_x_pos and self.position[1] < event.pos[1] < self.second_y_pos表达式。
__init__上:

self.rect = pygame.Rect(self.pos + tuple(Textrect[2:])

if上检查指针是否在rect内:

def display(self, events):
   if self.button:
      if self.rect.contains(pygame.mouse.get_pos() + (1,1)):
           print("yee")
           ...

相关问题 更多 >

    热门问题