Обновите одну поверхность в Pygame - PullRequest
0 голосов
/ 11 декабря 2010

У меня есть игра с фоном из плиток, некоторые статичны (трава, грязь), но я хочу, чтобы вода текла.я создал поверхность под названием вода, затем у меня есть цикл, который повторяет серию из 10 png для кадров протекающей воды.затем я хочу обновить эту поверхность в 10 раз так же часто, как и в остальной части игры, и перетащить ее на основную поверхность со скоростью 30 кадров в секунду с другими объектами.

Однако все, чего я могу достичь, - это не двигаться или вода течет вбезумная скорость (путем обновления всего дисплея в цикле обновления воды.)

есть ли способ, которым я могу обновить только эту поверхность?

вот мой код:

#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 ]

2 голосов
/ 11 декабря 2010

Похоже, вы хотите использовать pygame.display.update .Просто передайте ему список всех текстов водяной плитки, и он обновит только те части экрана.Единственное, что вы не можете использовать его с дисплеями pygame.OPENGL, по-видимому.

Тем не менее, вы уверены, что хотите анимировать свою воду со скоростью 300 кадров в секунду?Похоже, что вы должны просто сообщить методу рисования, какой у вас тик, и использовать его, чтобы выяснить, какой кадр отображать.например,

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 голос
/ 11 декабря 2010

Ваш код неверен.Общая схема (упрощенная: 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)] для 10 кадров в секунду в спрайте воды)

...