I know this title sounds a lot like
Detect mouseover an image in Pygame
but there's an error. I've tried following both answers from that question, but it never worked. Here is a part of my code:
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()
The 'hi' is basically a test using the first answer. I am trying to make the text change (bold, underline etc.) if I hover over a button with the mouse. It doesn't seem to work.
here is some example code:
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()
you have to create a get to tell exactly where the text is know that there is a rect you use collidepoint()
and now when you mouse over the text it will print Detected to the console
Here's a running example with explanations in the comments:
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)