2017-02-10 37 views
1

私は緑の円を描くプログラムを持っています。pを押すと、円が消えて赤い線が現れます。しかし、pを再度押すと、緑色の円が再表示されますが、再表示されません。Python pygame.event.get_pressed()は更新されません

初めてpを押したときにpygame.event.get_pressed()関数を呼び出すと、常に同じ値が返されます。 get_pressed()メソッドを正しく読み込むために使用しなければならないキーボードリセットがありますか?

import pygame 
import time 

BLACK = (0,0,0) 
WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 

pygame.init() 

size = (700,700) 
screen = pygame.display.set_mode(size) 
screennumber = 1 

pygame.display.set_caption("Game Test") 

running = True 
width = 350 

clock = pygame.time.Clock() 

while running: 

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     running = False 

screen.fill(BLACK) 

pressed = pygame.key.get_pressed() 
print(pressed) 

if pressed[pygame.K_p]: 
    screennumber = 2 
else: 
    screennumber = 1 

if screennumber == 1: 

    pygame.draw.circle(screen,GREEN,[350,350], width,1) 

    pygame.display.flip() 

    if width>1: 
     width = width-1 

if screennumber == 2: 

     time.sleep(0.25) 
     pause = True 
     while pause: 
      pressed = pygame.key.get_pressed() 
      print(pressed) 
      if pressed[pygame.K_r]: 
       pause = False 

      pygame.draw.line(screen,RED,[0,0],[700,700],5) 

      pygame.display.flip() 

      clock.tick(21) 


pygame.display.flip() 

clock.tick(21) 


pygame.quit() 

ありがとう:

は、ここに私のコードです!

+0

残りのコードは、 'pygame.event.get()'を呼び出したブロックの後ろに字下げするべきですか? 'pygame.key.get_pressed()'は、新しいイベントが読み込まれるまで更新されないと思います。 –

答えて

1

pygame.key.get_pressedを使用することは、リアルタイムでキー押下を処理する信頼できる方法ではありません。この関数は、関数呼び出し時にキーボードの状態で辞書を返します。しかし、呼び出しの間にキーが押されて解放された場合、そのキーはまったく押されなかった場合と同じになります。 ユーザーがキーを押したかどうかを確認するより良い方法は、イベントループでpygame.KEYDOWNイベントを処理することです。次に、KEYDOWNが目的のキーに対応しているかどうかを確認します。

プログラムのバージョンは、1)プロセスイベント、2)ゲームの要素を更新する、3)画面に描画する、の3つのセクションに分かれています。

import pygame 
import time 

BLACK = (0,0,0) 
WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 

pygame.init() 

size = (700,700) 
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("Game Test") 

running = True 
width = 350 
paused = False 

clock = pygame.time.Clock() 

while running: 

    # process all events 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 

     # -- HERE IS THE RELEVANT SECTION -- 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_p: 
       paused = not(paused) 

    # update everything 
    if not paused: 
     if width > 1: 
      width = width-1 

    # draw everything 
    screen.fill(BLACK) 
    if not paused: 
     pygame.draw.circle(screen,GREEN,[350,350], width,1) 
    else: 
     pygame.draw.line(screen,RED,[0,0],[700,700],5) 
    pygame.display.flip() 

    # update the clock 
    clock.tick(21) 


pygame.quit() 

このコードについてご質問がありましたら教えてください。

0

pygame.key.get_pressed()イベント機能のいずれかを呼び出すと更新されます。あなたのwhile pause:ループにpygame.event.pump()を入れて、それは正常に動作します。 pygame.event.pump()は、イベントを使用したくないという内部イベントを処理する必要があることをpygameに通知します。

現在のところ、あなたのプログラムは、赤い線が存在する場合(ウィンドウを閉じることはできません)、イベントに応答しないため、pygame.QUITイベントのブロックチェックでイベントループが発生することをお勧めします。

また、イベント機能のいずれかを定期的に呼び出さないと、OSはプログラムがクラッシュしたと考えます。

+0

'pygame.event.get_pressed'は、関数呼び出し時にキーボードの状態を取得します。最後の呼び出し以降に押されて解放されたキーの状態が 'False'のままであるため、ユーザーが最後のフレーム内でキーを押したかどうかを確認するのには役立ちません。代わりに、OPはイベントループ内のすべての必要なイベントを処理する必要があります。 –

+0

はい、[リンク](http://stackoverflow.com/documentation/pygame/5110/event-handling#t=201702100452096335115)で説明されているように、イベントループを使用する方がよい場合がよくあります。 –

関連する問題