我有一个用瓷砖制成的背景游戏,有些是静态的(草,泥),但我想让水流动。我已经创建了一个名为water的表面,然后我有一个循环,遍历一系列10个png,用于流动的水帧。我希望然后像游戏的其余部分一样经常更新这个表面10x,并以30fps的速度将其与其他对象一起用于主表面。
然而,我所能达到的只是没有运动或水以疯狂的速度流动(通过在水更新循环中更新整个显示器。)
有没有办法可以更新这个表面?
这是我的代码:
#mud, grass and surface are defined earlier.
water = pygame.Surface((100,100))
#create mud tiles
for x in range(0,800,100):
for y in range(0, 500, 100):
screen.blit(mud,(x,y))
#create grass tiles
for x in range(400, 800, 100):
for y in range(0, 300, 100):
screen.blit(grass,(x,y))
#create filenames
for x in range(1,11):
if x < 10:
filename = "images\water\water1000" + str(x) + ".png "
else:
filename = "images\water\water100" + str(x) + ".png "
waterimg = pygame.image.load(filename)
#add to a surface, then tile the surface onto the game.
water.blit(waterimg,(0,0))
for x in range(100, 200, 100):
for y in range(0, 500, 100):
screen.blit(water, (x,y))
pygame.display.flip() #makes it update crazily. removing this line makes it not update at all.
allsprites.draw(screen)
pygame.display.flip()
答案 0 :(得分:2)
看起来您想使用pygame.display.update。 只需传递所有水瓦片的列表,它只会更新屏幕的那些部分。唯一的问题是,显然你不能将它与pygame.OPENGL显示一起使用。
但是,你确定要以300fps为水动画吗?看起来你应该告诉你的绘制方法你要做什么,并用它来确定要显示的帧。 e.g。
def draw(tick, (whatever other arguments you have...):
... #draw mud and grass
#the modulo operator % gets the remainder of the two numbers, so 12 % 10 = 2
filename = "images\water\water1000" + str(tick % 10) + ".png"
waterimg = pygame.image.load(filename)
... #blit the waterimg, but don't flip
更好的方法是先将所有水砖加载到列表中并使用
waterimg = watertiles[tick % 10]
并将图像编号从0-9而不是1-10。
无论如何,我希望这有助于(并且有效)。
答案 1 :(得分:1)
您的代码不对。一般模式是(简化:1个更新循环 - 1个绘制循环):
load_all_images_needed()
itime = time.time()
while 1:
now = time.time()
update(now, now - itime) # send absolute time and delta time
itime = now
draw()
flip()
您可以使用绝对时间来决定使用哪个帧水(即water_images[int(now*10.0) % len(water_images)]
用于水精灵中的10fps)