7

私はMacOSX 10.6を使用しており、キーボード入力セレクタメニューにDvorak、US Extended、およびNorwegianがあり、USExtendedが使用しています。

キーボード入力でPygameプログラムを実行すると、実際に何が選択されているかに関係なく、 pygameはdvorakを使用していると思っているようです。

これは、キーボード入力を受け取るコードの一部です。

    # Check for events
for event in pygame.event.get():
    if event.type == KEYDOWN:
        # Change the keyboard variables
        if event.key == K_LEFT or event.key == ord('a'):
            moveRight = False
            moveLeft = True
        if event.key == K_RIGHT or event.key == ord('d'):
            moveLeft = False
            moveRight = True
        if event.key == K_UP or event.key == ord('w'):
            moveDown = False
            moveUp = True
        if event.key == K_DOWN or event.key == ord('s'):
            moveUp = False
            moveDown = True
    if event.type == KEYUP:
        if event.key == K_ESCAPE:
            pygame.quit()
            sys.exit()
        if event.key == K_LEFT or event.key == ord('a'):
            moveLeft = False
        if event.key == K_RIGHT or event.key == ord('d'):
            moveRight = False
        if event.key == K_UP or event.key == ord('w'):
            moveUp = False
        if event.key == K_DOWN or event.key == ord('s'):
            moveDown = False
        if event.key == ord('x'):
            player.top = random.randint(0, WINDOWHEIGHT - player.height)
            player.left = random.randint(0, WINDOWWIDTH - player.width)

矢印キーは正常に機能しますが、WASDキーはDvorakと同じ方法でキーボード上に広がります。したがって、「A」は両方のレイアウトで同じ場所にあり、「W」はQWERTYのコンマキーにあります。a代わりにe、、、,およびoキーを探すようにコードを変更すると、期待どおりに機能します。

Pygameに正しいレイアウトを使用させるにはどうすればよいですか?

4

2 に答える 2

2

わかりました、これを機能させるために私はいくつかのアクロバットをしなければなりませんでした。したがって、最初に、から取得できるキースキャンコードevent.scancodeを使用することをお勧めします。各キーには、キーボードの物理キーを参照する一意のコードがあります。これは、キーボードレイアウトdvorakまたは私たちに関係なく同じスキャンコードです。次に、keydownイベントで、使用中の現在のキーボードレイアウトを尊重する押された文字であるunicodeと呼ばれる属性があります。したがって、usレイアウトでdキーを押すと、Unicode dが取得され、dvorakでは、物理キーでe文字が取得され、これが正しく反映されます。event.unicode。ここで少し面倒になります。unicode属性はkeydownイベントでのみ使用可能であり、keyupイベントでは使用できないようです。そこで、スキャンコードからユニコード文字へのマッピングとしてこの情報を追跡するキーマップと呼ばれる辞書を作成しました。以下のサンプルコードは、キーボードレイアウトを考慮して、押した文字を出力します。プログラムの実行中にキーボードレイアウトを切り替えても、正しいキーが選択されているので、試してみることができます。以下に表示される出力は、dvorakに切り替えられたレイアウトでdキーを押したセッションで、同じキーを押して正しくeを取得しました。そして、dvorakをqwertyよりも優れた方法で使用することを嫌います。私もそれを使用します:)

コード

import pygame, os
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
keymap = {}

while True:
    event = pygame.event.wait()
    if event.type == KEYDOWN:
        keymap[event.scancode] = event.unicode
        print 'keydown %s pressed' % event.unicode
        if (event.key == K_ESCAPE):
            os._exit(0)

    if event.type == KEYUP:
        print 'keyup %s pressed' % keymap[event.scancode]

出力

keydown d pressed
keyup d pressed
keydown e pressed
keyup e pressed
于 2012-11-23T15:27:02.800 に答える
0

受け入れられた答えは正しいですが、簡潔にするために、ここに解決策があります:

if event.type == pygame.KEYDOWN:
   print(event.unicode)
于 2020-05-26T17:26:16.033 に答える