Me preguntaba cómo escribir código que detectaría el mouse al hacer clic en un sprite. Por ejemplo:Detección de clic de mouse de Pygame
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
Me preguntaba cómo escribir código que detectaría el mouse al hacer clic en un sprite. Por ejemplo:Detección de clic de mouse de Pygame
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
The pygame documentation for mouse events is here. Puede utilizar el método pygame.mouse.get_pressed
en colaboración con pygame.mouse.get_pos
(si es necesario). Pero utilice el evento de clic del mouse a través de un bucle de evento principal. La razón por la cual el ciclo de eventos es mejor se debe a "clics cortos". Es posible que no se den cuenta de esto en las máquinas normales, pero las computadoras que usan clics de tecla en los "trackpads" tienen periodos de clics excesivamente pequeños. Usar los eventos del mouse evitará esto.
EDIT: Para realizar el píxel colisiones perfectas utilizan pygame.sprite.collide_rect()
encontrado en their docs for sprites.
Supongo que su juego tiene un bucle principal, y todos sus sprites están en una lista llamada sprites
.
En su bucle principal, obtenga todos los eventos y verifique el evento MOUSEBUTTONDOWN
o MOUSEBUTTONUP
.
while ... # your main loop
# get all events
ev = pygame.event.get()
# proceed events
for event in ev:
# handle MOUSEBUTTONUP
if event.type == pygame.MOUSEBUTTONUP:
pos = pygame.mouse.get_pos()
# get a list of all sprites that are under the mouse cursor
clicked_sprites = [s for s in sprites if s.rect.collidepoint(pos)]
# do something with the clicked sprites...
Así que, básicamente, debe hacer clic en un sprite cada iteración de la vuelta principal. Deseará usar mouse.get_pos() y rect.collidepoint().
Pygame no ofrece programación basada en eventos, como p. cocos2d hace.
Otra forma sería verificar la posición del cursor del mouse y el estado de los botones, pero este enfoque tiene algunos problemas.
if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()):
print ("You have opened a chest!")
Vas a tener que introducir algún tipo de indicador si se maneja este caso, ya que de lo contrario el código imprimirá "Tiene que haber abierto un cofre!" cada iteración del ciclo principal.
handled = False
while ... // your loop
if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()) and not handled:
print ("You have opened a chest!")
handled = pygame.mouse.get_pressed()[0]
Por supuesto que puede subclase Sprite
y añadir un método llamado is_clicked
así:
class MySprite(Sprite):
...
def is_clicked(self):
return pygame.mouse.get_pressed()[0] and self.rect.collidepoint(pygame.mouse.get_pos())
lo tanto, es mejor utilizar el primer enfoque en mi humilde opinión.
También tenga en cuenta que la posición del mouse también está disponible en el evento en 'event.pos' –
que estaba buscando la misma respuesta a esta pregunta y después de mucho rascarse la cabeza esta es la respuesta que se me ocurrió:
#Python 3.4.3 with Pygame
import pygame
pygame.init()
pygame.display.set_caption('Crash!')
window = pygame.display.set_mode((300, 300))
running = True
# Draw Once
Rectplace = pygame.draw.rect(window, (255, 0, 0),(100, 100, 100, 100))
pygame.display.update()
# Main Loop
while running:
# Mouse position and button clicking.
pos = pygame.mouse.get_pos()
pressed1, pressed2, pressed3 = pygame.mouse.get_pressed()
# Check if the rect collided with the mouse pos
# and if the left mouse button was pressed.
if Rectplace.collidepoint(pos) and pressed1:
print("You have opened a chest!")
# Quit pygame.
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
¿Cómo se aplicaría lo que al hacer clic en un sprite sin embargo? –
@EliasBenevedes Edité mi respuesta con colisiones perfectas de píxeles. – jakebird451