iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
自我挑戰組

寫遊戲初體驗系列 第 4

Sprite and Texture

Sprite and Texture

在這裡簡單介紹一下兩者,兩者都是 Image,但是還是有一點點區別的

  • Texture

    • 是一張圖片,但主要是用來改變物件的外觀。有點像包裝紙的概念,將物品用不同款式的包裝紙(Texture)包裝,讓他看起來不一樣。因為Texture本身不是物件,因此不能移動它。
  • Sprite

    • 是一張圖片,同時也是一個物件,意思是他擁有座標(x, y),你能移動/創建/刪除他。
    • 基本上將Texture + Rect Entity就是Sprite了。

匯入圖片

剛剛說過,Sprite就是Texture經過裁減所獲得的物件,所以在建立Sprite之前,首先我們要匯入Texture:

sf::Texture texture;
if (!texture.loadFromFile("pic.png")) {

    // Error handle
}

這樣就能匯入Texture了。

當然我們也可以不用匯入整張圖片:

// load a 32x32 rectangle that starts at (10, 10)
if (!texture.loadFromFile("image.png", sf::IntRect(10, 10, 32, 32)))
{
    // Error handle
}

sf::IntRect 代表著矩形,前兩個參數代表座標,後兩個參數代表長寬。(10, 10, 32, 32)代表圖片座標(10, 10),長寬(32, 32)所包含的部分。

Texture好了那Sprite呢

有了Texture之後我們就能很快的建立Sprite了。

sf::Sprite sprite;
sprite.setSprite(texture);

// or

sf::Sprite sprite2(texture);

至於畫在螢幕上的方法

window.draw(sprite);

你可以隨意調整Sprite的顏色

sprite.setColor(sf::Color(0, 255, 0));
sprite.setColor(sf::Color(255, 255, 255, 128));

前面說過,Sprite不只是單單一張圖片,它是個物件,所以能夠操縱它。

// position
sprite.setPosition(sf::Vector2f(10.f, 50.f)); // absolute position
sprite.move(sf::Vector2f(5.f, 10.f)); // offset relative to the current position

// rotation
sprite.setRotation(90.f); // absolute angle
sprite.rotate(15.f); // offset relative to the current angle

// scale
sprite.setScale(sf::Vector2f(0.5f, 2.f)); // absolute scale factor
sprite.scale(sf::Vector2f(1.5f, 3.f)); // factor relative to the current scale

簡單小例子

第一天舉過的小例子加上一些Sprite的操作

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(1280, 720), "SFML window");

    sf::Texture texture;
    if (!texture.loadFromFile("1.png"))
        return EXIT_FAILURE;
    sf::Sprite sprite(texture);

    sprite.setPosition(sf::Vector2f(400.f, 260.f));
    sprite.setScale(sf::Vector2f(0.5f, 0.5f));
    sprite.rotate(15.f);
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();

        window.draw(sprite);

        window.display();
    }
    return EXIT_SUCCESS;
}


上一篇
SFML Event
下一篇
Day5 SFML input
系列文
寫遊戲初體驗30

尚未有邦友留言

立即登入留言