翻訳者から:この記事は、公式の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;
次の記事:キーボード、マウス、ジョイスティックの操作。