2014-05-16 285 views
0

我正在做一個小遊戲,並且在按下某個鍵時我無法旋轉其中一個形狀。我設法旋轉形狀,但是當按下按鍵時,它會繼續旋轉(90度),而不是停留在新的位置。我有一種感覺,它是在某種類型的循環,但我似乎無法擺脫循環。希望有人能幫忙。相關的代碼位於從底部第六行了(ELIF鍵[K_D])Pygame形狀旋轉

class Player(pygame.sprite.Sprite): 

def __init__(self, screen): 
    self.screen = screen 
    self.image = pygame.image.load(os.path.join('shape.png')) 
    self.rect = self.image.get_rect() 
    self.rect.x = 10 
    self.rect.y = 540 
    #You don't need to define self.width because it is now self.rect.width 
    #Same with self.height 
    self.speed = 10 

def update(self): 
    keys = pygame.key.get_pressed()  

    if keys[K_LEFT]: 
     self.rect.left -= self.speed 
     if self.rect.left < 0: #The left edge 
      self.rect.left = 0 
    elif keys[K_RIGHT]: 
     self.rect.right += self.speed 
     if self.rect.right > WINDOW_WIDTH: 
      self.rect.right = WINDOW_WIDTH 
    elif keys[K_UP]: 
     self.rect.top -= self.speed 
     if self.rect.top < 0: 
      self.rect.top = 0 
    elif keys[K_DOWN]: 
     self.rect.bottom += self.speed 
     if self.rect.bottom > WINDOW_HEIGHT: 
      self.rect.bottom = WINDOW_HEIGHT 
    ***#THE CODE BELOW IS THE SHAPES ROTATION***.   
    elif keys[K_d]: 
     self.image = pygame.transform.rotate(self.image, 90) 

def draw(self, screen=None): 
    if screen is None: 
     screen = self.screen 

    screen.blit(self.image, (self.rect.x, self.rect.y)) 
+0

爲什麼不添加打印在那裏,看看它是否仍然認爲D被按下......你可能不得不按下另一個鍵或清除鍵緩衝區或... –

+0

90沒有指定多遠旋轉? – user3286261

+0

第二個參數是一個指定的角度,所以移動90度並不奇怪。 –

回答

0

據我看到它時,你實際上調用更新每一幀。

pygame.keys.get_pressed()如果真的按下「d」,則每幀按下時返回「d」。更好地處理pygame.KEYDOWN和KEYUP事件的事件檢查。只有按下按鍵並釋放後纔會觸發它們。

我建議鍵盤映射添加到主程序類的構造函數(該

def __init__(self): 

部分)。

我只將d鍵添加到我的示例中,其他可以添加到您自己的示例中。

self.keymap = {pygame.K_d: False} 

然後還在爲活動主循環檢查:

while running: 
    for event in pygame.event.get(): 
     if event.type == pygame.KEYDOWN: 
      if event.key in self.keymap: 
       self.keymap[event.key] = True 

     if event.type == pygame.KEYUP: 
      if event.key in self.keymap: 
       self.keymap[event.key] = False 

KEYDOWN屬於人只有一次,當按鍵被按下發射並同時鍵被按下不返回True每一幀。它將主類中的變量設置爲True,然後在其他類中使用該變量。

KEYUP僅在您釋放密鑰時纔會觸發。它將keymap中的變量重置爲False,因此程序已準備好處理該鍵的下一個KEYDOWN事件。

您在您的播放器的更新方法的變量:

if Main.keymap[K_d] == True: 
    self.image = pygame.transform.rotate(self.image, 90) 

這是任何對你有用嗎?

//編輯: 爲了使這個很清楚再次,希望指出凡在你的代碼的問題在於:

pygame.keys.get_pressed 

,則返回true,如果每一個鍵被按下還是框架,因此對您的旋轉在每一幀中按住鍵。

pygame.KEYDOWN 

pygame.KEYUP 

只有當按鍵被按下或釋放觸發一次,這樣他們就不會返回True第二次,即使你保持按下鍵。