3.2イベント処理





翻訳者から:この記事は、公式のSFMLライブラリガイドの翻訳サイクルの10番目です。 過去の記事はこちらにあります。 この一連の記事の目的は、元の言語を知らない人にこのライブラリに慣れる機会を提供することです。 SFMLは、シンプルでクロスプラットフォームのマルチメディアライブラリです。 SFMLは、ゲームやその他のマルチメディアアプリケーションを開発するためのシンプルなインターフェイスを提供します。 元の記事はこちらにあります 始めましょう。



目次:
0.1はじめに



1.はじめに



  1. SFMLとVisual Studio
  2. SFMLとコード::ブロック(MinGW)
  3. SFMLおよびLinux
  4. SFMLとXcode(Mac OS X)
  5. CMakeでSFMLをコンパイルする


2.システムモジュール



  1. 時間処理
  2. ストリーム
  3. ユーザーデータストリームを操作する


3.ウィンドウモジュール



  1. ウィンドウを開いて管理する
  2. イベント処理
  3. キーボード、マウス、ジョイスティックを使用する
  4. OpenGLを使用する


4.グラフィックモジュール



  1. 2D描画オブジェクト
  2. スプライトとテクスチャ
  3. テキストとフォント
  4. フォーム
  5. 頂点配列を使用して独自のオブジェクトを設計する
  6. 位置、回転、スケール:オブジェクトの変換
  7. シェーダーで特殊効果を追加する
  8. 2Dカメラとビューコントロール


5.オーディオモジュール



  1. サウンドと音楽を再生する
  2. オーディオ録音
  3. カスタムオーディオストリーム
  4. 空間化:3Dサウンド


6.ネットワークモジュール



  1. ソケット通信
  2. パッケージの使用と拡張
  3. HTTPを使用したWeb要求
  4. FTPファイル転送




エントリー



この記事では、イベントの詳細なリストを提供し、これらのイベントを処理する方法について説明します。



タイプsf ::イベント



イベントを詳細に分析する前に、 sf ::イベントタイプとは何か、それを正しく使用する方法を理解することが重要です。 sf ::イベントは、 イベントのタイプを保存する関連付けと、補助関数およびメンバーで構成されます。 ユニオンの使用可能なメンバーは、クラスの1つ以上のメンバーに対応します。たとえば、 event.key



KeyPressed



イベントに対応します。 他のメンバーを処理しようとすると、未定義の動作が発生します。 発生しなかったイベントを処理しようとしないでください。



sf :: Eventインスタンスは、 sf :: WindowクラスのpollEvent



(またはwaitEvent



)関数で初期化できます。 これら2つの関数のみがsf :: Eventのインスタンスを初期化できます。



明確にするために、典型的なイベントループは次のようになります。



 sf::Event event; //   ,  ... while (window.pollEvent(event)) { //   ... switch (event.type) { //   case sf::Event::Closed: window.close(); break; //   case sf::Event::KeyPressed: ... break; //       default: break; } }
      
      





上記の段落を読み直し、理解してください。 sf :: Eventクラスは、初心者プログラマにとって多くの問題を引き起こします。



さて、SFMLでイベントがどのように表現されるかがわかったので、次は各イベントの意味を理解します。



クローズドイベント



sf::Event::Closed



、ユーザーがウィンドウマネージャーが提供するメソッド(閉じるボタン、キーボードマクロなど)のいずれかを使用してウィンドウを閉じたいときに発生します。 このイベントは、ユーザーがウィンドウを閉じようとした情報を提供します。 まだ閉じていません。



通常、このイベントに応答して、コードはwindow.close()



を呼び出してウィンドウを閉じます。 ただし、たとえば、アプリケーションの現在の状態を保存したり、ユーザーに何をする必要があるかを尋ねたりするなど、他のことを行うことができます。 このイベントに応答して何もしない場合、ウィンドウは開いたままになります。



このイベントに関連付けられたクラスメンバーは存在しません。



 if (event.type == sf::Event::Closed) window.close();
      
      





サイズ変更されたイベント



sf::Event::Resized



は、ウィンドウのサイズが変更されると発生します。 window.setSize



を呼び出した後、ユーザーアクションの結果として、またはプログラムによって。



このイベントを使用して、ディスプレイ設定を調整できますsfml-graphics



直接使用する場合はビューポート、 sfml-graphics



を使用する場合は現在の視点。



このイベントに関連付けられているクラスメンバーはevent.sizeと呼ばれ、新しいウィンドウサイズが含まれています。



 if (event.type == sf::Event::Resized) { std::cout << "new width: " << event.size.width << std::endl; std::cout << "new height: " << event.size.height << std::endl; }
      
      





LostFocusおよびGainedFocusイベント



イベントsf::Event::LostFocus



およびsf::Event::GainedFocus



は、ウィンドウがフォーカスを失った/獲得したときにsf::Event::GainedFocus



ます。 これは、ユーザーが現在アクティブなウィンドウを変更したときに発生します。 ウィンドウがフォーカスを失うと、キーボードイベントを受け取りません。



このイベントは、たとえば、ウィンドウがアクティブでないときにゲームを一時停止するために使用できます。



このイベントに関連付けられたクラスメンバーは存在しません。



 if (event.type == sf::Event::LostFocus) myGame.pause(); if (event.type == sf::Event::GainedFocus) myGame.resume();
      
      





TextEnteredイベント



文字入力が発生すると、 sf::Event::TextEntered



発生します。 これはKeyPressed



イベントではありませんTextEntered



は、ユーザーが出力可能な文字を入力すると発生します。 たとえば、フランス語のキーボードで「^」と「e」を押すと、2つのKeyPressed



イベントと、文字「ê」を含む1つのTextEntered



のみが発生します。 これは、オペレーティングシステムが提供するすべての入力メソッドで機能します。



このイベントは通常、テキストフィールドへのユーザー入力をトラップするために使用されます。



このイベントに関連付けられているクラスメンバーはevent.text



と呼ばれ、入力された文字のUnicode文字番号が含まれています。 この値をsf :: Stringに入れるか、この文字がASCII文字の範囲(0-127)であることを確認してからchar



にキャストできます。



 if (event.type == sf::Event::TextEntered) { if (event.text.unicode < 128) std::cout << "ASCII character typed: " << static_cast<char>(event.text.unicode) << std::endl; }
      
      





多くのプログラマーは、 KeyPressed



イベントを使用してユーザー入力を処理し、クレイジーなアルゴリズムを使用して、可能なすべてのキーの組み合わせを解釈しようとするユーザー入力を処理します。 これをしないでください!



KeyPressedおよびKeyReleasedイベント



イベントsf::Event::KeyPressed



およびsf::Event::KeyReleased



、キーボードのキーが押された/ sf::Event::KeyReleased



たときにトリガーされます。



キーが押されている場合、オペレーティングシステムによって指定された特定の間隔でKeyPressed



イベントが生成されます(つまり、エディターにテキストを入力するときに適用されるのと同じ遅延)。 KeyPressed



イベントの繰り返しをキャンセルするには、 window.setKeyRepeatEnabled(false)



呼び出します。 明らかに、 KeyReleased



イベントKeyReleased



繰り返されません。



これらのイベントは、たとえば、キャラクターをジャンプさせるために、キーが押されたり離されたときにアクションを1回だけトリガーする場合に使用できます。



時々、人々はスムーズな動きを実装するためにKeyPressed



イベントを使用しようとします。 このイベントは特定の間隔で生成されるため、これは期待される効果にはつながりません。 イベントでスムーズなモーションを実装するには、 KeyPressed



によって設定されKeyReleased



されたブール値を使用する必要があります。 この論理値が確立されている間に移動を実行する必要があります。



sf :: Keyboardを使用してキーボードから水を使用して、スムーズな動きを実装する他の(より簡単な)方法( これに関する記事を参照)。



このイベントに関連付けられたクラスメンバはevent.key



と呼ばれ、押された/押された文字のコードと、修飾キーの現在の状態(alt、control、shift、system)が含まれます。



 if (event.type == sf::Event::KeyPressed) { if (event.key.code == sf::Keyboard::Escape) { std::cout << "the escape key was pressed" << std::endl; std::cout << "control:" << event.key.control << std::endl; std::cout << "alt:" << event.key.alt << std::endl; std::cout << "shift:" << event.key.shift << std::endl; std::cout << "system:" << event.key.system << std::endl; } }
      
      





一部のキーにはオペレーティングシステム固有の値があり、これらのキーの処理により未定義の動作が発生することに注意してください。 たとえば、Windowsでフォーカスを変更するF10キー、またはVisual Studioを使用しているときにデバッガーを起動するF12キー。 この問題は、SFMLの将来のバージョンで解決される予定です。



MouseWheelMovedイベント



sf::Event::MouseWheelMoved



は廃止され、SFML 2.3で廃止されました。 MouseWheelScrolled



使用しMouseWheelScrolled







MouseWheelScrolledイベント



sf::Event::MouseWheelScrolled



、マウスホイールが上下左右に移動しsf::Event::MouseWheelScrolled



ときに発生します(マウスでサポートされている場合)。



このイベントに関連付けられたクラスメンバーはevent.mouseWheelScroll



と呼ばれ、ホイールがシフトしたティック数、ホイールの動きの方向、およびマウスカーソルの現在の位置が含まれます。



 if (event.type == sf::Event::MouseWheelScrolled) { if (event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel) std::cout << "wheel type: vertical" << std::endl; else if (event.mouseWheelScroll.wheel == sf::Mouse::HorizontalWheel) std::cout << "wheel type: horizontal" << std::endl; else std::cout << "wheel type: unknown" << std::endl; std::cout << "wheel movement: " << event.mouseWheelScroll.delta << std::endl; std::cout << "mouse x: " << event.mouseWheelScroll.x << std::endl; std::cout << "mouse y: " << event.mouseWheelScroll.y << std::endl; }
      
      





MouseButtonPressedおよびMouseButtonReleasedイベント



sf::Event::MouseButtonPressed



およびsf::Event::MouseButtonReleased



は、マウスボタンが押された/ sf::Event::MouseButtonReleased



ときに発生します。



SFMLは、5つのマウスボタンをサポートしています:左、右、中央(マウスホイール)、追加#1および追加#2(側面のボタン)。



このイベントに関連付けられたクラスのメンバーはevent.mouseButton



と呼ばれ、押された/押されたボタンのコードとマウスカーソルの位置を含みます。



 if (event.type == sf::Event::MouseButtonPressed) { if (event.mouseButton.button == sf::Mouse::Right) { std::cout << "the right button was pressed" << std::endl; std::cout << "mouse x: " << event.mouseButton.x << std::endl; std::cout << "mouse y: " << event.mouseButton.y << std::endl; } }
      
      





MouseMovedイベント



マウスカーソルがウィンドウ内で移動すると、 sf::Event::MouseMoved



発生します。



このイベントは、ウィンドウの焦点が合っていなくても発生します。 ただし、トリガーは、マウスカーソルがウィンドウの内側の領域内でのみ移動する場合にのみ発生します(タイトルと境界線はウィンドウの内側の端には入りません)。



このイベントに関連付けられているクラスメンバはevent.mouseMove



と呼ばれ、ウィンドウに対するマウスカーソルの位置が含まれています。



 if (event.type == sf::Event::MouseMoved) { std::cout << "new mouse x: " << event.mouseMove.x << std::endl; std::cout << "new mouse y: " << event.mouseMove.y << std::endl; }
      
      







MouseEnteredおよびMouseLeftイベント



イベントsf::Event::MouseEntered



およびsf::Event::MouseLeft



、マウスカーソルがウィンドウに出入りしたときにトリガーされます。



このイベントに関連付けられたクラスメンバーは存在しません。



 if (event.type == sf::Event::MouseEntered) std::cout << "the mouse cursor has entered the window" << std::endl; if (event.type == sf::Event::MouseLeft) std::cout << "the mouse cursor has left the window" << std::endl;
      
      





JoystickButtonPressedおよびJoystickButtonReleasedイベント



イベントsf::Event::JoystickButtonPressed



およびsf::Event::JoystickButtonReleased



は、ゲームパッドボタンが押された/離されたときに発生します。



SFMLは、8つのジョイスティックと32のボタンをサポートしています。



このイベントに関連付けられたクラスメンバーはevent.joystickButton



と呼ばれ、ジョイスティック識別子と押された/押されたボタンのインデックスが含まれます。



 if (event.type == sf::Event::JoystickButtonPressed) { std::cout << "joystick button pressed!" << std::endl; std::cout << "joystick id: " << event.joystickButton.joystickId << std::endl; std::cout << "button: " << event.joystickButton.button << std::endl; }
      
      





JoystickMovedイベント



sf::Event::JoystickMoved



は、ゲームパッドのスティックが動くと発生します。



ジョイスティックスティックは通常非常に敏感であるため、SFMLは検出しきい値を使用してJoystickMoved



継続的なトリガーを回避します。 このしきい値は、 Window::setJoystickThreshold



呼び出すことで変更できます。



SFMLは、X、Y、Z、R、U、V、POV X、POV Yの8本のジョイスティックをサポートしています。ゲームパッドとのやり取りがどのように発生するかは、このゲームパッドのドライバーによって異なります。



このイベントに関連付けられたクラスメンバーはevent.joystickMove



と呼ばれ、ジョイスティック識別子、スティックの名前、および現在の位置([ event.joystickMove



]の範囲)が含まれます。



 if (event.type == sf::Event::JoystickMoved) { if (event.joystickMove.axis == sf::Joystick::X) { std::cout << "X axis moved!" << std::endl; std::cout << "joystick id: " << event.joystickMove.joystickId << std::endl; std::cout << "new position: " << event.joystickMove.position << std::endl; } }
      
      





JoystickConnectedおよびJoystickDisconnectedイベント



イベントsf::Event::JoystickConnected



およびsf::Event::JoystickDisconnected



、ジョイスティックが参加/切断sf::Event::JoystickDisconnected



トリガーされます。



このイベントに関連付けられたメンバークラスはevent.joystickConnect



と呼ばれ、接続/切断されたジョイスティックの識別子を含みます。



 if (event.type == sf::Event::JoystickConnected) std::cout << "joystick connected: " << event.joystickConnect.joystickId << std::endl; if (event.type == sf::Event::JoystickDisconnected) std::cout << "joystick disconnected: " << event.joystickConnect.joystickId << std::endl;
      
      





次の記事:キーボード、マウス、ジョイスティックの操作。



All Articles