gpt4 book ai didi

python - 无法触发颜色上的鼠标按下事件

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:36 29 4
gpt4 key购买 nike

我正在为一个学校项目创建一个回避游戏,我遇到了一个奇怪的错误,即当光标点击绿色(“获胜颜色”)时 MOUSEBUTTONDOWN 事件不会触发,即使是几乎相同的版本相同的代码确实有效,但颜色不同。

我当前的颜色事件代码是:

        pos = pygame.mouse.get_pos()
color_at_cursor = screen.get_at(pos)

if event.type == pygame.MOUSEBUTTONDOWN and color_at_cursor == (0, 0, 255, 255):
print("Game Start")
start_clicked = True
if start_clicked and color_at_cursor == (0, 228, 255, 255):
died = True
if died:
screen.blit(ded, ded_rect)
if event.type == pygame.MOUSEBUTTONDOWN:
is_alive = False

if start_clicked and event.type == pygame.MOUSEBUTTONDOWN and color_at_cursor == (0, 255, 0, 255):
screen.blit(win_screen, win_rect)
if event.type == pygame.MOUSEBUTTONDOWN:
is_alive = False

其中前 3 个 if 语句检查蓝色开始按钮是否被单击,以及光标是否触及青色/浅蓝色死亡颜色。这些语句按预期工作,但使用几乎完全相同概念的最终语句不起作用。单击绿色时,没有任何反应。我得出的结论是它不起作用的原因是因为所讨论的绿色位于与背景不同的单独对象上。但这仍然很奇怪,因为当光标悬停在平台上时,上面的第二个 IF 语句并没有导致立即死亡(它的颜色与背景的青色死亡颜色不同)

无论如何,我尝试编写代码来检测对象顶部特定颜色上的鼠标单击事件。如下所示:

if event.type == pygame.MOUSEBUTTONDOWN and start_clicked:
x, y = event.pos
if platform1.get_rect().collidepoint(x,y) and platform1.get_at((x, y)) == (0, 255, 0, 255):
print("win button clicked")
screen.blit(win_screen, win_rect)
if event.type == pygame.MOUSEBUTTONDOWN:
is_alive = False

这仍然导致没有任何事情发生。有谁知道我为什么会遇到这个问题,我该如何解决?

最佳答案

在你的第二个片段中,我不是 100% 确定 platform1 是什么,但我猜它是一个充满绿色的 Surface。

如果是这种情况,错误很可能是坐标的偏移。让我用以下 MCVE 来说明这一点,这是第二个代码段的简化版本:

pygame.init()
screen = pygame.display.set_mode((800, 800))

platform1 = pygame.Surface((200, 200))
platform1.fill((0, 255, 0))
screen.blit(platform1, (300, 300))
pygame.display.update()

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
if platform1.get_rect().collidepoint(x,y) and platform1.get_at((x, y)) == (0, 255, 0):
print("win button clicked")

现在这会在屏幕中间创建一个绿色方 block ,但是当您单击它时,“win button clicked” 不会打印(重现您描述的错误)。

原因是event.pos返回鼠标在屏幕坐标系中的坐标:即位置(0, 0)是左上角屏幕窗口。
但是,您从 platform1.get_rect() 获得的矩形不知道矩形实际绘制的位置,因此它的原点被假定为 (0, 0) 而不是无论它是什么(在本例中为 (300, 300))。所以你在检测点碰撞时出错。

如果将最后一个 if block 替换为:

    if event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
x -= 300
y -= 300
if platform1.get_rect().collidepoint(x,y) and platform1.get_at((x, y)) == (0, 255, 0):
print("win button clicked")

它按预期工作,因为我们考虑了 (300, 300) 的偏移量。

这说明了问题,但当然不是解决问题的好方法,因为偏移量是硬编码的,并且不会对所有对象都相同。面对这种情况最好的办法就是使用Sprite而不仅仅是表面,它还可以用于以一致的方式跟踪对象在屏幕中的位置。

关于python - 无法触发颜色上的鼠标按下事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59128729/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com