2017-09-29 13 views
-1

私は、画面上で矩形を上下に動かしてみようとしています。しかし、キーを押して上または下に移動させるときは、移動するたびにキーを押し続ける必要があります。私がpygame.KEYDOWNと解釈する方法は、私が希望するキーを押し下げることができ、キーを離すまで矩形が動くということでした。押されたキーのPygame KEYDOWNが機能しない

コード:

while True: 
    for event in pygame.event.get(): 
     # all keys 
     keys = pygame.key.get_pressed() 
     # quit game 
     if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]: 
      pygame.quit() 
      quit() 

     # check key down presses 
     elif event.type == pygame.KEYDOWN: 
      # left paddle 
      if keys[pygame.K_q]: 
       left.move(-30) 
      if keys[pygame.K_a]: 
       left.move(30) 

      # right paddle 
      if keys[pygame.K_p]: 
       right.move(-30) 
      if keys[pygame.K_l]: 
       right.move(30) 

     # user let up on a key 
     elif event.type == pygame.KEYUP: 
      if event.key == keys[pygame.K_q] or event.key == keys[pygame.K_a]: 
       left.move(0) 
      elif event.key == pygame.K_p or event.key == pygame.K_l: 
       right.move(0) 

    # call animation function 
    draw() 

    # FPS 
    clock.tick(120) 

leftrightオブジェクトは、次のクラスから来ている:

import pygame 


class Paddle: 

    def __init__(self, screen, h, w, left): 
     self.screen = screen 
     self.width = w 
     self.y = h/2 
     self.pad_width = 10 
     self.pad_height = 70 

     if left: 
      self.x = self.pad_width/2 
     else: 
      self.x = self.width - self.pad_width * 1.5 

    def show(self): 
     WHITE = (255, 255, 255) 
     rect = pygame.Rect(self.x, self.y, self.pad_width, self.pad_height) 
     pygame.draw.rect(self.screen, WHITE, rect) 

    def move(self, speed): 
     self.y += speed 
+0

'KEYDOWN'は、* going * downではなく* being * downキーを検出します。あなたは 'KEYDOWN'と' KEYUP'を検出し、各キーの現在の状態を追跡する必要があります(ヒント、 'keys'の代わりに' event.key'を使用してください)。 –

+0

@NickAイベントを 'if event.key == pygame.K_q: 'などですが、私はそれを動かすために毎回そのキーを押す必要があります。 – kstullich

+1

あなたは現在の鍵の状態を 'q_down = True/False'にしておく必要があります。それが押された/解放されたのであれば、ゲームのループで' if q_down:left.move(-30) 'を実行することができますゲームループではなく、イベント処理ループ) –

答えて

1

あなたのゲームループは、三つの主要な手順で構成する必要があります。

  1. ユーザ入力の処理
  2. があなたのシーンを再レンダリング

は、私は一緒に自分自身を少し混乱している可能性があり、ステップ1と2を実行してだと思うゲームの状態に更新します。

まず、KEYDOWNキーがダウンさはなく、が押されて検出します。このため、私は基本的な例として、現在のキーの状態を追跡することをお勧め:

if event.type == pygame.KEYDOWN: 
    if event.key == pygame.K_q: 
     q_down = True 
else: 
    if event.key == pygame.K_q: 
     q_down = False 

あなたは、単に使用することができます今、ユーザー入力が処理されます。

if q_down: left.move(-30) 

あなたのゲームループ中にゲームの状態を更新します(これはあなたのイベントループの外にあるはずです)。


私はまた、あなたのゲームdevのSEからthis postを読んで、より良いゲームループを理解するためにリンクされたリソースを見てお勧めします。

関連する問題