我正在制作一款类似于俄罗斯方块的益智游戏,其中涉及放置方块。我将其设置为运行程序的位置,在围栏区域上方生成了一个块,并且该块每1000ms向下移动一次。可以使用左,右或下方向在不同方向上移动它,当它到达底部边界时,y位置将重置为默认值,并且该块的“副本”将放置在其先前位置。我试图弄清楚如何使副本保持绘制状态,以及如何使副本块不渗透,因为在放置副本后,主块实际上可以占据与副本相同的位置。
我是python和pygame的新手,所以我想做的就是创建一个名为copyCount的变量,并且每绘制一个副本,就向该计数添加一个数字,并为range(copyCount)中的每个数字添加一个数字,绘制一个矩形。否则,我将一片空白。还不知道如何使所述复制块不可渗透(检查复制块和主块的Y位置?)
我希望这些块能够在屏幕上保持绘制状态,但事实并非如此。
答案 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
# [...]