Как сделать так, чтобы копии прямоугольника оставались нарисованными на экране и непроницаемыми в пигмеях - PullRequest
2 голосов
/ 06 мая 2019

Я делаю игру, похожую на тетрис, и она включает в себя размещение квадратных блоков. Я установил его там, где при запуске программы блок появляется над огороженной территорией, и этот блок перемещается вниз каждые 1000 мс. Его можно перемещать в разных направлениях, используя левую, правую или нижнюю часть, и когда он достигает нижней границы, позиция y сбрасывается обратно к значению по умолчанию, и «копия» блока помещается в предыдущую позицию. Я пытаюсь выяснить, как сделать копию нарисованной, а также как сделать ее непроницаемой, так как основной блок может фактически занимать ту же позицию, что и копия после ее размещения.

Я очень плохо знаком с python и pygame, поэтому все, что я подумал сделать, это, возможно, создать переменную с именем copyCount, и всякий раз, когда копируется копия, добавляется число к этому числу и для каждого числа в диапазоне (copyCount) , нарисуйте прямоугольник. В противном случае, однако, я отключаюсь. Не знаю также, как сделать упомянутый блок копии непроницаемым (проверьте позиции Y копии и основного блока?)

Я ожидал, что блоки будут отображаться на экране, но это не так.

1 Ответ

1 голос
/ 06 мая 2019

Вы можете создать копию 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

    # [...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...