我正在使用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中将图像分类为:表面物体。我在想两件事:
->是否可以创建一个函数,通过某种方式转换表面对象的类型来重新上传与时间有关的图像?
->我的代码是否甚至反映了我想要它做的事情?
请让我知道并取消批评!我是编码的新手,所以任何反馈都对您有帮助!
答案 0 :(得分:3)
@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()
一起使用。
答案 1 :(得分:2)
出现错误int object is not iterable
的原因是因为pygame.time.get_ticks()
是一个返回整数的函数,除非在下面的range()
函数中使用它,否则不能使用它进行迭代。与for
循环一起使用。一个更好的主意可能是仅将for time in pygame.time.get_ticks()
替换为time = pygame.time.get_ticks()