01/10/2018, 00:40

Cách load hình ảnh trong SFML

Đang tìm hiểu về SFML mọi người ơi, e muốn load một cái background lên mà không biết cách nào để nó hiện lên toàn màn hình cả. Ai có kinh nghiệm làm về SFML giúp em với
đây là code của e:

#include "stdafx.h"
#include <SFML/Graphics.hpp>

using namespace sf;

int main()
{
	// Create a video mode object
	VideoMode vm(1920, 1080);

	// Create and open a window for the game
	RenderWindow window(vm, "Timber!!!");

	// Create a Texture tp hold a graphic on the GPU
	Texture textureBackground;

	// Load a graphic into the texture 
	textureBackground.loadFromFile("Graphics/graphics/background.png");

	// Create a sprite
	Sprite spriteBackground;

	// Attach the texture to the sprite
	spriteBackground.setTexture(textureBackground);

	// Set the spriteBackground to cover the screen
	spriteBackground.setPosition(0, 0);

	while (window.isOpen())
	{

		if (Keyboard::isKeyPressed(Keyboard::Escape)) 
		{
			window.close();
		}

		// Clear everything from the last run frame  
		window.clear();

		// Draw our game scence here
		window.draw(spriteBackground);

		// Show everything we just drew
		window.display();
	}

	return 0;
}

khi chạy nó chỉ lên nht thôi ạ:

trong khi cái background của e là vầy:

viết 02:41 ngày 01/10/2018

ảnh của em có kích cỡ bao nhiêu? Cái window em tạo có kích cỡ 1920x1080 cái ảnh có đúng kích cỡ vậy ko?

cái sprite của em có lẽ tâm của nó là ở trung tâm của texture? Cái này hơi lạ vì đáng lẽ tâm nó phải là góc trên bên trái…

em thử code này coi có đúng ko

#include <SFML/Graphics.hpp>

int main()
{
    sf::Texture bgTex;
    bgTex.loadFromFile("Graphics/graphics/background.png");

    //tạo window có kích cỡ bằng đúng với kích cỡ của background image
    sf::RenderWindow window(sf::VideoMode(bgTex.getSize().x, bgTex.getSize().y),
                            "SFML Playground");
    window.setFramerateLimit(60); //60 FPS

    sf::Sprite bgSprite;
    bgSprite.setTexture(bgTex);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(bgSprite);
        window.display();
    }
}
Tuấn Kiệt Nguyễn Hoàng viết 02:53 ngày 01/10/2018

Được rồi anh ơi, cảm ơn a nhiều lắm, tại e mới mò nên còn gà mờ quá

Tuấn Kiệt Nguyễn Hoàng viết 02:51 ngày 01/10/2018

mà mình có cách nào để kéo hình ra như đúng kích cỡ của window tạo ra ko a. Thường mình tạo window trước rồi mới tới tạo texture với Sprite chứ a

viết 02:46 ngày 01/10/2018

em xài phương thức setScale của sf::Sprite để thay đổi kích cỡ cho cái sprite cho đúng với kích cỡ màn hình.

nhưng nếu ko đúng tỉ lệ thì nó xấu lắm. Vd ảnh nền có tỉ lệ 4:3 mà em bung ra toàn màn hình tỉ lệ 16:9 thì nó scale mất cân đối.

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(960, 600), "SFML Playground");
    window.setFramerateLimit(60);

    sf::Texture bgTex;
    bgTex.loadFromFile("Graphics/graphics/background.png");

    sf::Sprite bgSprite;
    bgSprite.setTexture(bgTex);
    bgSprite.setScale(static_cast<float>(window.getSize().x) / bgTex.getSize().x,
                      static_cast<float>(window.getSize().y) / bgTex.getSize().y);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(bgSprite);
        window.display();
    }
}
Bài liên quan
0