ウィンドウモジュールのチュートリアルは読んだかな?
SFMLを使うと、とっても簡単に OpenGL のウィンドウを開いてイベントをハンドリングできるんだったよね。
でもでも、何にも描画できないよ? うえーん。
OpenGL の描画 API を使えって? あんなのややこしくってイヤだよ。うえーん。
泣かないで! SFML には OpenGL よりもカンタンに2Dのモノを描画する機能があるんだよー。
#include <SFML/Graphics.hpp>
int main()
{
// ウィンドウ生成
sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
// ウィンドウが開いている間、プログラムを続ける
while (window.isOpen())
{
// タマってるイベントを全部お世話する。
sf::Event event;
while (window.pollEvent(event))
{
// 閉じる要求検知。ウィンドウを閉じる。
if (event.type == sf::Event::Closed) {
window.close();
}
}
// ウィンドウを黒でクリア
window.clear(sf::Color::Black);
// なんでも描画
// window.draw(...);
// 1フレーム終了
window.display();
}
return 0;
}
描画の前に clear関数を呼ぶのは、お約束です。
// 500x500 の レンダリング用テクスチャを生成
sf::RenderTexture renderTexture;
if (!renderTexture.create(500, 500))
{
// error...
}
// 同じ関数を使って描画
renderTexture.clear();
renderTexture.draw(sprite); // spriteに限らず何でも描画
renderTexture.display();
// ターゲットテクスチャを取得(ここに何かが描画されている)
const sf::Texture& texture = renderTexture.getTexture();
// ウィンドウに描画
sf::Sprite sprite(texture);
window.draw(sprite);
getTexture関数で得られるのは、読み込み専用のテクスチャです。使うだけ。変更不可。
使う前に変更したいときは、別の sf::Texture のインスタンスにコピーしてください。// 深度バッファを有効にする renderTexture.create(500, 500, true);
void renderingThread(sf::RenderWindow* window)
{
// 描画ループ
while (window->isOpen())
{
// …… 描画 ……
// 1フレーム終了
window->display();
}
}
int main()
{
// ウィンドウ生成(OSの仕様上、ウィンドウはメインスレッドで生成しておくのが無難)
sf::RenderWindow window(sf::VideoMode(800, 600), "OpenGL");
// OpenGLコンテキストを非活性にする
window.setActive(false);
// 描画スレッドを起動
sf::Thread thread(&renderingThread, &window);
thread.launch();
// メインループ
while (window.isOpen())
{
...
}
return 0;
}
上のサンプルによると、描画スレッドの中では、ウィンドウがアクティブかどうかを気にしなくてもいいみたいですね。
SFMLさんはいい子なので、必要とあらば自動的にいい感じにしてくれるのです。