如何解决Pygame在单击时不绘制矩形
我是 pygame 的新手我正在制作一个简单的游戏。在这段代码中,我试图在鼠标位于某个位置时绘制一个矩形,但是当我打印任何内容时它没有绘制它
import pygame
pygame.init()
res = (600,600)
screen = pygame.display.set_mode(res)
pygame.display.set_caption("Tic Tac Toe")
background = (255,150,150)
color_light = (170,170,170)
color_dark = (100,100,100)
hover_color = (255,204,203)
width = screen.get_width()
height = screen.get_height()
def draw_line():
pygame.draw.rect(screen,line_color,(190,10,580))
pygame.draw.rect(screen,(390,(10,200,580,10))
pygame.draw.rect(screen,390,10))
def highlight():
if 10 <= mouse[0] <= 10+180 and 10 <= mouse[1] <= 10+190:
pygame.draw.rect(screen,hover_color,180,190)) # X,Y,WIDTH,HEIGHT
if 205 <= mouse[0] <= 205+180 and 10 <= mouse[1] <= 10+190:
pygame.draw.rect(screen,(200,190,HEIGHT
if 400 <= mouse[0] <= 400+190 and 10 <= mouse[1] <= 10+190:
pygame.draw.rect(screen,(400,HEIGHT
if 10 <= mouse[0] <= 10+180 and 210 <= mouse[1] <= 210+180:
pygame.draw.rect(screen,210,180)) # X,HEIGHT
if 200 <= mouse[0] <= 200+180 and 210 <= mouse[1] <= 210+180:
pygame.draw.rect(screen,HEIGHT
if 400 <= mouse[0] <= 400+190 and 210 <= mouse[1] <= 210+180:
pygame.draw.rect(screen,HEIGHT
if 10 <= mouse[0] <= 10+180 and 400 <= mouse[1] <= 400+200:
pygame.draw.rect(screen,400,HEIGHT
if 200 <= mouse[0] <= 200+190 and 400 <= mouse[1] <= 400+200:
pygame.draw.rect(screen,HEIGHT
if 400 <= mouse[0] <= 400+190 and 400 <= mouse[1] <= 400+190:
pygame.draw.rect(screen,HEIGHT
while True:
screen.fill(background)
mouse = pygame.mouse.get_pos()
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
if ev.type == pygame.MOUSEBUTTONDOWN:
if 10 <= mouse[0] <= 10 + 180 and 10 <= mouse[1] <= 10 + 190:
pygame.draw.rect(screen,background,190))
pygame.display.update()
line_color = (212,212,255)
draw_line()
highlight()
pygame.display.update()
解决方法
要使矩形永久化,您需要在应用程序循环中绘制矩形。该事件在单个帧中仅发生一次。添加变量 clicked = False
。事件发生时设置变量。并根据变量的状态绘制矩形:
clicked = False
while True:
screen.fill(background)
mouse = pygame.mouse.get_pos()
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
if ev.type == pygame.MOUSEBUTTONDOWN:
if 10 <= mouse[0] <= 10 + 180 and 10 <= mouse[1] <= 10 + 190:
clicked = True
line_color = (212,212,255)
draw_line()
highlight()
if clicked:
pygame.draw.rect(screen,background,(10,10,180,190))
pygame.display.update()
简化您的代码:
-
为矩形创建一个
pygame.Rect
对象列表rect_list = [pygame.Rect(10,190),...]
-
为所声明的字段创建一个列表
clicked_list = [0 for _ in rect_list]
-
使用
collideponit
测试鼠标是否在矩形上:for rect in rect_list: if rect.collidepoint(mouse): pygame.draw.rect(screen,hover_color,rect)
-
使用
collidepoint
来评估一个字段是否被点击并改变该字段的状态if ev.type == pygame.MOUSEBUTTONDOWN: for i,rect in enumerate(rect_list): if rect.collidepoint(ev.pos): clicked_list[i] = 1
-
根据其状态在循环中绘制字段:
for i,rect in enumerate(rect_list): if clicked_list[i]: pygame.draw.rect(screen,rect)
完整代码:
import pygame
pygame.init()
res = (600,600)
screen = pygame.display.set_mode(res)
pygame.display.set_caption("Tic Tac Toe")
background = (255,150,150)
color_light = (170,170,170)
color_dark = (100,100,100)
hover_color = (255,204,203)
width = screen.get_width()
height = screen.get_height()
def draw_line():
pygame.draw.rect(screen,line_color,(190,580))
pygame.draw.rect(screen,(390,200,580,10))
pygame.draw.rect(screen,390,10))
rect_list = [
pygame.Rect(10,pygame.Rect(200,pygame.Rect(400,pygame.Rect(10,210,400,190)]
clicked_list = [0 for _ in rect_list]
def highlight():
for rect in rect_list:
if rect.collidepoint(mouse):
pygame.draw.rect(screen,rect)
while True:
mouse = pygame.mouse.get_pos()
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
if ev.type == pygame.MOUSEBUTTONDOWN:
for i,rect in enumerate(rect_list):
if rect.collidepoint(ev.pos):
clicked_list[i] = 1
line_color = (212,255)
screen.fill(background)
draw_line()
highlight()
for i,rect in enumerate(rect_list):
if clicked_list[i] == 1:
pygame.draw.rect(screen,rect)
pygame.display.update()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。