如何在PyGame中响应精灵的鼠标点击?

4
什么是在PyGame中使您的精灵响应鼠标点击的规范方式?
以下是一些简单的内容,可以在我的事件循环中实现:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        exit_game()
    [...]
    elif (  event.type == pygame.MOUSEBUTTONDOWN and
            pygame.mouse.get_pressed()[0]):
        for sprite in sprites:
            sprite.mouse_click(pygame.mouse.get_pos())

关于it技术的一些问题:

  1. 这是响应鼠标点击事件的最佳方式吗?
  2. 如果鼠标在精灵上长时间按住不动怎么办?如何将其转化为单个事件?
  3. 通知所有精灵点击事件的这种方法合理吗?

提前感谢。

1个回答

11

通常我会给我的可点击对象添加点击函数,就像你的例子一样。 我将所有这些对象放在列表中,以便在调用单击函数时轻松迭代。

当检查按下哪个鼠标按钮时,请使用事件的button属性。

import pygame
from pygame.locals import * #This lets you use pygame's constants directly.

for event in pygame.event.get():
    if event.type == MOUSEBUTTONDOWN:  #Better to seperate to a new if statement aswell, since there's more buttons that can be clicked and makes for cleaner code.
        if event.button == 1:
            for object in clickableObjectsList:
                object.clickCheck(event.pos)
我认为这是推荐的方法。点击只会注册一次,所以它不会告诉您的精灵用户是否使用按钮“拖动”。这可以通过一个布尔值轻松实现,该布尔值在MOUSEBUTTONDOWN事件时设置为true,在MOUSEBUTTONUP事件时设置为false。迭代“可拖动”对象以激活它们的函数等等。
然而,如果您不想使用事件处理程序,可以让更新功能检查输入:
pygame.mouse.get_pos() 
pygame.mouse.get_pressed().

对于更大的项目来说,这种做法是个坏主意,因为它可能会产生难以找到的错误。最好将事件保持在一个地方。但对于像简单街机游戏之类的小游戏,使用探测风格可能更有意义。


关于 event.button == 1 的部分,Pygame 中是否有常量代替明确的数字 1?谢谢。 - Eli Bendersky
我认为没有必要。1始终是左键,2是中间键,3是右键。即使在只有两个按钮的鼠标上,3也是右键。 - Zoomulator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接