3+ 키를 동시에 누르면 피그 게임이 이벤트를 수신하지 않습니다.

StackOverflow https://stackoverflow.com/questions/576634

  •  05-09-2019
  •  | 
  •  

문제

나는 간단한 게임을 개발하고 있습니다 피그 게임... 로켓 배가 날아가서 물건을 쏘는 것.


의문: 키가 키보드 이벤트 방출을 중단하는 이유는 키가 한 번에 눌렀을 때 키보드 이벤트를 방출하는 이유는 무엇입니까?

키 처리에 대해 : 이 프로그램에는 다양한 변수가 있습니다 KEYSTATE_FIRE, KEYSTATE_TURNLEFT, 등...

  1. A. KEYDOWN 이벤트가 처리되고 해당 설정을 설정합니다 KEYSTATE_* true로 변수.
  2. A. KEYUP 이벤트가 처리되고 동일한 변수를 False로 설정합니다.

문제 :만약에 UP-ARROW 그리고 LEFT-ARROW 동시에 압박을 받고, 피그 게임은 KEYDOWN 이벤트시기 SPACE 눌렀습니다. 이 동작은 키에 따라 다릅니다. 편지를 누르면 피그 게임이 방출을 멈추기 전에 약 5 개를 잡을 수있는 것 같습니다. KEYDOWN 추가 키를위한 이벤트.

확인: 메인 루프에서는 위의 동작을 확인하기 위해받은 각 이벤트를 간단히 인쇄했습니다.

코드: 참고 로이 시점에서 주요 이벤트를 처리하는 (원유) 방법은 다음과 같습니다.

while GAME_RUNNING:
    FRAME_NUMBER += 1
    CLOCK.tick(FRAME_PER_SECOND)

    #----------------------------------------------------------------------
    # Check for events
    for event in pygame.event.get():
        print event

        if event.type == pygame.QUIT:
            raise SystemExit()

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_UP:
            KEYSTATE_FORWARD = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_UP:
            KEYSTATE_FORWARD = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_DOWN:
            KEYSTATE_BACKWARD = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_DOWN:
            KEYSTATE_BACKWARD = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_LEFT:
            KEYSTATE_TURNLEFT = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_LEFT:
            KEYSTATE_TURNLEFT = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_RIGHT:
            KEYSTATE_TURNRIGHT = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_RIGHT:
            KEYSTATE_TURNRIGHT = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_SPACE:
            KEYSTATE_FIRE = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_SPACE:
            KEYSTATE_FIRE = False

    # remainder of game loop here...

이 순서를 누르기 위해 :

  • a (down)
  • s (down)
  • d (down)
  • f (down)
  • g (down)
  • h (down)
  • j (down)
  • k (down)
  • a (up)
  • s (up)
  • d (up)
  • f (up)
  • g (up)
  • h (up)
  • j (up)
  • k (up)

출력은 다음과 같습니다.

  • <Event(2-KeyDown {'scancode': 30, 'key': 97, 'unicode': u'a', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 31, 'key': 115, 'unicode': u's', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 32, 'key': 100, 'unicode': u'd', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 33, 'key': 102, 'unicode': u'f', 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 30, 'key': 97, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 31, 'key': 115, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 32, 'key': 100, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 33, 'key': 102, 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 36, 'key': 106, 'unicode': u'j', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 37, 'key': 107, 'unicode': u'k', 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 36, 'key': 106, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 37, 'key': 107, 'mod': 0})>

이것이 일반적인 문제입니까? 해결 방법이 있습니까? 그렇지 않은 경우 Pygame을 사용할 때 다중 키 제어 문제를 처리하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

코드 문제가 아닌 입력 문제처럼 들립니다. 문제가 키보드 자체가 아니라고 확신합니까? 대부분의 키보드는 동시에 누를 수있는 키 수에 제한이 있습니다. 종종 한 번에 서로 가까이있는 몇 가지 키 이상을 누를 수 없습니다.

그것을 테스트하려면 키보드에 글자를 누르고 들고 새 문자가 나타나는시기를 확인하십시오.

내 제안은 다른 곳의 다른 키에 공간을 매핑하고 어떤 일이 일어나는지 보는 것입니다.

다른 팁

다른 사람들이 이미 (특히 저렴한 하위 엔드) 키보드를 이미 피했듯이 품질이 낮습니다. 키보드 매트릭스. 이 키보드를 사용하면 특정 키 조합으로 인해 발생하는 동작이 발생합니다. 또 다른 일반적인 부작용은 "고스트 키"일 수 있으며, 여기서 추가 키 프레스가 실제로 누르지 않은 입력 스트림에 나타납니다.

유일한 솔루션 (문제가 키보드 매트릭스와 관련된 경우)은 키 매핑을 변경하여 행렬의 다른 행/열에서 키를 사용하거나 더 나은 행렬로 키보드를 구입하는 것입니다.

일부 키보드는 특정 키를 함께 보낼 수 없습니다. 종종이 한계는 3 개의 키로 도달합니다.

키보드에 크게 의존 할 수 있습니다. 현재의 이름이없는 키보드는 동시에 누르는 두 키 만 지원하는 경우가 많습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top