如何使矩形的副本保持在屏幕上并在pygame中不可渗透

时间:2019-05-06 18:26:26

标签: python python-3.x pygame

我正在制作一款类似于俄罗斯方块的益智游戏,其中涉及放置方块。我将其设置为运行程序的位置,在围栏区域上方生成了一个块,并且该块每1000ms向下移动一次。可以使用左,右或下方向在不同方向上移动它,当它到达底部边界时,y位置将重置为默认值,并且该块的“副本”将放置在其先前位置。我试图弄清楚如何使副本保持绘制状态,以及如何使副本块不渗透,因为在放置副本后,主块实际上可以占据与副本相同的位置。

我是python和pygame的新手,所以我想做的就是创建一个名为copyCount的变量,并且每绘制一个副本,就向该计数添加一个数字,并为range(copyCount)中的每个数字添加一个数字,绘制一个矩形。否则,我将一片空白。还不知道如何使所述复制块不可渗透(检查复制块和主块的Y位置?)

我希望这些块能够在屏幕上保持绘制状态,但事实并非如此。

1 个答案:

答案 0 :(得分:1)

您可以通过pygame.Rect创建.copy的副本。

为最终放置的矩形创建一个列表。当player到达地面时,将.copy()中的player插入列表。 绘制副本列表(copylist)。

copylist = []
while run:

    # [...]

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == moveDownEvent:
            if player.y < 390:
                player.y += vel
            elif player.y >= 390:
                copylist.append(player.copy()) # <--- copy rectangle
                player.y = 50  

    # [...]

    # draw copies
    for c in copylist:    
        pygame.draw.rect(win,(40,100,0),c)

    pygame.draw.rect(win, (100,40,0), player)
    pygame.display.update()

注意,copylist可用于检查与播放器的碰撞。将新块放置在地面上的块上方。矩形的碰撞可以通过.colliderect()collidelist()进行检查:

例如

while run:
    pygame.time.delay(100)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == moveDownEvent:
            if player.y >= 390 or player.move(0, vel).collidelist(copylist) >= 0:
                copylist.append(player.copy())
                player.y = 50 
            else:
                player.y += vel

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and player.x > 168 and player.move(-vel, 0).collidelist(copylist) < 0:
        player.x -= vel
    if keys[pygame.K_RIGHT] and player.x < 330 and player.move(vel, 0).collidelist(copylist) < 0:
        player.x += vel
    if keys[pygame.K_DOWN] and player.y < 390:
        if player.move(0, vel).collidelist(copylist) >= 0:
            copylist.append(player.copy())
            player.y = 50 
        else:
            player.y += vel

    # [...]