SFML全屏和居中

问题描述 投票:0回答:1

大家好

    为了扩大我的规模 sfml 友好地应用,我想弄明白,程序最初运行时是以一个 "友好 "的方式进行的。(640, 480) 维度显示出这样的窗口...

Window dimensions example

    我的目标是在全屏模式下执行程序,并将旧的 '窗口' (查看图片),在中心位置,这样就可以保持原来的尺寸和特征。

    好的,我用默认的sfml样式初始化主文件应用程序。'Style::Fullscreen'.

RenderWindow(sf::VideoMode(), "app.exe", sf::Style::Fullscreen);

空白参数 'VideoMode()' 不要把默认的比例从 sfml (不调整大小什么都没有),这样就避免了我的程序变形,但有些功能却不能很好地使用,比如说 查看 被改变了,一些其余的图像在窗口上以旧的尺寸分布,这是合乎逻辑的,因为我的应用程序以这种方式获得视图。

sf::View worldview(RenderWindow.getDefaultView());

    我可以通过设置屏幕大小来解决一些问题。但存在另一种方法来改善这一点,并尝试中心(在全屏)的旧的 '窗口'?

Final fullscreen app

c++ windows scale sfml game-development
1个回答
1
投票

SFML 窗口的默认样式是 sf::Style::Default,而不是 sf::Style::Fullscreen。Default给了你标准的选项,比如Minimize, Full-screen和Exit。要使用它们,你需要设置事件检测(按钮点击),原则上,这就足够了,写在游戏循环里面。while (window.isOpen())

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

1
投票

视图大小应该与全屏分辨率相同,所以,正如你所写的。sf::View worldview(RenderWindow.getDefaultView()); 应该没问题。

但是,你要在该窗口中心的东西就是原来窗口大小中心的东西。因此,你可以将视图的中心设置为之前中心的位置即可。

    const sf::Vector2u originalSize{ 640u, 480u };
    worldview.setCenter(sf::Vector2f(originalSize / 2u));

注意,这意味着视图的范围会有负值。

例如,在1920x1080显示器上。视图的大小当然是:1920x1080。视图的中心是(现在很明显):(320, 240)。(320, 240). (0, 0) - (640, 480) 坐标范围在中心。

该视图的左上角(屏幕的左上角)将是:(-640,-300)。(-640, -300). 该视图屏幕的右下角将是:(1280,780)。(1280, 780).


0
投票

  我决定重新吹奏我的问题,我将认为我的问题已经解决了80%。作为第一件事,渲染窗口的初始化与''。sf::Style::fullscreen'模式,该实例的 VideoMode() 仍旧是空白,而且主 查看 例。

worldView(RenderWindow.getDefaultView()).

  这作为一个略微的解决方案,已经引导我由。背景 图像(我之前在程序中加载的),因为在我的应用程序的核心逻辑中,我可以通过一个上下文实例来获得渲染窗口的实例。更多信息,你可以查看官方的 SFML sf:.的文件。上下文.

// 2d vector to store window dimension as unsigned int's.
sf::Vector2u size = context.RenderWindow->getSize();

  之后,我创建了一个二维坐标的sf:。Vector2u 储存当前全屏 窗口 大小。

  在这一步,我会在背景的中心位置,借助于 功用 函数,通过原点坐标和边界将对象居中。

        mBackgroundSprite.setPosition(size.x / 2u, size.y / 2u);
        centerObject(mBackgroundImg);
        .
        .
        .
        // In this case is a sprite image.
        void centerOrigin(sf::Sprite& sprite)
        {
            sprite.setOrigin(std::floor(sprite.getLocalBounds().left + sprite.getLocalBounds().width / 2.f), 
                             std::floor(sprite.getLocalBounds().top + sprite.getLocalBounds().height / 2.f));
        };

  在这个时刻,以图像为中心,我可以开始把其余元素的相对位置放在这里,就像有一个参考。大多数的对象没有正确的比例,但这对许多计算机来说是舒适的...

© www.soinside.com 2019 - 2024. All rights reserved.