首页 > 解决方案 > 使用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()

标签: pythonpygame

解决方案


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

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_color, (x, y, rect_size, 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)) 

最小的例子:

在此处输入图像描述

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, rect_color, (col*rect_size, row*rect_size, rect_size, rect_size))
    pygame.display.update()
    clock.tick(60)

pygame.quit()
exit()

推荐阅读