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

时间:2015-05-31 10:34:00

标签: python python-3.x for-loop pygame

我试图获得一个代码,在forgame的帮助下,在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指定一个值,如果我只是想知道如何在x和y的位置实现y_row和x_row的值,现在它增加了1,它应该增加10,而不是我可以实现它。

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

我用来获取代码的模板可以找到Here

2 个答案:

答案 0 :(得分:2)

正如@ 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)

答案 1 :(得分:2)

每隔60秒向屏幕绘制4,200个矩形可能是CPU的重要任务。我怀疑pygame.draw.rect()函数是相当高级的,并且调用没有被pygame批量化,使得它不是最佳的,文档中有一个提示(https://www.pygame.org/docs/ref/draw.html#pygame.draw.rectSurface.fill(color, rect=None, special_flags=0)可以是硬件加速,如果你填充矩形,可能是一个更快的选择。

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

你现在只需要对循环的每次迭代调用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值),其中矩形为负x,不会呈现y个值(但测试不是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 ...