【问题标题】:After changing the reference point in SFML the coordinate system, the coordinates are calculated incorrectly在SFML中更改坐标系中的参考点后,坐标计算不正确
【发布时间】:2019-02-01 14:30:12
【问题描述】:

默认情况下SFML起源于左上角窗口,我把坐标轴的原点放在窗口底部的中心。 x 轴有一个范围(-400;400),这是正常的。但是我的 y 轴有问题,当抬起物体时,位置值下降,顶点是 -600,而不是 600。我希望在上升到顶点时,值增加,而不是像现在这样减少。

窗口的顶部坐标为-600,预期为600

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

using namespace sf;
using namespace std;

int speed = 1000;

int main()
{
RenderWindow window(VideoMode(800, 600), L"Test");
RectangleShape rect;
View view;
view.setCenter(0, -300); //!!!
view.setSize(800, 600);
window.setView(view);
rect.setFillColor(Color::Green);
rect.setSize(Vector2f(50, 50));
rect.setPosition(Vector2f(0, 600));
rect.setOrigin(25, 25);
Clock clock;
while (window.isOpen())
{
    float time = clock.getElapsedTime().asMicroseconds();
    clock.restart();
    time /= speed; //1000
    Event event;
    while (window.pollEvent(event))
    {
        if (event.type == Event::Closed)
            window.close();
    }

    if (Keyboard::isKeyPressed(Keyboard::Up))
        rect.move(0, -0.1*time);
    if (Keyboard::isKeyPressed(Keyboard::Down))
        rect.move(0, 0.1*time);
    if (Keyboard::isKeyPressed(Keyboard::Left))
        rect.move(-0.1*time, 0);
    if (Keyboard::isKeyPressed(Keyboard::Right))
        rect.move(0.1*time, 0);
    cout << rect.getPosition().x << " " << rect.getPosition().y << "\n";
    window.clear(Color::White);
    window.draw(rect);
    window.display();
}
return 0;
}

窗口的顶部坐标为-600,预期为600。

【问题讨论】:

  • 你误解了你的代码
  • 这很糟糕。非常糟糕。

标签: c++ sfml game-development


【解决方案1】:

你在搞乱坐标。我将此图像添加到 ilustrate:

黑色背景窗口是您的原始窗口。你需要把你的窗口想象成那样,一个显示无限平面视图的窗口。它开始显示从 (0,0)(左上角)到 (800,600)(右下角)的点。

当你创建一个窗口时,它必须有一个视图。默认情况下,您的窗口视图是居中在 (400,300) 处的视图,具有整个窗口的大小(蓝色矩形)。

你要做的第一件事是:

view.setCenter(0, -300); //!!!
view.setSize(800, 600);
window.setView(view);

所以你现在移动你的窗口的视图(绿色矩形)。该视图的中心现在位于 (0,-300) 上,具有原始窗口的大小。

然后你画你的正方形:

rect.setSize(Vector2f(50, 50));
rect.setPosition(Vector2f(0, 600));
rect.setOrigin(25, 25);

这是一个正方形,中心点为 (0,600)(原始窗口的左下角)。

当您在x=0 线上方查看平面的一部分时,您需要将正方形(几乎)向上移动 600 个单位才能查看它,即最多 (0,0)。事实上就是这样。

【讨论】:

  • 事实上,您并没有改变坐标系的参考。您只是在移动视图,因此点 (0,600) 仍位于 (0,600),但您无法看到它,因为您向上看。
  • 我可以解决我的问题吗?
  • 也许我应该开始谈论 SFML 坐标。默认情况下,左上角为 (0,0),请注意,在您的情况下,右下角位于 (800,600) 处。以y坐标为正。 向下意味着增加 y值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2022-01-08
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
相关资源
最近更新 更多