Pygame - возможно ли изменить фоновое изображение относительно времени? - PullRequest
4 голосов
/ 30 октября 2019

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

while True:

    DISPLAYSURF.fill(black)  #fills the displaysurf with black

    for time in pygame.time.get_ticks():

            if time == 2:
                img_1 = img_2
                DISPLAYSURF.blit(img_2, (0, 0)) #copy, pastes the surface object to fixed point
            if time == 4:
                img_2 = img_3
                DISPLAYSURF.blit(img_3, (0, 0))
            if time == 8:
                img_3 = img_4
                DISPLAYSURF.blit(img_4, (0, 0))
            if time == 10:
                img_4 = img_5
                DISPLAYSURF.blit(img_5, (0, 0))
            if time == 12:
                img_5 = img_6
                DISPLAYSURF.blit(img_6, (0, 0))
            if time == 14:
                img_6 = img_7
                DISPLAYSURF.blit(img_7, (0, 0))
            if time == 16:
                img_7 = img_8
                DISPLAYSURF.blit(img_8, (0, 0))

    pygame.display.flip()
    clock.tick(FPS)

Когда я запустил программу, я получил то, что «int» объект не повторяется », что заставило меня подумать, что я, возможно, не смогу сделатьчто я имел в виду, потому что изображения, которые я имею, классифицируются в Pygame как поверхностные объекты. Я думаю о двух вещах:

-> Возможно ли создать функцию, которая может повторно загружать изображения в зависимости от времени, каким-то образом преобразовывая тип объектов поверхности?

-> Отражает ли мой код то, что я хочу, чтобы он делал?

Пожалуйста, дайте мне знать и отправьте критику! Я очень плохо знаком с программированием, поэтому любые отзывы полезны!

Ответы [ 2 ]

3 голосов
/ 30 октября 2019

@ Aggragoth уже рассмотрел сообщение об ошибке, поэтому я не буду вдаваться в подробности.

Один из способов периодического изменения фона состоит в том, чтобы сохранить таймер и настроить фон на основе предварительно определенного периода.

import pygame
import time

# Window size
WINDOW_WIDTH  = 200
WINDOW_HEIGHT = 200

# background colour
SKY_BLUE      = (161, 255, 254)
WHITE         = (255, 255, 255)
BLUE          = (  5,  55, 255)

### MAIN
pygame.init()
surface_type = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE
window       = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), surface_type )
pygame.display.set_caption("Background Change")

# Variables to manage the background change
background_delay = 1500  # milliseconds
background_time  = 0     # when the background last changed
backgrounds      = [ WHITE, SKY_BLUE, WHITE, SKY_BLUE, BLUE ]
background_index = 0     # index of the currently used background

# Main loop
clock = pygame.time.Clock()
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True

    # Re-draw the screen background from the list after a delay
    time_now = pygame.time.get_ticks()
    if ( time_now > background_time + background_delay ):
        # switch to the next background
        background_time = time_now
        background_index += 1
        # if we're out of backgrounds, start back at the head of the list
        if ( background_index >= len( backgrounds ) ):
            background_index = 0

    # Draw the background
    window.fill( backgrounds[ background_index ] )

    pygame.display.flip()
    # Update the window, but not more than 60fps
    clock.tick_busy_loop( 60 )

pygame.quit()

Основная часть кода - сохранить время, когда мы в последний раз меняли фон. Если прошедшее с тех пор время (с pygame.time.get_ticks()) больше, чем время последнего изменения плюс задержка, перейдите к следующему фону.

В этом примере я только что использовал цвета, ноСписок backgrounds[] также может содержать изображения и использоваться с window.blit().

2 голосов
/ 30 октября 2019

Причина, по которой вы получаете ошибку int object is not iterable, заключается в том, что pygame.time.get_ticks() - это функция, которая возвращает целое число, которое нельзя использовать для итерации, если вы не используете ее в функции range() в сочетании с forпетля. Лучшей идеей может быть просто заменить for time in pygame.time.get_ticks() просто time = pygame.time.get_ticks()

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