wangqq157 发表于 2023-5-8 11:31:09

pygame2.3.0中pygame.key.get_pressed()问题

pygame2.0之前的代码没有问题。但是最近用了pygame2.3.0就有问题了。
问题就是pygame.key.get_pressed() 在获取键盘字母的时候 ,无效。下面代码我设置了上下左右键,使用的时候没有任何问题,但是按下q键的时候上下左右都会失效。


import pygame,sys

pygame.init()

screen = pygame.display.set_mode((1280,720))

image = pygame.Surface((32,64))
image.fill('green')

rect = image.get_rect(center = (640,360))

direction = pygame.math.Vector2()
pos = pygame.math.Vector2(rect.center)
speed = 2

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    keys = pygame.key.get_pressed()

    if keys:
      direction.y = -1
    elif keys:
      direction.y = 1
    else:
      direction.y = 0

    if keys:
      direction.x = -1
    elif keys:
      direction.x = 1
    else:
      direction.x = 0

    if keys:
      print('这边是重点')

    if direction.magnitude() > 0:
      direction = direction.normalize()

    pos.x += direction.x * speed
    rect.centerx = pos.x

    pos.y += direction.y * speed
    rect.centery = pos.y

    screen.fill((0,0,0))

    screen.blit(image,rect)
   
    pygame.display.flip()

    clock.tick(60)

isdkz 发表于 2023-5-8 11:35:49

在pygame2.3.0中, pygame.key.get_pressed() 的行为可能已经发生了变化。你的代码中的问题可能是由于按下q键时,方向键的条件被覆盖了。为了解决这个问题,可以尝试将 elif 替换为 if ,这样即使按下q键,上下左右键也会继续生效。

修改后的代码如下:

import pygame,sys

pygame.init()

screen = pygame.display.set_mode((1280,720))

image = pygame.Surface((32,64))
image.fill('green')

rect = image.get_rect(center = (640,360))

direction = pygame.math.Vector2()
pos = pygame.math.Vector2(rect.center)
speed = 2

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    keys = pygame.key.get_pressed()

    if keys:
      direction.y = -1
    if keys:
      direction.y = 1
    if not keys and not keys:
      direction.y = 0

    if keys:
      direction.x = -1
    if keys:
      direction.x = 1
    if not keys and not keys:
      direction.x = 0

    if keys:
      print('这边是重点')

    if direction.magnitude() > 0:
      direction = direction.normalize()

    pos.x += direction.x * speed
    rect.centerx = pos.x

    pos.y += direction.y * speed
    rect.centery = pos.y

    screen.fill((0,0,0))

    screen.blit(image,rect)

    pygame.display.flip()

    clock.tick(60)


这样,按下q键时,上下左右键仍然会生效。

wangqq157 发表于 2023-5-8 15:13:19

isdkz 发表于 2023-5-8 11:35
在pygame2.3.0中, pygame.key.get_pressed() 的行为可能已经发生了变化。你的代码中的问题可能是由于按下q ...

试过了没用!》

sfqxx 发表于 2023-5-8 18:04:54

根据您的问题描述,我认为可能是由于 `pygame.key.get_pressed()` 方法在检测键盘事件时存在一些问题。对于这个问题,可以尝试使用 `pygame.event.get()` 方法来获取键盘按下/松开事件并在循环中处理。

以下是修改后的代码片段:


while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

      # 检查是否有按键按下或松开
      if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                direction.y = -1
            elif event.key == pygame.K_DOWN:
                direction.y = 1
            elif event.key == pygame.K_LEFT:
                direction.x = -1
            elif event.key == pygame.K_RIGHT:
                direction.x = 1
            elif event.key == pygame.K_q:
                print('这边是重点')

      elif event.type == pygame.KEYUP:
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                direction.y = 0
            elif event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                direction.x = 0
通过捕获 `pygame.KEYDOWN` 和 `pygame.KEYUP` 事件,我们可以检测到所需的按键状态,并相应地更新方向向量。然后,您可以从键盘控制 `rect` 的移动和其他操作。

希望这能解决您的问题。如果这仍然无法解决问题,请提供更多详细信息或错误消息以进行进一步排查。
有用请设置最佳答案!
页: [1]
查看完整版本: pygame2.3.0中pygame.key.get_pressed()问题