【问题标题】:Mouseover in PygamePygame中的鼠标悬停
【发布时间】:2013-07-29 22:45:45
【问题描述】:

我知道这个标题听起来很像 Detect mouseover an image in Pygame 但有一个错误。我已经尝试遵循该问题的两个答案,但它从未奏效。这是我的代码的一部分:

title = font3.render(('SQUASH!'), True, white)
play = font1.render(('PLAY'), True, white)
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    screen.blit((title), (400, 400))
    screen.blit(play, (theposition))
    if play.collide_point(pygame.mouse.get_pos()):
        hi = font1.render(('hi'), True, white)
        screen.blit(hi, (300, 300))
    pygame.display.flip()
    time.sleep(0.000000000000000000000000000000000000000000000000000000001)
    pygame.display.flip()

“hi”基本上是使用第一个答案的测试。如果我将鼠标悬停在按钮上,我正在尝试更改文本(粗体、下划线等)。它似乎不起作用。

【问题讨论】:

  • +1 用于使用 time.sleep() 等待比最小的有意义的时间划分更短的持续时间en.wikipedia.org/wiki/Planck_time
  • 1.问题是什么? 2.你只想调用一个display.flip()。 3. 您应该使用 MOUSEMOTION 事件来检测鼠标悬停。 4. 你永远不会清屏。
  • 如何清屏?我试过在很多地方搜索它,但我从来没有弄明白。以及如何在单个(或一组)对象上检测鼠标移动?

标签: python python-2.7 mouse pygame mouseover


【解决方案1】:

这里是一些示例代码:

import pygame
from pygame.locals import *
import time

if __name__ == "__main__":
    pygame.init()
    size = (700, 700)
    screen = pygame.display.set_mode(size)
    font = pygame.font.SysFont('Impact',20,16)

    title = font.render(('SQUASH!'), True, (255,255,255))
    play = font.render(('PLAY'), True, (255,255,255))
    play_r = play.get_rect()
    play_r.x, play_r.y = 300,300

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        screen.fill((0,255,0,))
        screen.blit(title, (400, 400))
        screen.blit(play, (300,300))
        if play_r.collidepoint(pygame.mouse.get_pos()):
            print 'Detected'
        time.sleep(0.000000000000000000000000000000000000000000000000000000001)
        pygame.display.flip()

你必须创建一个 get 来准确地知道文本在哪里知道有一个你使用的矩形 collidepoint() 现在当你将鼠标悬停在文本上时,它会在控制台上打印 Detected

【讨论】:

    【解决方案2】:

    这是一个运行示例,在 cmets 中有解释:

    import pygame
    
    pygame.init()
    screen = pygame.display.set_mode((200, 200))
    
    # the 'normal' font
    base_font = pygame.font.SysFont('Arial', 20, 16)
    
    # the 'mouse-over' font
    mod_font  = pygame.font.SysFont('Arial', 20, 16)
    mod_font.set_underline(True)
    
    # always use some kind of cache when rendering font
    # font rendering is very expensive, and it *will*
    # slow down your application if you render some text
    cache = {}
    def render(text, mod=False):
        if not mod in cache: 
            cache[mod] = {}
        if not text in cache[mod]: 
            cache[mod][text] = (mod_font if mod else base_font).render(text, True, (255, 255, 255))
        return cache[mod][text]
    
    # create a list of (text, Rect)-tuples
    x, y = 10, 20
    objetcs = [(t, render(t).get_rect()) for t in ('Hi', 'please', 'click', 'me')]    
    
    # just move some objects around
    for (_, r) in objetcs:
        r.top, r.left = y, x
        x *= 2
        y += 35
    
    # always use a Clock to keep your framerate constant
    clock = pygame.time.Clock()
    
    run = True
    while run:
        # clear the screen
        screen.fill((0, 0, 0))
    
        # draw all objects
        for (t, r) in objetcs:
            # decide if we want to render the text with or without the underline
            # based on the result of collidepoint(pygame.mouse.get_pos())
            # note that collidepoint is a method of Rect, not Surface
            screen.blit(render(t, r.collidepoint(pygame.mouse.get_pos())), r)
    
        # check which item is clicked
        if pygame.event.get(pygame.MOUSEBUTTONDOWN):
            # calling 'render' over and over again is cheap now, since the resut is cached
            for text in [t for (t, r) in objetcs if r.collidepoint(pygame.mouse.get_pos())]:
                print "'{}' was clicked".format(text)
    
        # draw the screen ONCE
        pygame.display.flip()
        if pygame.event.get(pygame.QUIT): run = False
        # clear all unwanted events
        pygame.event.clear()
        clock.tick(60)
    

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 2011-05-26
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多