在 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 ...
一个简单的性能胜利就是不绘制屏幕外的任何东西,所以在渲染之前测试你的 x
、y
坐标,例如:
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_x
、offset_y
值),其中具有负值的矩形 x
,y
值未呈现(测试不是 x < 0
,而是 x < -block_size
)。
从循环索引中计算 x
和 y
值没有任何问题,拥有索引通常很有用(例如索引 [row][col]
可能为您提供代表游戏方块的 2D 矩阵中方块的数据位置)。我会使用乘数从索引中自己计算 x
、y
值(这也解决了第一行空白问题):
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 ...
我试图在 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 ...
一个简单的性能胜利就是不绘制屏幕外的任何东西,所以在渲染之前测试你的 x
、y
坐标,例如:
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_x
、offset_y
值),其中具有负值的矩形 x
,y
值未呈现(测试不是 x < 0
,而是 x < -block_size
)。
从循环索引中计算 x
和 y
值没有任何问题,拥有索引通常很有用(例如索引 [row][col]
可能为您提供代表游戏方块的 2D 矩阵中方块的数据位置)。我会使用乘数从索引中自己计算 x
、y
值(这也解决了第一行空白问题):
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 ...