じゃあどんな意味なのか、わかるかな?
「テクスチャ」って なぁに?
画像です。でも、どうして「テクスチャ」って呼ぶのかな?それはですね、「2Dの物体に貼り付ける」っていう特別な役割があるからだよ。
「スプライト」って、なぁに?
テクスチャが貼り付けられた四角形、のことだよ。
わかったかな?
まだよくわかんないっていうお友達は、wikipedia先生にきいてみてね。
sf::Texture texture;
if (!texture.loadFromFile("image.png"))
{
// error...
}
// 座標(10, 10) から サイズ32x32 の矩形を読み込む
if (!texture.loadFromFile("image.png", sf::IntRect(10, 10, 32, 32)))
{
// error...
}
おや、また新しいお友達ですね。sf::IntRectちゃん。
// サイズ 200x200 の 空のテクスチャを生成
if (!texture.create(200, 200))
{
// error...
}
この時点では、まだテクスチャの中身は作成されてません。// テクスチャを更新:ピクセルのリストを使って // 「* 4」してるのは、色の要素が4つ(RGBA)だから sf::Uint8* pixels = new sf::Uint8[width * height * 4]; ... texture.update(pixels); // テクスチャを更新:画像を使って sf::Image image; ... texture.update(image); // テクスチャを更新:ウィンドウに表示されてる内容を使って。 sf::RenderWindow window; ... texture.update(window);上のサンプルでは、テクスチャを更新する材料は「そのテクスチャと同じサイズなのだ!」と勝手に仮定されてます。 もし同じサイズじゃない場合、たとえばテクスチャの一部分だけ更新したいとか、 そういうときは、更新したい部分の矩形の座標を指定することができるよ。詳しくは、APIドキュメントを見てね。
texture.setSmooth(true);
texture.setRepeated(true);
この設定は、スプライトの方がテクスチャより大きい場合だけ効果があるよ。sf::Sprite sprite; sprite.setTexture(texture);そんでもって、描画だ!
// メインループの中、window.clear() と window.display()の間に書く window.draw(sprite);矩形を指定して、スプライトの中に、テクスチャを一部分だけ表示することもできます。
sprite.setTextureRect(sf::IntRect(10, 10, 32, 32));スプライトの色も指定できます。
sprite.setColor(sf::Color(0, 255, 0)); // 緑 sprite.setColor(sf::Color(255, 255, 255, 128)); // 半透明このスプライトは、みんな同じテクスチャで、色の設定だけ変えてます。
// 位置 sprite.setPosition(sf::Vector2f(10, 50)); // 絶対位置 sprite.move(sf::Vector2f(5, 10)); // 相対位置(移動) // rotation sprite.setRotation(90); // 絶対角度 sprite.rotate(15); // 相対角度(回転) // scale sprite.setScale(sf::Vector2f(0.5f, 2.f)); // 絶対倍率 sprite.scale(sf::Vector2f(1.5f, 3.f)); // 相対倍率(拡大)デフォルトでは、スプライトの左上の点が、位置や回転や拡大の基準点になってます。
sprite.setOrigin(sf::Vector2f(25, 25));こういう、移動や回転などの操作は SFMLの他の物体でも同じやり方です。 なので、別のチュートリアルにまとめてあるよ。
sf::Sprite loadSprite(std::string filename)
{
sf::Texture texture;
texture.loadFromFile(filename);
return sf::Sprite(texture);
} // 関数が終了する時点で、テクスチャが破棄されてしまう
スプライトに使われる間、テクスチャが有効なままでいてくれるように、
テクスチャがいつ生成されていつ破棄されるのか、しっかり管理するようにしようね。sf::Texture texture; ... // バインド sf::Texture::bind(&texture); // ……テクスチャを貼った OpenGLの物体を描画…… // バインドを解除 sf::Texture::bind(NULL);