サーチ…


イベントループ

Pygameは、ユーザーからのすべてのイベントをpygame.event.get()コードで受信できるイベントキューに登録します。このキュー内のすべての要素はEventオブジェクトであり、すべての属性typeはどの種類のイベントであるかを表す整数です。 Pygameモジュールには、型を表すあらかじめ定義された整数定数があります。この属性を除いて、イベントには異なる属性があります。

定数名属性
終了する無し
ACTIVEEVENT 利得、状態
キーダウンユニコード、キー、モード
キーアップキー、モード
MOUSEMOTION pos、rel、buttons
マウスボタンポジション、ボタン
マウスボタンダウンポジション、ボタン
ジョイアキソモーション喜び、軸、価値
ジョイブルモーション喜び、ボール、rel
ジョイハットモーション喜び、帽子、価値
ジョイボタンアップ喜び、ボタン
ジョイボタンダウン喜び、ボタン
ビデオサイズ、w、h
ビデオテソス無し
ユーザーコード

私たちのイベントを処理するには、単にキューをループし、どのタイプが(pygameモジュール内のあらかじめ定義された定数の助けを借りて)チェックしてから、何らかのアクションを実行します。このコードは、ユーザーがディスプレイの上隅にある閉じるボタンを押したかどうかをチェックし、そうであればプログラムを終了します。

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        # Close the program any way you want, or troll users who want to close your program.
        raise SystemExit

注意 :pygameを使用している場合、定期的にイベントキューを呼び出さなければなりません!利用可能なイベントを取得することとは別に、イベントキューを呼び出すことは、オペレーティングシステムと内部的にやりとりするための方法です。イベントキューが定期的に呼び出されない場合、オペレーティングシステムはプログラムが正常に機能しなくなったとみなし、プログラムがクラッシュしたように見せます(Windowsではウィンドウが白くなります)。イベントで何もしたくない場合は、 pygame.event.pump()を呼び出してpygameが内部的にイベントを処理するようにする必要があります。


キーボードイベント

KEYDOWNKEYUPKEYUP 2種類のキーイベントがありKEYUP 。これらのイベントには、キーボード上のキーを表す整数である属性keyがあります。 pygameモジュールには、すべての共通キーを表すあらかじめ定義された整数定数があります。定数は、大文字のK 、アンダースコア、およびキーの名前で命名されます。例えば、< -という名前が付けられK_BACKSPACE 、Aの名前はK_aF4が namnedさK_F4

このコードは、ユーザーがwas、またはdを押したかどうかをチェックします。

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # Usually wise to be able to close your program.
        raise SystemExit
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w:
            print("Player moved up!")
        elif event.key == pygame.K_a:
            print("Player moved left!")
        elif event.key == pygame.K_s:
            print("Player moved down!")
        elif event.key == pygame.K_d:
            print("Player moved right!")

修飾子

大文字の整数定数はありません。その代わりに、キーイベントには、 modと呼ばれる別の属性があります。これは、キーとして同時に押される修飾語( shiftctrlaltなど)です。 mod属性は、押されている修飾子を表す整数です。各修飾子の整数値は、 KMOD_の名前と名前でpygameモジュールに格納されます。たとえば、 左シフトの名前はKMOD_LSHIFTタブの名前はKMOD_TABCtrlの名前はKMOD_CTRLです。

このコードは、ユーザーがaLeft shift + aまたはCaps + aを押しかどうかをチェックします。

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # It's still wise to be able to close your program.
        raise SystemExit
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_a:
            if event.mod == 0:  # No modifier.
                print("You pressed 'a'")
            elif event.mod == pygame.KMOD_LSHIFT or event.mod == pygame.KMOD_CAPS:
                print("You pressed 'A'")
            else:
                print("You pressed 'a' with another modifier than right shift or caps.")

マウスイベント

pygame MOUSEMOTIONMOUSEBUTTONDOWN 、およびMOUSEBUTTONUPは、3種類のマウスイベントがありMOUSEBUTTONUP 。 Pygameは、表示モードが設定されているときにこれらのイベントを登録します。

MOUSEMOTIONは、ユーザがマウスをディスプレイ内に動かすと受信される。 buttonsposrel属性があります。

  • buttonsは、マウスボタン( leftmouse-wheelright )が押されているかどうかを表すタプルです。
  • posはピクセル単位のカーソルの絶対位置( xy )です。
  • relは、以前の位置( rel_xrel_yrel_yピクセル単位の位置です。

MOUSEBUTTONDOWNおよびMOUSEBUTTONUPは、ユーザーがマウスボタンを押したり離したりすると受信されます。彼らはbuttonposの属性を持っています。

  • buttonは、押されているボタンを表す整数です。左ボタン1 、マウスホイール2、右ボタン3
  • posは、ユーザがマウスボタンを押したときのマウス( xy )の絶対位置です。

各マウスイベントの属性の一部を使用した簡単な例を次に示します。

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # Close your program if the user wants to quit.
        raise SystemExit
    elif event.type == pygame.MOUSEMOTION:
        if event.rel[0] > 0:  # 'rel' is a tuple (x, y). 'rel[0]' is the x-value.
            print("You're moving the mouse to the right")
        elif event.rel[1] > 0:  # pygame start y=0 at the top of the display, so higher y-values are further down.
            print("You're moving the mouse down")
    elif event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 1:
            print("You pressed the left mouse button")
        elif event.button == 3:
            print("You pressed the right mouse button")
    elif event.type == pygame.MOUSEBUTTONUP:
        print("You released the mouse button")

pygameモジュールのマウスボタン属性にはあらかじめ定義された定数がないので、それぞれの値を以下に示します。

ボタン
左マウスボタン 1
マウスホイールボタン 2
マウスの右ボタン 3
マウスホイールが上にスクロールする 4
マウスホイールを下にスクロールする 5

マウスボタンをスクロールすると発生しますpygame.MOUSEBUTTONDOWNpygame.MOUSEBUTTONUPイベントを。

状態チェック

pygame.keypygame.mouseモジュールから関数を呼び出して、キーとマウスの状態を受け取ることができます。しかし、それはいくつかの欠陥があるので、pygameのイベントを処理するための推奨された方法ではありません:

  • 関数が呼び出されると、状態を受け取ります。これは、ユーザーがボタンを早く押している間にイベント間でイベントが発生しない可能性があることを意味します。

  • あなたはイベントの順序を決定することはできません。

  • pygameのイベント関数の1つをpygameの内部関数と呼ぶ必要があります。そうでなければ、プログラムが応答しなくなったことを警告します。呼び出すことができる関数は次のとおりです。

    • pygame.event.get()を使用して、すべてのイベントまたはイベントタイプを(そのタイプを引数として渡して)キューから取得します。
    • pygame.event.poll()pygame.event.poll()てキューから1つのイベントを取得します。
    • pygame.event.wait()pygame.event.wait()て、キューから1つのイベントを待ちます。
    • pygame.event.clear()pygame.event.clear()て、キュー内のすべてのイベントをクリアします。
    • pygame.event.pump()を使用してpygameが内部アクションを処理できるようにします(上記の関数によって暗黙的に呼び出されます)。

キーボードイベント

キーモジュールにはすべてのキーの状態のリストを返す関数pygame.key.get_pressed()あります。このリストには、押されていないすべてのキーには0が、押されたすべてのキーには1が含まれます。リスト内のそのインデックスは、pygameモジュールの定数で定義され、すべてがK_とキー名で始まります。

pygame.event.pump()  # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_a]:
    print("You pressed 'a'")
if key[pygame.K_F1]:
    print("You pressed 'F1'")
if key[pygame.K_LSHIFT]:
    print("You pressed 'left shift'")
if key[pygame.K_q]:  # Press 'q' to exit the program
    quit()

キーが押されているのではなく、単一のキーが押されているかどうかをチェックしたい場合は、すべてのキーの前の状態を一時変数に格納して、

pygame.event.pump()  # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_q] and not previous_key[pygame.K_q]:
    print("You pressed 'q'")
if key[pygame.K_p] and not previous_key[pygame.K_p]:
    print("You pressed 'p'")
previous_key = key

現在のキーが押され、前のキーが押されていない場合にのみ、ステートメントはtrueに評価されます。ユーザーがキーを解放したかどうかを確認するには、 notキーワードを切り替えるだけです( if not key[pygame.K_q] and previous_key[pygame.K_q] )。これが正しく動作するためには、ゲームループの前に変数previous_key = pygame.key.get_pressed()を設定する必要があります。そうしないと、 NameErrorます。

マウスイベント

マウスモジュールには、マウスの位置を確認したり設定したり、押されたボタンをチェックできる機能があります。関数pygame.mouse.get_pressed()は、マウスボタン(left、mouse-wheel、right)が押されているかどうかを表すpygame.mouse.get_pressed()返します。

pygame.event.pump()  # Allow pygame to handle internal actions.
mouse_pos = pygame.mouse.get_pos()
mouse_buttons = pygame.mouse.get_pressed()
if mouse_pos[0] > 100:
    pygame.mouse.set_pos(10, mouse_pos[1])  # Reset the mouse's x-position to 10.
    print("YOU SHALL NOT PASS!")
if mouse_buttons[2]:
    print("I'm right, right?")
if mouse_buttons[0]:  # Press left mouse button to exit.
    print("Program left")
    quit()


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow