PygameのEventモジュールの詳細な例
マウスクリック、キーボードヒット、ゲームウィンドウの移動、ウィンドウのサイズ変更、特定のプロットの起動、ゲームの終了など、これらは "イベント"としてみなすことができ、Pygamesはユーザーが生成したアクション(またはイベント)を受け入れるPygameは、いつでも生成可能で大小にかかわらず、ユーザーが生成したものを受け入れる。
イベントの種類
Pygameはイベントを処理するための特別な構造、イベントキューを定義しています。これはキューに関する"first come, first served"の基本原則に従い、ユーザーのアクション(トリガーイベント)を順序よく、1つずつ処理できるようにするものです。次の表は、Pygameで一般的なゲームイベントの一覧です。
<テーブル イベントの種類 説明 メンバー属性 QUIT ユーザーがウィンドウの閉じるボタンを押した場合 なし ATIVEEVENT Pygameが起動または非表示になっている ゲイン,状態 キーダウン キーボードが押された ユニコード、キー、モッド キーアップ キーボードリリース キー, mod マウスモーション マウスの動き pos, rel, ボタン マウスボタンダウン マウスが押された pos, ボタン マウスブツトンポイントアップ マウスリリース pos, ボタン JOYAXISMOTION ジョイスティックまたはパッドの動き ジョイ、軸、値 JOYBALLMOTION ジョイボール動作 ジョイ、軸、値 JOYHATMOTION ジョイスティックモバイル ジョイ、軸、値 JOYBUTTONDOWN ゲームパッドが押された ジョイ、ボタン JOYBUTTONUP ゲームパッド解除 ジョイ、ボタン ビデオサイズ Pygameのウィンドウのスケーリング サイズ、幅、高さ VIDEOEXPOSE Pygameウィンドウの一部を公開する(expose) なし USEREVENT ユーザーイベントのトリガー イベントコード
なお、ゲーム開発にPygameを使用する場合、上記の事象がすべて当てはまるわけではないので、例を挙げながらどのように学ぶかが重要です。
イベント処理方法
Pygame.eventモジュールは、次の表に示すように、イベントキューを処理するための一般的なメソッドを提供します。
<テーブル メソッド 説明 pygame.event.get() イベントキューからイベントを取得し、キューから削除します。 pygame.event.wait() イベントが発生するまでブロックし、イベントが発生しない場合はブロックしたままとなる pygame.event.set_blocked()を実行します。 どのイベントがキューに入るのをブロックするかを制御します。パラメータが None の場合、すべてのイベントがブロックされます。 pygame.event.set_allowed()を実行します。 キューで許可されるイベントを制御します。 pygame.event.pump() このメソッドが呼び出されると、Pygameは自動的にイベントキューを処理します。 pygame.event.poll() は、実際の状況に応じて、実際のイベント、または None を返します。 pygame.event.peek()を実行します。 特定のタイプのイベントがキューにあるかどうかを検出する pygame.event.clear() キューからすべてのイベントをクリアする pygame.event.get_blocked()を実行します。 特定のタイプのイベントがキューに入ることを禁止されているかどうかをテストします。 pygame.event.post() 新しいイベントをキューに入れる pygame.event.Event() 新しいユーザー定義イベントを作成する
Pygameを使ってイベントを処理する場合、ロジックは概ね同じようなものになります。まずイベントの種類を判断し、イベントのアクションに応じて異なるゲームアクションを実行します。ですから、この状況はif ... elseステートメントを使うのに最適なのです。以下に示すように
# Take 500 users for testing
cust = data[:500]
km = KMeans(n_clusters=4)
km.fit(cust)
pre = km.predict(cust)
マウスイベントとキーボードイベントに適用される上記の各メソッドについて、以下に簡単に説明します。
キーボードイベントの処理
キーボードイベントは、ゲームの上下左右やキャラクターの前進後退など、多くのキー操作を伴うことがありますが、いずれもキーボードを操作する必要があります。
keyboardイベントにはキーボードのキーを取得できるkeyプロパティが用意されており、Pygameではキーボードのキーをアルファベットキー、数字キー、組合せキーなどの定数として定義しています。次の表は、一般的なキーの定数の一覧です。
<テーブル 定数名 説明 K_BACKSPACE バックスペース(Backspace) K_TAB 集計キー(Tab) K_CLEAR クリアキー(Clear) K_RETURN エンターキー(Enter) K_PAUSE 一時停止ボタン(ポーズ) K_ESCAPE 終了キー(Escape) K_SPACE スペースキー(Space) K_0... .K_9 0... .9 K_a... .Kz a. .z K_DELETE Deleteキー(削除) k_kp0... .k_kp9 0(キーパッド)... .9(キーパッド) K_F1... .K_F15 F1... .F15 K_UP 上向き矢印 K_DOWN 下矢印 K_RIGHT 右矢印 K_LEFT 左矢印 KMOD_ALT Altキー同時押し
キー定数についてもっと知りたい方は、公式ドキュメントを参照してください。 クリックで移動します .
ここでは、"画像移動"の例で、キーボードイベントがどのように処理されるか、次のように見てみましょう。
silhouette_score(cust, pre)
プログラムを実行すると、次のような結果が得られます。
図1:Pygameのキーボードイベント - 画像の移動
マウスイベントの処理
マウスはパソコンにとって最も重要な外部機器の一つであり、ゲーマーにとって欠かせないツールの一つでもあります。
PygameはMOUSEMOTION、MOUSEBUTTONDOWN、MOUSEBUTTONUPという3つのマウスイベントを提供しており、それぞれ異なるメンバのプロパティに対応したイベントタイプを持っています。以下に示すように
pygame.event.MOUSEMOTION マウス移動イベント
event.pos ウィンドウの左上隅を基準としたマウスの現在の座標値(x,y)です。
event.rel マウスの相対移動距離(x,y)、最後のイベントからの相対移動距離。
event.buttons マウスのボタンの初期状態 (0,0,0) は、(左ボタン、ホイール、右ボタン)に対応し、移動中にそのボタンをクリックすると、対応する位置が 1 に変更されます。
Pygame.event.MOUSEBUTTONUP マウスボタン解放イベント
event.pos ウィンドウの左上隅を基準としたマウス座標の現在値 (x,y)
event.button マウスリリースキー番号(整数) 左ボタンが1、スクロールホイールを押すのが2、右ボタンが3
pygame.event.MOUSEBUTTONDOWN マウスボタン押下イベント
event.pos ウィンドウの左上隅を基準としたマウスの現在値(x,y)
event.button マウスの押したキー番号(整数)、左ボタンが1、押したスクロールホイール2、右ボタンが3、スクロールホイール4が前進、スクロールホイール5が後進
マウスイベントについては、以下のサンプルコードで簡単な例を示しています。
プログラムは次のように実行されます。
図2: Pygameのマウスイベント - マウスの移動
Pygame Eventモジュールの詳細な例についての記事は以上です。Pygame Eventの詳細については、Script Houseの過去の記事を検索するか、以下の関連記事を引き続き参照してください。
関連
-
Python関数の高度な応用を解説
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)
-
[解決済み】Python TypeError: object.__format__ に渡される空でないフォーマット文字列
-
[解決済み】AttributeError: 'Series'オブジェクトは'reshape'という属性を持っていない。
-
ValueErrorを解決する。同一ラベルのシリーズオブジェクトしか比較できない
-
[解決済み】pandasの比較でTypeErrorが発生する:dtyped [float64] 配列と [bool] 型のスカラーを比較できない。]
-
[解決済み] AttributeError: モジュール 'matplotlib' には属性 'plot' がありません。
-
[解決済み] random.randintとrandrangeの違いは何ですか?
-
[解決済み] env: python ✎: No such file or directory
-
[解決済み] OpenCVウェブカメラをKivyのユーザインタフェースに統合する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】ValueError: NA / NaN値を含むベクトルでインデックスを作成できない
-
[解決済み] Pandas read_csv low_memory と dtype オプション。
-
[解決済み] matplotlib で matlab の imagesc に相当するもの?[重複]。
-
[解決済み] int' オブジェクトには 'append' という属性がありません。
-
[解決済み] 変動係数とNumPy
-
[解決済み] pysparkを使用してプロットする方法は?
-
mysql-python のインストールエラー。Cannot open include file: 'config-win.h': そのようなファイルまたはディレクトリがありません
-
pythone と PyCharm を再インストールする メモ pip list ランチャーで致命的なエラーが発生しました。Unable to create process using '"d:\?
-
AttributeError: 'numpy.float64' オブジェクトには 'translate' という属性がありません。