Pygame движущееся изображение не появляется на движущемся фоне

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

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()

Основной цикл:

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 ответ


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

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

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

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

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

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

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

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

WINDOW_WIDTH  = 400
WINDOW_HEIGHT = 400

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

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

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

В главном цикле обновления, когда положение элементов меняется, проверьте, нужно ли их повторно циклически возвращать назад перед игроком:

# 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