2.3ユーザーデータストリームの操作





翻訳者から:この記事は、SFML公式ライブラリガイドの翻訳サイクルの8番目です。 過去の記事はこちらにあります。 この一連の記事の目的は、元の言語を知らない人にこのライブラリに慣れる機会を提供することです。 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ファイル転送




エントリー



SFMLにはリソースクラス(画像、フォント、サウンドなど)があります。 多くのプログラムでは、これらのリソースはloadFromFile



関数を使用してファイルからロードされます。 状況によっては、リソースは実行可能ファイルまたは大きなデータファイルに直接パックされ、 loadFromMemory



関数を使用してメモリからロードされます。 これらの機能はほとんどすべてのニーズを満たすことができますが、すべてではありません。



圧縮/暗号化されたアーカイブなどの通常とは異なる場所、またはリモートネットワークフォルダーなどからファイルをダウンロードすることもできます。 これらの特別な状況のために、SFMLは3番目の関数loadFromStream



提供します。 この関数は、抽象sf :: InputStreamインターフェースを使用してデータを読み取ります。これにより、SFMLで動作するストリームクラスの独自の実装が可能になります。



この記事では、独自のストリームクラスを記述して使用する方法を示します。



標準C ++ストリーム?



他の多くの言語と同様に、C ++にはすでにデータストリームクラスstd::istream



が含まれています。 実際、このようなクラスが2つありますstd::istream



はフロントエンドソリューションであり、 std::streambuf



から取得したデータへの抽象インターフェイスです。



残念ながら、これらのクラスはユーザーフレンドリーではありません。これらのクラスを使用して重要なタスクを解決することは非常に困難になる可能性があります。 Boost.Iostreamsライブラリ 、標準ストリーム用のシンプルなインターフェイスを提供すること目的としていますが、Boostは大きな依存関係です。



このため、SFMLは独自のストリームクラスを提供します。これは、上記のものよりも簡単で高速であることを願っています。



入力ストリーム



sf :: InputStreamクラスは、4つの仮想関数を宣言します:



 class InputStream { public : virtual ~InputStream() {} virtual Int64 read(void* data, Int64 size) = 0; virtual Int64 seek(Int64 position) = 0; virtual Int64 tell() = 0; virtual Int64 getSize() = 0; };
      
      





readは、ストリームからsizeバイトを抽出し、指定されたアドレスにコピーする必要があります。 読み取られたバイト数を返します。エラーが発生した場合は-1を返します。



シークは、ストリーム内の現在の位置を変更する必要があります。 引数は、移動する絶対バイト数です(カウントは、現在の位置ではなく、データ領域の先頭から取得されます)。 新しい位置を返します。エラーが発生した場合は-1を返します。



tellは、ストリーム内の現在位置(データ領域の先頭からのバイト数)を返すか、エラーの場合は-1を返します。



getSizeは、ストリームに含まれるデータブロックのサイズ(バイト単位)を返すか、エラーの場合は-1を返します。



独自の作業スレッドを作成するには、上記の要件を満たすこれら4つの関数のそれぞれの実装をストリームクラスに含める必要があります。



FileInputStreamおよびMemoryInputStream



SFML 2.3では、新しいオーディオモジュールを管理するためのスレッドを提供する2つの新しいクラスが追加されました。 sf::FileInputStream



はファイルを読み取るためのストリームを提供し、 sf::MemoryInputStream



はメモリからデータストリームを読み取るために機能します。 両方のクラスはsf :: InputStreamに基づいており、多態的に使用できます。



InputStreamを使用する



カスタムストリームクラスの使用は簡単です。インスタンス化して、ストリームで初期化するオブジェクトのloadFromStream



(またはopenFromStream



)関数に引数として渡します。



 sf::FileStream stream; stream.open("image.png"); sf::Texture texture; texture.loadFromStream(stream);
      
      







動作中のコードのデモンストレーションが必要で、実装の詳細に迷子になりたくない場合は、 sf::FileInputStream



およびsf::MemoryInputStream







フォーラムとウィキを必ずチェックしてください。 別のユーザーが、ニーズに合ったクラスをすでに作成している可能性があります。 新しいクラスを作成し、他のユーザーに役立つと思われる場合は、遠慮なく共有してください!



よくある誤解



一部のリソースクラスは、 loadFromStream



を呼び出した後に完全にロードしません。 代わりに、必要な限りデータソースからデータを読み取り続けます。 このため、 sf :: Musicクラスは再生中にストリームを通じてオーディオプリミティブを読み取り、 sf :: Fontクラスは必要に応じてグリフを読み込みます。



その結果、音楽やフォントのダウンロードに使用するストリーム、およびデータソースは、これらのリソースが使用されている限り存在する必要があります。 情報のソースまたはデータストリームのクラスが破壊されると、未定義の動作が発生します(プログラムの実行が完了したり、データが破損したり、何も起こらない場合があります)。



別の一般的な誤解は、関数が誤った値を返すということです。 この状況では、SFMLによって戻りが期待されない値。 たとえば、 sf::FileInputStream



場合、次のように検索関数を作成できます。



 sf::Int64 FileInputStream::seek(sf::Int64 position) { return std::fseek(m_file, position, SEEK_SET); }
      
      





ただし、 std::fseek



は成功すると0を返しますが、SFMLはストリーム内の新しい位置が戻ることを想定しているため、このコードは正しくありません。



次の記事: ウィンドウを開いて管理する



All Articles