如何解决使用 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))
最小示例:
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 举报,一经查实,本站将立刻删除。