2014-04-28 170 views
1

繼承人的代碼:Pygame鍵按住?

import pygame, sys 
from pygame.locals import * 

RED = (255, 0, 0) 
GREEN = (0, 255, 0) 
BLUE = (0, 0, 255) 
WHITE = (255, 255, 255) 
GRASSCOLOR = GREEN 
BGCOLOR = WHITE 

WINDOWWIDTH = 500 
WINDOWHEIGHT = 300 

def main(): 
    pygame.init() 

    global DISPLAYSURF 

    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT)) 
    pygame.display.set_caption('Platformer') 

    player = pygame.image.load('megaman_running_sprites_by_cobalt_blue_knight-d2y1i8s.png') 

    playerx = 140 
    playery = 10 

    DISPLAYSURF.fill(BGCOLOR) 
    DISPLAYSURF.blit(player, (10, 140)) 
    while True: # Event handling loop 
     ground() 
     mousex, mousey = pygame.mouse.get_pos() 

     for event in pygame.event.get(): 
      if event.type == QUIT: 
       terminate() 
      elif event.type == KEYDOWN: 
       if event.key == K_RIGHT: 
        DISPLAYSURF.fill(BGCOLOR) 
        playery += 10 
        DISPLAYSURF.blit(player, (playery, playerx)) 

       elif event.key == K_LEFT: 
        DISPLAYSURF.fill(BGCOLOR) 
        playery -= 10 
        DISPLAYSURF.blit(player, (playery, playerx)) 

       elif event.key == K_SPACE: 
        DISPLAYSURF.fill(BGCOLOR) 
        playerx -= 15 
        DISPLAYSURF.blit(player, (playery, playerx)) 
        DISPLAYSURF.fill(BGCOLOR) 
        playerx -= 15 
        DISPLAYSURF.blit(player, (playery, playerx)) 
        DISPLAYSURF.fill(BGCOLOR) 
        playerx -= 10 
        DISPLAYSURF.blit(player, (playery, playerx)) 
        DISPLAYSURF.fill(BGCOLOR) 
        playerx -= 5 
        DISPLAYSURF.blit(player, (playery, playerx)) 

      elif event.type == KEYUP: 

       if event.key == K_SPACE: 
        pygame.time.wait(100) 
        DISPLAYSURF.fill(BGCOLOR) 
        playerx += 45 
        DISPLAYSURF.blit(player, (playery, playerx)) 

       elif event.key == K_RIGHT: 
        DISPLAYSURF.fill(BGCOLOR) 
        DISPLAYSURF.blit(player, (playery, playerx)) 

     pygame.display.update() 

def terminate(): # Terminates the program 
    pygame.quit() 
    sys.exit() 

def ground(): 
    pygame.draw.rect(DISPLAYSURF, GRASSCOLOR, (0, 250, WINDOWWIDTH, 100)) 

if __name__ == '__main__': 
    main() 

我有這樣,當我按下左/右按鍵的那張圖像左,右10個像素。但是我怎麼做到這一點,當我按下鍵時,它會重複該功能,如果我讓鍵移動,它將停止。我已經嘗試添加一個while循環,所有這些都會讓這些人無限地向右/向左移動,所以有pygame模塊來添加它嗎?

+0

您可以使用['pygame.key'](https://www.pygame.org/docs/ref/key.html)模塊和函數['get_pressed()'](https:// www .pygame.org/docs/ref/key.html#pygame.key.get_pressed),它將返回所有正在按住的鍵。一個例子可以在這裏找到(http://stackoverflow.com/documentation/pygame/5110/event-handling/18049/state-checking#t=201612270158074583064),*鍵盤事件*下。 –

回答

2

您不需要另一個模塊,但需要另一種方法和更多更正。首先:每幀在一幀中執行一次blitting,而不是每次你在某個地方改變某個東西。

while True: # Event handling loop 
    ground() 
    mousex, mousey = pygame.mouse.get_pos() 

    for event in pygame.event.get(): 
     if event.type == QUIT: 
       terminate() 
     elif event.type == KEYDOWN: 
      if event.key == K_RIGHT: 
       playery += 10 
      elif event.key == K_LEFT: 
       playery -= 10 
      elif event.key == K_SPACE: 
       #WTH are you doing here anyway??? 

     elif event.type == KEYUP: 

      if event.key == K_SPACE: 
       pygame.time.wait(100) #What is this doing here? 

    DISPLAYSURF.fill(BGCOLOR) 
    DISPLAYSURF.blit(player, (playerx, playery)) 
    pygame.display.update() 

然後第二個:更改x和y值,這是錯誤的方式。 x是水平的,y是垂直的。它永遠都是這樣的,如果你在這裏重新發明輪子,人們不能再讀你的代碼了。

現在對於這個問題你問:

您需要定義一個變量,例如「move_left」和「move_right」。

在循環的情況下檢查,那麼你將它們作爲後續

if event.type == KEYDOWN: 
    if event.key == K_RIGHT: 
     move_right = True 

if event.type == KEYUP: 
    if event.key == K_LEFT: 
     move_right = False 

然後檢查地方在你的循環中,move_left或move_right變量是否爲真:

if move_right == True: 
    playerx += 10 

當我們按下鍵,我們觸發KEYDOWN事件,該事件將變量設置爲true。如果這個變量是真的,那麼程序會改變玩家的位置(注意:每幀10個像素可能太多了),而這個變量是真的,並且它保持爲真,直到我們觸發KEYUP事件。換句話說:按下鍵時,變量爲真,玩家移動。當我們釋放鍵時,變量變爲假,玩家停止移動。

我沒有給你一個現成的代碼,這只是解釋它是如何完成的。如果你真的不知道如何實現,請隨時再問。

+0

http://www.pygame.org/docs/ref/key.html#pygame.key.set_repeat – Sasszem