2013-10-16 198 views
1

我正在製作一個涉及鏈條旋轉部分的小遊戲。我是pygame的新手,但這是開始。使旋轉平滑

#!/usr/bin/python 
import pygame 
def draw(square): 
    (x,y) = square 
    pygame.draw.rect(screen, black, (100+x*20,100+y*20,20,20), 1) 

def rotate(chain, index, direction): 
    (pivotx, pivoty) = chain[index] 
    if (direction == 1): 
     newchain = chain[:index]+[(y-pivoty+pivotx, (x-pivotx)+pivoty) for (x,y) in chain[index:]] 
    else: 
     newchain = chain[:index]+[(y-pivoty+pivotx, -(x-pivotx)+pivoty) for (x,y) in chain[index:]] 

    if (set(chain) & set(newchain[index+1:]) == set()): 
     return newchain 
    else: 
     print "Collision!" 
     return chain 

pygame.init() 

size = [600, 600] 
screen = pygame.display.set_mode(size) 
white = (255,255,255) 
black = (0,0,0) 

n = 20 
chain = [(i,0) for i in xrange(n)] 

screen.fill(white) 
for square in chain: 
    draw(square) 

pygame.display.flip() 
raw_input("Press Enter to continue...") 
newchain = rotate(chain, 5, 1) 
print chain 
print newchain 
screen.fill(white) 
for square in newchain: 
    draw(square) 

pygame.display.flip() 
raw_input("Press Enter to continue...") 

是否有可能使旋轉順暢顯示爲動畫而不是僅僅跳轉到正確的地方pygame的?

+0

不止一個步驟。 –

回答

1

您應該創建一個不會將狀態更改爲最終狀態的函數,但會執行一小部分動作,如果未完成動畫,則會使用超時進行調用。

例如(這是僞pygame的)

f(object): 
    object.position.x = 10 

不會使物體動畫順利,但

f(object): 
    if object.position.x >= 10: 
     return 
    object.position.x += 1 
    setTimer(10, f(object)) 

一樣。

+0

你會怎麼做屏幕刷新?我目前有screen.fill(白色),這似乎不是很明智。 – felix

+0

編寫另一個函數drawEverything,它將繪製您想要的每個對象,並每X毫秒調用一次該函數。 –

+0

它應該在每次更新繪圖之前做screen.fill(白色)嗎? – felix