(2.3.1)将背景纹理的比例设置为渲染窗口大小

时间:2016-04-06 10:15:57

标签: c++ sfml

刚开始学习SFML(请耐心等待我)。

我制作了一个RenderWindow对象,我想要一个完全适合该窗口的图像。

通过搜索文档,我找到了sf :: Sprite :: SetScale函数。这是正确的功能吗?但是,当RenderWindow对象大小以像素为单位设置时,如何将精灵的比例设置为RenderWindow的比例?我是否必须获得RenderWindow的比例,然后将背景精灵分配给该比例或?

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>

int main()
{
  sf::RenderWindow window(sf::VideoMode(600, 300), "Simple Game");

  sf::Texture BackgroundTexture;
  sf::Sprite background;

  //background.setScale(0.2, 0.2); <--- how?

  if(!BackgroundTexture.loadFromFile("media/background.png"))
  {
    return -1;
  }
  else
  {
    background.setTexture(BackgroundTexture);
  }

  while(window.isOpen())
  {
    sf::Event event;

    while(window.pollEvent(event))
    {
        switch(event.type)
        {
        case sf::Event::Closed:
            window.close();
        }
    }
    window.clear();
    window.draw(background);
    window.display();
 }
}

1 个答案:

答案 0 :(得分:1)

您需要的比例因子只是窗口大小和纹理大小之间的比率。 sf :: Texture有一个getSize函数,和sf :: RenderWindow一样。只需获取两者的大小,计算比率并使用它来设置精灵的比例,如下所示:

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>

int main()
{
  sf::RenderWindow window(sf::VideoMode(600, 300), "Simple Game");

  sf::Texture BackgroundTexture;
  sf::Sprite background;
  sf::Vector2u TextureSize;  //Added to store texture size.
  sf::Vector2u WindowSize;   //Added to store window size.

  if(!BackgroundTexture.loadFromFile("background.png"))
  {
    return -1;
  }
  else
  {
    TextureSize = BackgroundTexture.getSize(); //Get size of texture.
    WindowSize = window.getSize();             //Get size of window.

    float ScaleX = (float) WindowSize.x / TextureSize.x;
    float ScaleY = (float) WindowSize.y / TextureSize.y;     //Calculate scale.

    background.setTexture(BackgroundTexture);
    background.setScale(ScaleX, ScaleY);      //Set scale.  
  }

  while(window.isOpen())
  {
    sf::Event event;

    while(window.pollEvent(event))
    {
        switch(event.type)
        {
            case sf::Event::Closed:
                window.close();
        }
    }
    window.clear();
    window.draw(background);
    window.display();
 }
}