Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 事件发生时是否可以更新pygame绘图属性?_Python_Pygame - Fatal编程技术网

Python 事件发生时是否可以更新pygame绘图属性?

Python 事件发生时是否可以更新pygame绘图属性?,python,pygame,Python,Pygame,我正在接近PyGame,但我遇到了一个问题:我正在尝试绘制一个由单个矩形图形组成的网格,我希望在该矩形上释放鼠标左键时,这些矩形中的每一个都填充或清空。网格i由一个元组矩阵表示,每个元组表示如下格式的每个矩形(列,行),与pygame像素的坐标一致,然后我创建另一个元组矩阵,以从鼠标位置元组(colpixel,rowpixel)转换为矩形元组,我还创建了一个字典,将矩形元组作为键与一个值(可以是1或0)配对,该值表示矩形是否已填充,这是释放鼠标按钮时我更改的值。代码如下: import pyga

我正在接近PyGame,但我遇到了一个问题:我正在尝试绘制一个由单个矩形图形组成的网格,我希望在该矩形上释放鼠标左键时,这些矩形中的每一个都填充或清空。网格i由一个元组矩阵表示,每个元组表示如下格式的每个矩形(列,行),与pygame像素的坐标一致,然后我创建另一个元组矩阵,以从鼠标位置元组(colpixel,rowpixel)转换为矩形元组,我还创建了一个字典,将矩形元组作为键与一个值(可以是1或0)配对,该值表示矩形是否已填充,这是释放鼠标按钮时我更改的值。代码如下:

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()

谢谢!!我完全忘了清洁屏幕和水箱,也忘了对整体算法的建议。谢谢!!我完全忘了清洁屏幕和水箱,也忘了对整体算法的建议。