Pygame движущееся изображение не появляется на движущемся фоне - PullRequest
0 голосов
/ 16 января 2020

Итак, у меня есть движущийся фон для моей пигмеи, который работает нормально. Теперь я хотел добавить препятствие (например, камень), которое будет внизу экрана и будет двигаться вместе с фоном. Однако изображение (препятствие) просто исчезает после появления на пару секунд. Я хочу, чтобы камень появлялся снова и снова, но не появлялся. Не могу понять, что не так. Пожалуйста, помогите, спасибо!

background = pygame.image.load('background.png')
backgroundX = 0
backgroundX2 = background.get_width()
obstacle = pygame.image.load('obstacle.png')
obstacleX = 0
obstacleX2 = obstacle.get_width()


# use procedure for game window rather than using it within loop
def redrawGameWindow():
    # background images for right to left moving screen
    screen.blit(background, (backgroundX, 0))
    screen.blit(background, (backgroundX2, 0))
    man.draw(screen)
    screen.blit(obstacle, (obstacleX, 380))
    screen.blit(obstacle, (obstacleX2, 380))
    pygame.display.flip()
    pygame.display.update()

Основной л oop:

while run:
    screen.fill(white)
    clock.tick(30)
    pygame.display.update()
    redrawGameWindow()  # call procedure

    obstacleX -= 1.4
    obstacleX2 -= 1.4

    if obstacleX < obstacle.get_width() * -10:
        obstacleX = obstacle.get_width

    if obstacleX2 < obstacle.get_width() * -10:
        obstacleX2 = obstacle.get_width()   

1 Ответ

2 голосов
/ 17 января 2020

Функция surface.blit() (т.е.: screen.blit) берет изображение и координаты верхнего левого угла того, где его нарисовать.

В предоставленном коде нарисованы две копии obstacle в obstacleX и obstacleX2 - один из которых установлен на 0, а другой - ширину изображения. Таким образом, это должно привести к тому, что два изображения будут нарисованы рядом друг с другом, в левой части окна, в строке 380.

Если эти изображения больше не рисуются через некоторое время, это может быть вызвано -

  • Переменные obstacleX и obstacleX2 заменяются на экранную позицию
  • Изображение obstacle изменяется на пустую (или иным образом невидимую) версию

В небольшом приведенном выше примере кода нет доказательств, но, поскольку вопрос предполагает перемещение изображений, я предполагаю, что координаты obstacleX и obstacleX2 позиций рисования изменяются чтобы выйти за пределы экрана.

РЕДАКТИРОВАТЬ:

Очевидно, что ваши объекты начинаются с позиции 0 (левое окно), и позиция обновляется obstacleX -= 1.4, которая перемещает препятствие дальше налево . Вот почему они запускаются на экране, но вскоре исчезают.

Поместите размеры экрана в константы, например:

WINDOW_WIDTH  = 400
WINDOW_HEIGHT = 400

И используйте их вместо того, чтобы набирать код цифрами. Это уменьшает количество необходимых изменений, если вы решите изменить размеры окна, а также позволяет выполнять расчеты на основе ширины окна.

Так что начинайте свое препятствие с экрана.

obstacleX  = WINDOW_WIDTH          # off-screen
obstacleX2 = WINDOW_WIDTH + 100    # Further away from first obstacle

In главное обновление -l oop, когда положение предметов меняется, проверьте, не нужно ли их повторно зациклить обратно перед игроком:

# Move the obstacles 1-pixel to the left
obstacleX  -= 1.4
obstacleX2 -= 1.4   # probably just 1 would be better  

# has the obstacle gone off-screen (to the left)
if ( obstacleX < 0 - obstacle.get_width() ):   
    # move it back to the right (off-screen)
    obstacleX = WINDOW_WIDTH + random.randint( 10, 100 )  

# TODO - handle obstacleX2 similarly
...