2010-12-11 4 views
0

Ich habe ein Spiel mit einem Hintergrund aus Fliesen, einige sind statisch (Gras, Schlamm), aber ich möchte, dass Wasser fließt. Ich habe eine Oberfläche namens Wasser erstellt, dann habe ich eine Schleife, die durch eine Reihe von 10 PNG für die Rahmen des fließenden Wassers iteriert. Ich möchte dann diese Oberfläche 10x so oft wie den Rest des Spiels aktualisieren und es mit den anderen Objekten bei 30fps zur Hauptoberfläche blit.Aktualisieren Sie eine Oberfläche in Pygame

aber alles, was ich erreichen kann, ist keine Bewegung oder das Wasser mit wahnsinniger Geschwindigkeit fließt (durch die gesamte Anzeige im Wasser Update Schleife zu aktualisieren.)

ist es eine Möglichkeit, ich nur diese Oberfläche aktualisieren?

hier ist mein 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() 

Antwort

2

Es sieht so aus, als ob Sie pygame.display.update verwenden möchten. Übergeben Sie einfach eine Liste aller Wasserziegel und es wird nur diese Teile des Bildschirms aktualisieren. Die einzige Sache ist, dass Sie es mit pygame.OPENGL offenbar nicht verwenden können.

Sind Sie jedoch sicher, dass Sie Ihr Wasser mit 300 fps animieren möchten? Es scheint so, als ob du deiner Ziehungsmethode nur sagen solltest, was für ein Häkchen du hast, und damit kannst du herausfinden, welcher Frame angezeigt werden soll. z.B.

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 

Noch besser wäre es, alle Steine ​​Ihr Wasser in eine Liste, bevor die Hand und

aus 0-9
waterimg = watertiles[tick % 10] 

und Anzahl Ihrer Bilder anstelle von 1-10 verwenden zu laden.

Wie auch immer, ich hoffe, das hilft (und funktioniert).

+0

scheint ziemlich gut, Prost akzeptiert, denn auch wenn ich es nicht zur Arbeit bekomme, verstehe ich jetzt das Konzept viel besser. eine Frage: Wie bekomme ich die Tick-Variable? Ich habe keine Zeichnungsmethode, nur eine Endlosschleife: während 1: clock.tick (30) #handle Eingaben und alles zeichnen – espekia

+0

Um den Tick zu verfolgen, setzen Sie Tick = 0, bevor Sie die Schleife eingeben , und setze tick + = 1, nachdem du flip() aufgerufen hast. – Krendil

+0

hey, das hat total funktioniert = D danke ein ganzer Haufen! – espekia

1

Ihr Code ist nicht richtig. Das allgemeine Schema ist (vereinfacht: 1-Update-Schleife - 1 Unentschieden Loop):

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

Sie die absolute Zeit verwenden können, um die Rahmen Wasser zu verwenden zu entscheiden (dh: water_images[int(now*10.0) % len(water_images)] für 10fps in Wasser Sprite)

Verwandte Themen