翻訳者から:この記事は、公式のSFMLライブラリガイドの翻訳サイクルの10番目です。 過去の記事はこちらにあります。 この一連の記事の目的は、元の言語を知らない人にこのライブラリに慣れる機会を提供することです。 SFMLは、シンプルでクロスプラットフォームのマルチメディアライブラリです。 SFMLは、ゲームやその他のマルチメディアアプリケーションを開発するためのシンプルなインターフェイスを提供します。 元の記事はこちらにあります 。 始めましょう。
  目次: 
        0.1はじめに 
      
        
        
        
      
    
      
        
        
        
      
1.はじめに
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
2.システムモジュール
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
3.ウィンドウモジュール
        
        
        
      
    
      
        
        
        
      
    
        
        
        
      
4.グラフィックモジュール
        
        
        
      
    
      
        
        
        
      
    
        
        
        
      
5.オーディオモジュール
        
        
        
      
    
      
        
        
        
      
    
        
        
        
      
6.ネットワークモジュール
        
        
        
      
    
      
        
        
        
      
    
        
        
        
      
    
1.はじめに
2.システムモジュール
3.ウィンドウモジュール
- ウィンドウを開いて管理する
 - イベント処理
 - キーボード、マウス、ジョイスティックを使用する
 - OpenGLを使用する
 
4.グラフィックモジュール
- 2D描画オブジェクト
 - スプライトとテクスチャ
 - テキストとフォント
 - フォーム
 - 頂点配列を使用して独自のオブジェクトを設計する
 - 位置、回転、スケール:オブジェクトの変換
 - シェーダーで特殊効果を追加する
 - 2Dカメラとビューコントロール
 
5.オーディオモジュール
- サウンドと音楽を再生する
 - オーディオ録音
 - カスタムオーディオストリーム
 - 空間化:3Dサウンド
 
6.ネットワークモジュール
- ソケット通信
 - パッケージの使用と拡張
 - HTTPを使用したWeb要求
 - 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;
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      次の記事:キーボード、マウス、ジョイスティックの操作。