pygame的draw.rect()和draw.line()函数似乎互相覆盖

时间:2020-07-17 20:42:16

标签: python pygame

我需要使用row * cols字段(在我的情况下为节点)绘制网格,为此我使用了pygame.draw.rect(),并且运行正常,但是当我想使用pygame.draw.line()绘制网格线时,我来了跨越一些“怪异”的行为。即,end_pos中存在i时,水平线for loop似乎取决于pygame.draw.rect()redraw()的当前值。

import pygame as pg 

pg.init()

clock = pg.time.Clock()
FPS = 60

WIN_DIM = 800
window = pg.display.set_mode((WIN_DIM, WIN_DIM))


class Grid:

    grid = []

    def __init__(self, row, col, win_width):
        self.rows = row
        self.cols = col
        self.win_width = win_width
        self.node_width = win_width // row

    def make_grid(self):
        for row in range(self.rows):
            Grid.grid.append([])
            for col in range(self.cols):
                Grid.grid[row].append("node")


def redraw(grid):

    window.fill(pg.Color("White"))
    for i, row in enumerate(grid.grid):
        for j, node in enumerate(row):
            pg.draw.rect(window, pg.Color("White"), (0 + i*grid.node_width, 0 + j*grid.node_width, grid.node_width, grid.node_width))
            pg.draw.line(window, pg.Color("Grey"), (j * grid.node_width, 0), (j * grid.node_width, grid.win_width))
        pg.draw.line(window, pg.Color("Grey"), (0, i * grid.node_width), (grid.win_width, i * grid.node_width))
    pg.display.update()


def main_loop():

    main_grid = Grid(10, 10, WIN_DIM)
    main_grid.make_grid()

    run = True
    while run:

        clock.tick(FPS)

        for event in pg.event.get():
            if event.type == pg.QUIT:
                run = False

        redraw(main_grid)


main_loop()

pg.quit()

grid_with_rect

但是当我在pg.draw.rect()中删除redraw()时,一切都很好:

grid_without_rect

我怀疑rect的概述以某种方式“替代”了line,但我不确定。

1 个答案:

答案 0 :(得分:1)

我怀疑rect的概述会以某种方式“覆盖”该行,但我不确定。

是的。您在嵌套循环中绘制1个白色矩形,然后绘制1条灰色线。您不会在绘制灰色线条之前绘制所有白色矩形。矩形和直线是交替绘制的:

for i, row in enumerate(grid.grid):
   for j, node in enumerate(row):
       pg.draw.rect(window, pg.Color("White"), (0 + i*grid.node_width, 0 + j*grid.node_width, grid.node_width, grid.node_width))
       pg.draw.line(window, pg.Color("Grey"), (j * grid.node_width, 0), (j * grid.node_width, grid.win_width))
  pg.draw.line(window, pg.Color("Grey"), (0, i * grid.node_width), (grid.win_width, i * grid.node_width))

将其与以下内容进行比较:

for i, row in enumerate(grid.grid):
    for j, node in enumerate(row):
        pg.draw.rect(window, pg.Color("White"), (0 + i*grid.node_width, 0 + j*grid.node_width, grid.node_width, grid.node_width))
for i, row in enumerate(grid.grid):
    for j, node in enumerate(row):
        pg.draw.line(window, pg.Color("Grey"), (j * grid.node_width, 0), (j * grid.node_width, grid.win_width))
    pg.draw.line(window, pg.Color("Grey"), (0, i * grid.node_width), (grid.win_width, i * grid.node_width))