在 for 循环中将小矩形打印到屏幕上。 (pygame)

Printing small rectangles to the screen in a for loop. (pygame)

我试图在 for 循环的帮助下在 pygame 中获取代码以在整个屏幕上打印小矩形,但遇到了问题。我已经用这段代码解决了部分问题,但它看起来很丑,而且性能很差:

x = 0
y = 0

for y_row in range(60):
    y = y + 10
    pygame.draw.rect(screen, GREEN, [x, y, 5, 5], 0)
    for x_row in range(70):
        pygame.draw.rect(screen, GREEN, [x, y, 5, 5], 0)
        x = x + 10
    x = 0

首先,如果我能弄清楚如何在 x 和 y 上实现 y_row 和 x_row 的值,我认为我不必为 x 和 y 赋值相反,现在它增加了 1,它应该增加 10,而不是我可以实现它。

代码的另一个问题是它在顶部留下了一个空白行,这是因为我必须在 pygame 绘图上方添加 y = y + 10,否则它只会在那里打印一个矩形 使其更显眼。

您可以找到我用来使代码正常工作的模板 Here

如@bshuster13 所述,您可以使用 pythons range() 函数 并传递 可选步骤 停止参数 创建一个包含等差数列的列表。

numberOfRows = 60
numberOfColumns = 70

stepBetweenRects = 10

for y in range(0, numberOfRows * stepBetweenRects, stepBetweenRects):
    for x in range(0, numberOfColumns * stepBetweenRects, stepBetweenRects):
        pygame.draw.rect(screen, GREEN, (x, y, 5, 5), 0)

每 60 秒在屏幕上绘制 4,200 个矩形对于 CPU 来说可能是一项重要任务。我怀疑 pygame.draw.rect() 函数是相当高级的,调用没有被 pygame 批处理,因此它不是最优的,文档 (https://www.pygame.org/docs/ref/draw.html#pygame.draw.rect) 中有一个提示 Surface.fill(color, rect=None, special_flags=0) 可以进行硬件加速,如果您正在填充矩形,这可能是一个更快的选择。

注意:下面的代码示例是伪...只是意味着您需要填补空白。

每次循环迭代只需要调用 1 次 pygame.draw.rect 而不是现在的 2 次,例如

for row in rows:
    y = ...
    for col in cols:
        x = ...
        ... draw rect ...

一个简单的性能胜利就是不绘制屏幕外的任何东西,所以在渲染之前测试你的 xy 坐标,例如:

screen_width = 800
screen_height = 600

for ...
    y = y += 10
    if y > screen_height:
        break

    for ...
        x += 10
        if x > screen_width:
            break

        ... draw block ...

也可以使用相同的方法(使用 continue)来实现偏移量(例如起始 offset_xoffset_y 值),其中具有负值的矩形 xy 值未呈现(测试不是 x < 0,而是 x < -block_size)。

从循环索引中计算 xy 值没有任何问题,拥有索引通常很有用(例如索引 [row][col] 可能为您提供代表游戏方块的 2D 矩阵中方块的数据位置)。我会使用乘数从索引中自己计算 xy 值(这也解决了第一行空白问题):

block_size = 10

for row in ...
    y = row * block_size
    if y > screen_height:
        break

    for col in ...
        x = col * block_size 
        if x > screen_width:
            break

        ... draw block ...

如果您正在使用 Python2 那么您可能会考虑使用 xrange 来预定义循环范围以提高性能(尽管我认为只有少量并且一如既往地通过优化测试性能差异是关键)。例如:

rows = xrange(60)
cols = xrange(70)

for row in rows:
    ...
    for cols in cols:
        ... draw block ...