Python 事件发生时是否可以更新pygame绘图属性?
我正在接近PyGame,但我遇到了一个问题:我正在尝试绘制一个由单个矩形图形组成的网格,我希望在该矩形上释放鼠标左键时,这些矩形中的每一个都填充或清空。网格i由一个元组矩阵表示,每个元组表示如下格式的每个矩形(列,行),与pygame像素的坐标一致,然后我创建另一个元组矩阵,以从鼠标位置元组(colpixel,rowpixel)转换为矩形元组,我还创建了一个字典,将矩形元组作为键与一个值(可以是1或0)配对,该值表示矩形是否已填充,这是释放鼠标按钮时我更改的值。代码如下:Python 事件发生时是否可以更新pygame绘图属性?,python,pygame,Python,Pygame,我正在接近PyGame,但我遇到了一个问题:我正在尝试绘制一个由单个矩形图形组成的网格,我希望在该矩形上释放鼠标左键时,这些矩形中的每一个都填充或清空。网格i由一个元组矩阵表示,每个元组表示如下格式的每个矩形(列,行),与pygame像素的坐标一致,然后我创建另一个元组矩阵,以从鼠标位置元组(colpixel,rowpixel)转换为矩形元组,我还创建了一个字典,将矩形元组作为键与一个值(可以是1或0)配对,该值表示矩形是否已填充,这是释放鼠标按钮时我更改的值。代码如下: import pyga
import pygame
pygame.init()
SCREEN_WIDTH = 40
SCREEN_HEIGHT = 20
DIM = 20
ROWS = int(SCREEN_HEIGHT / DIM)
COLUMNS = int(SCREEN_WIDTH / DIM)
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('Game of Life')
# filling rect_matrix with tuple, each one representing a rectangle of the grid (columns, rows).
# filling rect_map by pairing the tuples from rect_matrix with a value that can be 0 or 1, default 1.
rect_matrix = []
rect_map = {}
for i in range(ROWS):
temp = []
for j in range(COLUMNS):
temp.append(pygame.Rect((j * DIM, i * DIM), (DIM, DIM)))
rect_map[(j, i)] = 1
rect_matrix.append(temp)
# filling mouse_to_rectangle, sort of a decoder to convert from groups of tuples
# (representing mouse coordinates in pixels) to a single tuple (representing single rectangles)
mouse_to_rectangle = []
ii = 0
for i in range(SCREEN_WIDTH):
jj = 0
temp = []
for j in range(SCREEN_HEIGHT):
temp.append((ii, jj))
if ((j + 1) % DIM == 0):
jj += 1
if ((i + 1) % DIM == 0):
ii += 1
mouse_to_rectangle.append(temp)
is_running = True
while is_running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
is_running = False
pygame.quit()
exit()
if event.type == pygame.MOUSEBUTTONUP:
if rect_map[mouse_to_rectangle[pygame.mouse.get_pos()[0]][pygame.mouse.get_pos()[1]]] == 1:
rect_map[mouse_to_rectangle[pygame.mouse.get_pos()[0]][pygame.mouse.get_pos()[1]]] = 0
else:
rect_map[mouse_to_rectangle[pygame.mouse.get_pos()[0]][pygame.mouse.get_pos()[1]]] = 1
for i, ii in zip(rect_matrix, range(len(rect_matrix))):
for j, jj in zip(i, range(len(i))):
pygame.draw.rect(screen, (100, 100, 100), j, rect_map[(jj, ii)])
pygame.display.update()
我在指向矩形时松开左按钮,设法填充了一个矩形(rect_map中的相对值变为1),但当我再次尝试单击一个现在已填充的矩形时,它不会为空。我用1或0表示“填充或不填充”属性,因为当
pygame.draw.rect
中的width
参数设置为0时,矩形被填充,如果使用>0
值,则矩形的边框将与指定的像素值一样厚。在绘制网格之前,您没有清除显示。因此,所有绘制的矩形都永远留在那里:
屏幕填充((0,0,0))
不管怎么说,你把算法复杂化了。研磨中的位置可以通过将鼠标位置的组件除以DIM
(/
(地板分割)操作符)来计算:
mousepos=pygame.mouse.get_pos()
gridpos=mousepos[0]//尺寸,mousepos[1]//尺寸
最后,它可以轻松地更改网格状态,并且根本不需要使用鼠标到矩形:
如果矩形映射[gridpos]==1:
矩形映射[gridpos]=0
其他:
矩形映射[gridpos]=1
请参见示例:
导入pygame
pygame.init()
屏幕宽度=200
屏幕高度=200
尺寸=20
行=整数(屏幕高度/尺寸)
列=int(屏幕宽度/尺寸)
screen=pygame.display.set_模式((屏幕宽度、屏幕高度))
pygame.display.set_标题(‘生命的游戏’)
#用元组填充rect_矩阵,每个元组表示网格的一个矩形(列、行)。
#通过将rect_矩阵中的元组与值(默认值为1)配对来填充rect_映射。
矩形矩阵=[]
rect_映射={}
对于范围内的i(行):
温度=[]
对于范围内的j(列):
临时附加(pygame.Rect((j*DIM,i*DIM),(DIM,DIM)))
矩形映射[(j,i)]=1
矩形矩阵追加(临时)
_正在运行=正确吗
当_正在运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
正在运行=错误
pygame.quit()
退出()
如果event.type==pygame.MOUSEBUTTONUP:
mousepos=pygame.mouse.get_pos()
gridpos=mousepos[0]//尺寸,mousepos[1]//尺寸
如果rect_映射[gridpos]==1:
矩形映射[gridpos]=0
其他:
矩形映射[gridpos]=1
屏幕填充((0,0,0))
对于zip中的i,ii(矩形矩阵,范围(len(矩形矩阵)):
对于j,zip(i,范围(len(i))中的jj:
pygame.draw.rect(屏幕,(100100100),j,rect_映射[(jj,ii)])
pygame.display.update()
在绘制网格之前,您没有清除显示。因此,所有绘制的矩形都永远留在那里:
屏幕填充((0,0,0))
不管怎么说,你把算法复杂化了。研磨中的位置可以通过将鼠标位置的组件除以DIM
(/
(地板分割)操作符)来计算:
mousepos=pygame.mouse.get_pos()
gridpos=mousepos[0]//尺寸,mousepos[1]//尺寸
最后,它可以轻松地更改网格状态,并且根本不需要使用鼠标到矩形:
如果矩形映射[gridpos]==1:
矩形映射[gridpos]=0
其他:
矩形映射[gridpos]=1
请参见示例:
导入pygame
pygame.init()
屏幕宽度=200
屏幕高度=200
尺寸=20
行=整数(屏幕高度/尺寸)
列=int(屏幕宽度/尺寸)
screen=pygame.display.set_模式((屏幕宽度、屏幕高度))
pygame.display.set_标题(‘生命的游戏’)
#用元组填充rect_矩阵,每个元组表示网格的一个矩形(列、行)。
#通过将rect_矩阵中的元组与值(默认值为1)配对来填充rect_映射。
矩形矩阵=[]
rect_映射={}
对于范围内的i(行):
温度=[]
对于范围内的j(列):
临时附加(pygame.Rect((j*DIM,i*DIM),(DIM,DIM)))
矩形映射[(j,i)]=1
矩形矩阵追加(临时)
_正在运行=正确吗
当_正在运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
正在运行=错误
pygame.quit()
退出()
如果event.type==pygame.MOUSEBUTTONUP:
mousepos=pygame.mouse.get_pos()
gridpos=mousepos[0]//尺寸,mousepos[1]//尺寸
如果rect_映射[gridpos]==1:
矩形映射[gridpos]=0
其他:
矩形映射[gridpos]=1
屏幕填充((0,0,0))
对于zip中的i,ii(矩形矩阵,范围(len(矩形矩阵)):
对于j,zip(i,范围(len(i))中的jj:
pygame.draw.rect(屏幕,(100100100),j,rect_映射[(jj,ii)])
pygame.display.update()
谢谢!!我完全忘了清洁屏幕和水箱,也忘了对整体算法的建议。谢谢!!我完全忘了清洁屏幕和水箱,也忘了对整体算法的建议。