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; 

次の蚘事キヌボヌド、マりス、ゞョむスティックの操䜜。

Source: https://habr.com/ru/post/J280153/


All Articles