c++ 为什么我的sfml渲染应用程序的屏幕空间坐标系是反转的?

pw136qt2  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(172)

我正在学习C++,我想我应该使用SFML图形库为原始的小行星游戏涂上一层新的油漆。然而,对于我的玩家精灵,虽然原点在屏幕的左上角,但它的右边是负x轴,向下是负y轴(与两种情况下的预期相反)。此外,无论是什么对象或旋转,调用setRotation函数总是围绕屏幕左上角旋转任何对象,即使对于该对象,我已将原点设置为对象的中心。

#include<SFML\Graphics.hpp>

using namespace sf;

const int W{ 1200 }, H{ 800 };
const float degToRad = 0.017453f;

int main() {
    float x{ -600 }, y{ -400 };
    float dx{}, dy{}, angle{};
    bool thrust;

    RenderWindow app(VideoMode(W, H), "Asteroids!");
    app.setFramerateLimit(60);

    Texture t1, t2;
    t1.loadFromFile("images/spaceship.png");
    t2.loadFromFile("images/background.jpg");

    Sprite sPlayer(t1), sBackground(t2);
    sPlayer.setTextureRect(IntRect(40, 0, 40, 40));
    sPlayer.setOrigin(-600, -400);

    while (app.isOpen())
    {
        app.clear();
        app.draw(sPlayer);
        app.display();
    }
    return 0;
}

上面的代码绘制玩家(spaceship.png)添加到渲染窗口的中心(app)但是请注意我是如何输入负坐标的。另外,如果我进一步输入接受键盘输入的代码并调用setRotation函数,而不是绕其中心旋转sPlayer sprite(即(-600,-400)),它会使sprite围绕屏幕左上角旋转,即(0,0)。我在SFML在线文档中找不到任何解释。我该怎么办?
正如我提到的,我已经尝试阅读文档。我看了在线教程,但没有用。

0sgqnhkj

0sgqnhkj1#

原点是sprite上你“持有”sprite的点。位置是屏幕上你放置sprite的原点的点。简而言之,你通过原点获得sprite并放置它,这样原点就在位置上。
默认情况下,原点和位置都是(0,0),所以你的sprite的左上角被放在屏幕的左上角。你所做的是说“把这个点放在sprite上,这是sprite的实际可见部分的左上角的方式,并把它放在屏幕的左上角”。这有一个移动你的sprite到右下角的效果。
您可能需要这样的内容:

// This is will make sure that Origin, i.e. point which defines rotation and other transformations center is at center of the ship
sPlayer.setOrigin(sprite_width / 2, sprite_height / 2);

// This will put Origin (center of the ship) at center of the screen
sPlayer.setPosition(screen_width / 2, screen_height / 2);

相关问题