【问题标题】:Pygame not returning mouse position in fullscreen modePygame没有在全屏模式下返回鼠标位置
【发布时间】:2017-11-02 22:38:26
【问题描述】:

尝试创建一段简单的代码来记录鼠标在窗口中和全屏时的点击位置。

目前,在窗口模式下(假设光标在窗口上方)将返回正确的值,但在全屏模式下,无论鼠标位置如何,我都会返回值 800,480(屏幕分辨率)。这是我的代码:

import pygame

windowwidth = 800
windowheight = 480
pygame.init()
pygame.display.init()
screen = pygame.display.set_mode((windowwidth, windowheight))
pygame.display.flip()

running = 1
while running:
    LEFT = 1
    event1 = pygame.event.get()
    for event in event1:
         if event.type == pygame.MOUSEBUTTONDOWN and event.button == LEFT:
              print(event.pos)
         if event.type == pygame.KEYDOWN:
              if event.key == pygame.K_f:
                   pygame.display.set_mode((800,480), pygame.FULLSCREEN)
              if event.key == pygame.K_g:
                   pygame.display.set_mode((800, 480))
              else:
                   break

    pygame.display.flip()

【问题讨论】:

    标签: python pygame mouseevent fullscreen


    【解决方案1】:

    虽然@Michael O'Dwyer 的回答就足够了,除了他对预先确定PyGame 窗口画布大小的说明之外,您还可以使用pygame.display.Info() 方法自动检测系统的宽度和高度,以获得更好的清晰度。这是自动检测到宽度和高度的代码:

    import pygame
    
    # Initialize Pygame
    pygame.init()
    
    # Get system display information
    displayInfo = pygame.display.Info()
    windowwidth = displayInfo.current_w
    windowheight = displayInfo.current_h
    
    # Commented out - No need to reinitialize other Pygame modules
    # after pygame.init() is called
    # pygame.display.init()
    
    screen = pygame.display.set_mode((windowwidth, windowheight))
    pygame.display.flip()
    
    running = 1
    while running:
        LEFT = 1
        for event in pygame.event.get():
             if event.type == pygame.MOUSEBUTTONDOWN and event.button == LEFT:
                  print(event.pos)
             if event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_f:
                       pygame.display.set_mode((windowwidth, windowheight), pygame.FULLSCREEN)
                  if event.key == pygame.K_g:
                       pygame.display.set_mode((800, 480))
                  else:
                       break
    
        pygame.display.flip()
    

    Herepygame.display.Info() 方法的 PyGame 文档。

    希望这有帮助!

    【讨论】:

    • 不幸的是,我在注册鼠标位置方面仍然没有太多运气
    • @Jkind9 代码按预期工作。鼠标位置的注册是通过什么方式关闭的?
    • 当我在全屏模式下点击屏幕时,无论我点击哪里,它只记录800、480的位置
    【解决方案2】:

    问题在于 pygame 正在获取以像素为单位的鼠标单击坐标,该坐标与pygame.display.set_mode() 中传递的分辨率相关联。因此,因为您在全屏时将分辨率设置为 (800, 480),所以它不会为您提供准确的像素坐标。

    解决方案?

    全屏时传入真实的显示器分辨率。在 pygame 中,如果你传入 (0, 0) 作为分辨率,pygame 会为你创建一个全屏分辨率。

    所以传入这个特殊的屏幕尺寸和一个全屏标志,就是这样!代码现在可以工作了!

    希望这个回答对你有所帮助!如果您还有任何问题,请在下方发表评论!

    import pygame
    
    windowwidth = 0
    windowheight = 0
    pygame.init()
    pygame.display.init()
    screen = pygame.display.set_mode((windowwidth, windowheight))
    pygame.display.flip()
    
    running = 1
    while running:
        LEFT = 1
        event1 = pygame.event.get()
        for event in event1:
             if event.type == pygame.MOUSEBUTTONDOWN and event.button == LEFT:
                  print(event.pos)
             if event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_f:
                       pygame.display.set_mode((0,0), pygame.FULLSCREEN)
                  if event.key == pygame.K_g:
                       pygame.display.set_mode((800, 480))
                  else:
                       break    
    
        pygame.display.flip()
    

    【讨论】:

    • 不幸的是,即使经过这次更正,也没有任何改变!
    • 这个问题会不会是因为显示了背景图片?
    • 如果您运行答案中给出的确切代码,它是否正确注册了鼠标位置?我刚刚又试了一次,我可以确认它有效。
    • 这里的代码有效,但我的完整程序与套接字没有。现在添加组件以找出问题所在
    • 也许我把设置的鼠标放在错误的地方不可见,但这 100% 导致了我的问题。多么奇怪!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多