2010-12-11 38 views
0

J'ai un jeu avec un fond de tuiles, certains sont statiques (herbe, boue), mais je veux que l'eau coule. J'ai créé une surface appelée eau, puis j'ai une boucle qui traverse une série de 10 pngs pour les cadres de l'eau qui coule. Je veux ensuite mettre à jour cette surface 10 fois plus souvent que le reste du jeu, et le blitter à la surface principale à 30 images par seconde avec les autres objets.Mettre à jour une surface dans Pygame

Cependant tout ce que je peux obtenir est aucun mouvement ou l'eau qui coule à une vitesse folle (en mettant à jour l'affichage entier dans la boucle de mise à jour de l'eau.)

est-il un moyen que je peux mettre à jour juste cette surface?

voici mon code:

#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() 

Répondre

2

Il semble que vous voulez utiliser pygame.display.update. Il suffit de passer une liste de tous les rects des tuiles d'eau, et cela ne fera que mettre à jour ces parties de l'écran. La seule chose est que vous ne pouvez pas l'utiliser avec pygame.OPENGL affiche, apparemment. Cependant, êtes-vous sûr de vouloir animer votre eau à 300 ips? Il semble que vous devriez juste dire à votre méthode de tirage quelle tique vous faites, et l'utiliser pour déterminer quel cadre afficher. par exemple.

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 

Encore mieux serait de charger toutes vos tuiles d'eau dans une liste avant main et utiliser

waterimg = watertiles[tick % 10] 

et le nombre de vos images de 0-9 au lieu de 1-10.

De toute façon, j'espère que cela aide (et fonctionne).

+0

semble très bien, acclame accepté parce que même si je ne l'obtiens pas pour travailler je comprends maintenant le concept beaucoup mieux. une question: comment puis-je obtenir la variable tick? Je n'ai pas une méthode de tirage, juste une boucle infinie: tandis que 1: clock.tick (30) # manipuler les entrées et dessiner tout – espekia

+0

Pour garder une trace de la coche, mettre tick = 0 avant d'entrer dans la boucle et mettez tick = = 1 après avoir appelé flip(). – Krendil

+0

hey, que totalement travaillé = D merci tout un tas! – espekia

1

Votre code ne va pas. Le schéma général est (simplifié: 1 boucle mise à jour - 1 boucle de tirage):

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() 

Vous pouvez utiliser le temps absolu de décider quelle eau cadre à utiliser (ie: water_images[int(now*10.0) % len(water_images)] pour 10fps dans ondine)