如何在 pygame 中绘制多行多列的矩形?

问题描述 投票:0回答:1

我正在尝试制作 Brick Breakout 游戏。但是,我在绘制砖块时遇到了问题。我实际上可以画出它们,但我正在寻找一种专业的方法来使用更少的代码行。 这是我的一些代码,但没用:

pygame.draw.rect(screen1, brick_colors[b], (x1, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x2, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x3, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x4, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x5, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x6, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x7, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x8, y1, 60, 12))

那么,有没有一种方法可以使用 for 循环来完成这项工作? 注意:积木应该是8行,每行8个。

python pygame
1个回答
2
投票

使用嵌套循环:

no_of_rows = 8
no_of_cols = 8

x0, y0 = 20, 20    # just for example
dx, dy = 70, 16    # just for example

for row in range(no_of_rows):
    for col in range(no_of_cols):
        pygame.draw.rect(screen1, brick_colors[b], (x0 + col*dx, y0 + row*dy, 60, 12))

我建议制作一个块位置列表,并从列表中的位置绘制块矩形。如果一个方块被破坏,你所要做的就是从列表中删除该位置:

blocks = []
for row in range(no_of_rows):
    for col in range(no_of_cols):
        blocks.append((x0 + col*dx, y0 + row*dy))
for pos in blocks:
    pygame.draw.rect(screen1, brick_colors[b], (pos[0], pos[1], 60, 12))

这可以通过使用

pygame.Rect
对象进一步改进:

blocks = []
for row in range(no_of_rows):
    for col in range(no_of_cols):
        rect = pygame.Rect(x0 + col*dx, y0 + row*dy, 60, 12)
        blocks.append(rect )
for rect in blocks:
    pygame.draw.rect(screen1, brick_colors[b], rect )

如果要在整个屏幕上绘制方格图块,请在应用程序循环之前在背景表面上绘制图块,

blit
在应用程序循环中在屏幕上绘制背景表面以获得最佳性能。

import pygame

screen = pygame.display.set_mode([500, 500]) 
clock = pygame.time.Clock() 

background = pygame.Surface(screen.get_size())
color1 = (64, 64, 128)
color2 = (196, 128, 64)
sx, sy = 50, 50
for i in range((screen.get_width() + sx -1) // sx):
    for j in range((screen.get_height() +sy - 1) // sy):
        c = color1 if (i+j) % 2 == 0 else color2
        pygame.draw.rect(background, c, (i*sx, j*sy, sx, sy))   

run = True 
while run:  
    clock.tick(100)
    for event in pygame.event.get():         
        if event.type == pygame.QUIT:             
            run = False      

    screen.blit(background, (0, 0))     

    pygame.display.update()

pygame.quit()
© www.soinside.com 2019 - 2024. All rights reserved.