2013-07-29 157 views
2

我知道这个标题听起来很像 Detect mouseover an image in Pygame 但是有一个错误。我尝试过从这个问题的两个答案,但它从来没有奏效。这里是我的代码的一部分:在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() 

'嗨'基本上是一个测试使用第一个答案。如果我用鼠标将鼠标悬停在按钮上,我正在尝试更改文本(粗体,下划线等)。它似乎没有工作。

+1

+1使用time.sleep()等待的时间短于最短的时间间隔https://en.wikipedia.org/wiki/Planck_time – NWard

+0

1.什么是问题? 2.你只想调用一个display.flip()。 3.您应该使用MOUSEMOTION事件来检测鼠标悬停。 4.你永远不会清除屏幕。 – ninMonkey

+0

你如何清除屏幕?我已经尝试过在很多地方搜索,但我从未弄明白。那么如何检测单个(或一组)对象上的mousemotion? – JaredCubilla

回答

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()一个矩形,现在当你的鼠标在文本上,将打印检测到控制台

1

下面是用在评论解释正在运行的例子:

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) 

enter image description here