2010-12-11 65 views
0

我有一個由瓷磚製成的背景遊戲,有些是靜態的(草,泥),但是我想讓水流動。我創建了一個叫做水的表面,然後我有一個循環遍歷一系列的10個pngs,用於流動的水流。然後,我想和遊戲的其他部分一樣更新這個表面10倍,然後用其他物體以30fps的速度將其粘貼到主表面上。在Pygame中更新一個表面

然而所有我能實現沒有運動或精神失常速度流動的水(通過在水中更新循環更新整個顯示器。)

是沒有一種方法可以只更新該表面?

這裏是我的代碼:

#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

它看起來像你想使用pygame.display.update。 只需將它傳遞給所有水磚的矩形列表,它只會更新屏幕的這些部分。唯一的問題是你不能在pygame.OPENGL顯示中使用它。

但是,你確定要以300fps動畫水嗎?看起來你應該告訴你的繪圖方法你打算做什麼,然後用它來確定顯示哪個幀。例如

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。

無論如何,我希望這有助於(和工程)。

+0

看起來不錯,乾杯 接受,因爲即使我沒有得到它的工作,我現在明白了這個概念好多了。 一個問題:我如何獲得tick變量?我沒有繪製方法,只是一個無限循環: while 1: clock.tick(30) #句柄輸入並繪製所有內容 – espekia 2010-12-11 15:19:05

+0

要跟蹤刻度,請在進入循環之前將tick = 0 ,並在你調用flip()之後加上tick + = 1。 – Krendil 2010-12-11 15:23:08

+0

嘿,那完全工作= D 謝謝一大堆! – espekia 2010-12-11 15:29:26

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)