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_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()
推荐阅读
- node.js - 如果第一个服务端点根据状态码忙,则回退到另一个服务端点
- firebase - Firebase 客户端错误:自定义令牌对应于不同的受众
- django - Recombee 批处理不发送所有数据
- php - NGINX 默认站点工作,但另一个端口上的一个不工作
- java - 如何正确访问 ArrayList 以在 HashMap Java 中进行迭代?
- tensorflow.js - 如何定义具有数千个可能分类值的输入张量?
- java - 套接字连接程序(TCP/IP)适用于 localhost/common 网络但不适用于其他 IP
- android - 如何使用过时的 android sdk 版本
- python - pygame.draw.rect 无法处理元组中的值和整数之间的操作,但任何其他函数都可以
- xpath - XPath:匹配两个相似标签之间的文本