2017-09-29 70 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'可以检测到关键*不会*下降。你应该检测到'KEYDOWN'和'KEYUP'并跟踪每个键的当前状态(提示,在所有情况下使用'event.key'而不是'keys') –

+0

@NickA我将事件改为'if event.key == pygame.K_q:'等,但我仍然需要每次按下键使其移动。 – kstullich

+1

你需要保持当前的按键状态'q_down = True/False',这取决于它是否被按下/释放,然后在你的游戏循环中你可以做'if q_down:left.move(-30)'(注意我说在你的游戏循环中,不是事件处理循环) –

回答

1

你的游戏循环应该包括三个主要步骤:

  1. 处理用户输入
  2. 更新游戏状态
  3. 重新渲染场景

我觉得做步骤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) 

更新游戏状态(注意这应该在你的事件循环之外)。


我也建议你阅读的游戏开发SE this post和看看链接的资源,以更好地理解游戏循环。