【问题标题】:Moving objects in pygame using keyboard module使用键盘模块在pygame中移动对象
【发布时间】:2021-11-10 14:14:05
【问题描述】:

我正在使用 pygame 创建 2 人 PONG 游戏。我的球拍两边都有。 其中一个用WS 移动,另一个用UPDOWN 箭头移动。 我正在使用此代码来移动球拍:

chx = 0.051
chy = 0.051

def ychangeneg():
    global y
    if y <= 4:
        return
    else:
        y -= chy
    return

def ychangepos():
    global y
    if y >= 327:
        return
    else:
        y += chy
    return


def y1changeneg():
    global y1
    if y1 <= 4:
        return
    else:
        y1 -= chy
    return

def y1changepos():
    global y1
    if y1 >= 327:
        return
    else:
        y1 += chy
    return

while True:
    for event in pygame.event.get():
        keyQ = pygame.key.get_pressed()
    
        if event.type == pygame.QUIT:
            system("cls")
            quit()
            

        keyboard.add_hotkey("w",lambda:ychangeneg())
        keyboard.add_hotkey("s",lambda:ychangepos())

        keyboard.add_hotkey("up",lambda:y1changeneg())
        keyboard.add_hotkey("down",lambda:y1changepos())

chy 变量改变球拍的 y 并移动它。但是我有这些问题:

  1. 当我开始握键时,球拍开始延迟移动,然后变得更快
  2. 当我同时按住 2 个键(WUP arrow)时,球拍不动

起初,我发现了一些使用key= pygame.key.get_pressed()的代码,但是当你用这个代码按住一个键时,它会移动但不是连续的。

【问题讨论】:

  • 顺便说一句,您可以删除放在return 之后的else 语句,因为如果上面的if 语句被评估为True,那么函数会在检查else 语句之前停止.您也可以将lambda:ychangeneg() 更改为ychangeneg 而不使用括号以获得相同的结果。
  • documentationpygame.key.get_pressed() 是要走的路。另请查看this question

标签: python pygame keyboard pong


【解决方案1】:

我建议不要使用键盘模块。而是看,使用pygame.key.get_pressed() 按下了哪个键。检查钥匙是否在那里,如果是,则更改坐标。

有点像这样:

pressed_keys = pygame.key.get_pressed()
if pressed_keys[pygame.UP]: # this evaluates to true if the up key is pressed
    ychangeneg()
if pressed_keys[pygame.DOWN]:
    ychangepos()
# and so on...

【讨论】:

    【解决方案2】:

    不要将pygame.key 模块与python keyboard 模块混用。

    参见How can I make a sprite move when key is held down,它会根据按下的键更改 y 坐标:

    def move_y(y, keys, up, down):
        new_y = y + (keys[down] - keys[up]) * chy
        return max(4, min(327, new_y))
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                system("cls")
                quit()
    
        keyQ = pygame.key.get_pressed()
        y = move_y(y, keyQ, pygame.K_w, pygame.K_s)            
        y1 = move_y(y1, keyQ, pygame.K_UP, pygame.K_DOWN)   
    

    小例子:

    import pygame
    
    pygame.init()
    window = pygame.display.set_mode((400, 350))
    clock = pygame.time.Clock()
    
    paddle1 = pygame.Rect(10, 0, 10, 20)
    paddle1.centery = window.get_rect().centery
    paddle2 = pygame.Rect(380, 0, 10, 20)
    paddle2.centery = window.get_rect().centery
    chy = 10
    
    def move_y(y, keys, up, down):
        new_y = y + (keys[down] - keys[up]) * chy
        return max(4, min(327, new_y))
    
    run = True
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False    
    
        keyQ = pygame.key.get_pressed()
        paddle1.y = move_y(paddle1.y, keyQ, pygame.K_w, pygame.K_s)            
        paddle2.y = move_y(paddle2.y, keyQ, pygame.K_UP, pygame.K_DOWN)     
    
        window.fill(0)
        pygame.draw.rect(window, (255, 255, 255), paddle1)
        pygame.draw.rect(window, (255, 255, 255), paddle2)
        pygame.display.flip()
        clock.tick(60)
    
    pygame.quit()
    exit()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 2014-06-28
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多