【问题标题】:Pygame won't render rect at mouse position?Pygame不会在鼠标位置渲染矩形?
【发布时间】:2021-09-12 16:50:43
【问题描述】:

我编写了这个简单的代码,当单击鼠标按钮时在鼠标位置生成一个矩形。但由于某种原因,它不会呈现矩形。单击时它会打印“鼠标”,但没有矩形!

import pygame
from pygame.locals import *


WHITE = (255,255,255)

while True:

    pygame.init()

    DISPLAY = pygame.display.set_mode((400,400))

    for event in pygame.event.get():

        if event.type == QUIT:
            pygame.quit()
        
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            pygame.quit()

        if event.type == MOUSEBUTTONDOWN:
            pygame.draw.rect(DISPLAY,WHITE,(pygame.mouse.get_pos()[0],pygame.mouse.get_pos()[1],20,20))
            print('mouse')

 

    pygame.display.update()

非常感谢任何形式的帮助!

【问题讨论】:

  • 创建显示并在开始游戏循环之前执行一次pygame.init()

标签: python python-3.x pygame pygame-surface


【解决方案1】:

您必须在应用程序循环之前初始化 pygame (pygame.init()) 并创建显示界面 (pygame.display.set_mode())。

import pygame
from pygame.locals import *

pygame.init()
DISPLAY = pygame.display.set_mode((400,400))
WHITE = (255,255,255)

run = True
while run:
    for event in pygame.event.get():
        if event.type == QUIT:
            run = False
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            run = False

        if event.type == MOUSEBUTTONDOWN:
            print('mouse')
            pygame.draw.rect(DISPLAY, WHITE, (*event.pos, 20, 20))
        
    pygame.display.update()

pygame.quit()
exit()

但是,典型的 PyGame 应用程序循环必须:

重绘场景是每一帧。单击鼠标按钮时,该事件仅发生一次。将鼠标单击位置添加到列表中,并在应用程序循环中在列表中存储的位置绘制矩形:

import pygame
from pygame.locals import *

pygame.init()
DISPLAY = pygame.display.set_mode((400,400))
WHITE = (255,255,255)
clock = pygame.time.Clock()
pos_list = []

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == QUIT:
            run = False
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            run = False

        if event.type == MOUSEBUTTONDOWN:
            print('mouse')
            pos_list.append(event.pos)

    DISPLAY.fill(0)
    for pos in pos_list:
        pygame.draw.rect(DISPLAY, WHITE, (*pos, 20, 20))
    pygame.display.update()

pygame.quit()
exit()

【讨论】:

  • 太棒了。非常感谢老兄!
【解决方案2】:

您实际上确实渲染了矩形!问题是您重新初始化窗口太快以至于您在 while 循环

中看不到它

此代码将起作用:

import pygame
from pygame.locals import *


WHITE = (255, 255, 255)

pygame.init()
DISPLAY = pygame.display.set_mode((400, 400))

while True:

    for event in pygame.event.get():

        if event.type == QUIT:
            pygame.quit()

        if event.type == KEYDOWN and event.key == K_ESCAPE:
            pygame.quit()

        if event.type == MOUSEBUTTONDOWN:
            pygame.draw.rect(DISPLAY, WHITE, (pygame.mouse.get_pos()[
                             0], pygame.mouse.get_pos()[1], 20, 20))
            print('mouse')

    pygame.display.update()

【讨论】:

    【解决方案3】:

    问题是你在while循环中初始化了窗口。

    你必须这样做:

    import pygame
    from pygame.locals import *
    
    
    WHITE = (255,255,255)
    pygame.init()
    DISPLAY = pygame.display.set_mode((400,400))
    
    while True:
    
        for event in pygame.event.get():
    
            if event.type == QUIT:
                pygame.quit()
            
            if event.type == KEYDOWN and event.key == K_ESCAPE:
                pygame.quit()
    
            if event.type == MOUSEBUTTONDOWN:
                pygame.draw.rect(DISPLAY,WHITE,(pygame.mouse.get_pos()[0],pygame.mouse.get_pos()[1],20,20))
                print('mouse')
    
     
    
        pygame.display.update()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多