web-dev-qa-db-ja.com

pygame.KEYDOWNの使い方は?

ですから、私の質問はすでに尋ねられている可能性が高いですが、何を検索すればよいかわからず、あまり見つかりませんでした。だから、私の問題は、イベントをチェックする2つの関数を作成したことです

def get_pygame_events():
  pygame_events = pygame.event.get()
  return pygame_events

そして

def get_keys_pressed(self):
  keys_pressed = get_pygame_events()  #pygame.event.get(pygame.KEYDOWN)
  # print(keys_pressed)
  keys_pressed_list = []
  for event in keys_pressed:
    if event.type == pygame.KEYDOWN:
      if event.key == K_LEFT:
        keys_pressed_list.append("left")
      if event.key == K_RIGHT:
        keys_pressed_list.append("right")
      if event.key == K_UP:
        keys_pressed_list.append("up")
      if event.key == K_DOWN:
        keys_pressed_list.append("down")
      if event.key == K_a:
        keys_pressed_list.append("a")
      if  event.key == K_d:
        keys_pressed_list.append("b")
      if event.key == K_w:
        keys_pressed_list.append("w")
      if event.key == K_s:
        keys_pressed_list.append("s")
      if event.key == K_SPACE:
        keys_pressed_list.append("space")
      if event.key == K_q:
        keys_pressed_list.append("q")
      if event.key == K_e:
        keys_pressed_list.append("e")
    if event.type == pygame.MOUSEBUTTONDOWN:
      keys_pressed_list.append("click")
      return (keys_pressed_list, event.pos)
  return keys_pressed_list

私は次のようなことができると思っていました。

while True:
  Variable1 = get_pygame_events()
  Variable2 = get_keys_pressed()
  if Variable2 == ["w"]:
    print("w")

(追記:そのwhileループは、私が行ったことの要約にすぎません)次に、Wを押したままにすると、Wが何度も何度も印刷され、代わりに、試したときにWが1回印刷されました。そして、私がもう一度押さない限り、それが起こるすべてです。 W(または任意の)キーを押したままにして、発生しているイベントを識別し、(この場合)whileループを通過するたびにwを出力するには、どうすればよいですか?

3

_pygame.KEYDOWN_および_pygame.KEYUP_を使用して、キーが物理的に押されたか離されたかを検出します。キーを押したときに_pygame.key.set_repeat_を使用して複数の_pygame.KEYDOWN_イベントを生成することにより、キーボードの繰り返しをアクティブにすることができますが、それはめったに良い考えではありません。

代わりに、 pygame.key.get_pressed() を使用して、キーが現在押されているかどうかを確認できます。

_while True:
    ...
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_w]:
       print("w is pressed")
    if pressed[pygame.K_s]:
       print("s is pressed")
_
9
sloth
event.key == chr('a') 

event.keyは、キーのASCIIを返します

4
xwang

ポーリングメカニズムを使用するのではなく、イベント駆動型のアプローチに固執することをお勧めします。

キーイベントに、押されたキーimoを反映するように内部状態を変更させる必要があります。

例:キーボードで宇宙船を制御しています。 「w」、「s」、「a」、または「d」のいずれかを押して船を特定の方向に加速させると、推進ロケットが発射されます。

  • Pygame.KEYDOWNイベントで、[K_w、K_s、K_a、K_d]のevent.keyの場合、オブジェクトに適切な加速度ベクトルを設定します。
  • Pygame.KEYUPイベントで、[K_w、K_s、K_a、K_d]のevent.keyの場合、加速度ベクトルをゼロベクトルに設定します。

これにより、移動キーを押している間はオブジェクトが効果的に加速し、キーを離すと加速が停止します。

2
user2015735

Pygame.key.set_repeat()を使用します。

set_repeat(delay、interval)->なし。

キーボードリピートが有効になっている場合、キーを押し続けると、複数のpygame.KEYDOWNイベントが生成されます。遅延は、最初に繰り返されたpygame.KEYDOWNが送信されるまでのミリ秒数です。その後、別のpygame.KEYDOWNがミリ秒間隔で送信されます。引数が渡されない場合、キーの繰り返しは無効になります。

1
pydude