微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 pygame 在 Python 中的鼠标位置绘制一个矩形

如何解决使用 pygame 在 Python 中的鼠标位置绘制一个矩形

当我按下鼠标左键时,我试图在屏幕上的鼠标位置上绘制一个矩形,但我似乎无法让它工作。当我按下任何鼠标按钮时,没有任何反应。我最近开始使用 Python,你能帮忙吗?

这是游戏循环代码...

game_over = False
while not game_over:

    mouse_pos = pygame.mouse.get_pos()

    for event in pygame.event.get():
        print(event)
        if event.type == pygame.QUIT:
            game_over = True
        if event.type == pygame.MOUSEBUTTONDOWN:
            pygame.draw.rect(display,rect_color,[mouse_pos[0],mouse_pos[1],rect_size,rect_size])
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                game_over = True

    display.fill(background_color)
    draw_grid()

    pygame.display.update()
    clock.tick(250)

pygame.quit()
quit()

解决方法

您必须管理列表中的矩形。为矩形的位置创建一个列表:

pos_list = []

用鼠标点击时向列表添加一个新位置:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        game_over = True
    if event.type == pygame.MOUSEBUTTONDOWN:
        pos_list.append(event.pos)

在清除显示之后和更新显示之前,在列表中存储的位置循环绘制矩形:

display.fill(background_color)
for x,y in pos_list:
    pygame.draw.rect(display,rect_color,(x,y,rect_size,rect_size))
pygame.display.update()

最小的例子

import pygame

pygame.init()
display = pygame.display.set_mode((300,300))
clock = pygame.time.Clock()
rect_color = "red"
rect_size = 40

pos_list = []
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            pos_list.append(event.pos)          

    display.fill(0)
    for x,y in pos_list:
        pygame.draw.rect(display,rect_size))
    pygame.display.update()
    clock.tick(60)

pygame.quit()
exit()

如果要在网格上对齐矩形,则必须根据鼠标位置计算行和列:

if event.type == pygame.MOUSEBUTTONDOWN:
    col = event.pos[0] // rect_size
    row = event.pos[1] // rect_size
    pos_list.append((col,row)) 

最小示例:

enter image description here

import pygame

pygame.init()
display = pygame.display.set_mode((320,320))
clock = pygame.time.Clock()
rect_color = "red"
rect_size = 40

background = pygame.Surface(display.get_size())
ts,w,h,c1,c2 = 40,*display.get_size(),(32,32,32),(64,64,64)
tiles = [((x*ts,y*ts,ts,ts),c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect,color in tiles:
    pygame.draw.rect(background,color,rect)

pos_list = []
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            col = event.pos[0] // rect_size
            row = event.pos[1] // rect_size
            pos_list.append((col,row))          

    display.blit(background,(0,0))
    for col,row in pos_list:
        pygame.draw.rect(display,(col*rect_size,row*rect_size,rect_size))
    pygame.display.update()
    clock.tick(60)

pygame.quit()
exit()
,

问题在于渲染顺序 您需要在循环开始时使用 display.fill(bgColor) 填充屏幕。

然后你需要绘制网格和矩形。 然后你需要调用 pygame.display.update() 和所有其他东西

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。