在Pygame中更新一个表面

时间:2010-12-11 14:07:50

标签: python animation sprite pygame

我有一个用瓷砖制成的背景游戏,有些是静态的(草,泥),但我想让水流动。我已经创建了一个名为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()

2 个答案:

答案 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)