pygame
イベント処理
サーチ…
イベントループ
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が内部的にイベントを処理するようにする必要があります。
キーボードイベント
KEYDOWN
、 KEYUP
とKEYUP
2種類のキーイベントがありKEYUP
。これらのイベントには、キーボード上のキーを表す整数である属性key
があります。 pygameモジュールには、すべての共通キーを表すあらかじめ定義された整数定数があります。定数は、大文字のK
、アンダースコア、およびキーの名前で命名されます。例えば、< -という名前が付けられK_BACKSPACE
、Aの名前はK_a
とF4が namnedさK_F4
。
例
このコードは、ユーザーがw 、 a 、 s、または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
と呼ばれる別の属性があります。これは、キーとして同時に押される修飾語( shift 、 ctrl 、 altなど)です。 mod
属性は、押されている修飾子を表す整数です。各修飾子の整数値は、 KMOD_
の名前と名前でpygameモジュールに格納されます。たとえば、 左シフトの名前はKMOD_LSHIFT
、 タブの名前はKMOD_TAB
、 Ctrlの名前はKMOD_CTRL
です。
例
このコードは、ユーザーがa 、 Left 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 MOUSEMOTION
、 MOUSEBUTTONDOWN
、およびMOUSEBUTTONUP
は、3種類のマウスイベントがありMOUSEBUTTONUP
。 Pygameは、表示モードが設定されているときにこれらのイベントを登録します。
MOUSEMOTION
は、ユーザがマウスをディスプレイ内に動かすと受信される。 buttons
、 pos
、 rel
属性があります。
-
buttons
は、マウスボタン(left
、mouse-wheel
、right
)が押されているかどうかを表すタプルです。 -
pos
はピクセル単位のカーソルの絶対位置(x
、y
)です。 -
rel
は、以前の位置(rel_x
、rel_y
)rel_y
ピクセル単位の位置です。
MOUSEBUTTONDOWN
およびMOUSEBUTTONUP
は、ユーザーがマウスボタンを押したり離したりすると受信されます。彼らはbutton
とpos
の属性を持っています。
-
button
は、押されているボタンを表す整数です。左ボタン1
、マウスホイール2、右ボタン3
。 -
pos
は、ユーザがマウスボタンを押したときのマウス(x
、y
)の絶対位置です。
例
各マウスイベントの属性の一部を使用した簡単な例を次に示します。
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.MOUSEBUTTONDOWN
とpygame.MOUSEBUTTONUP
イベントを。
状態チェック
pygame.key
とpygame.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()