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

(2.3.1) Set scale of background texture to renderwindow size

刚开始学习SFML(还请多多包涵)

我制作了一个 RenderWindow 对象,并且我有一张图像我想完美地适合它 window。

通过搜索文档,我找到了 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();
 }
}

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

#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();
 }
}