После изменения контрольной точки в SFML системы координат, координаты рассчитываются неправильно - PullRequest
0 голосов
/ 01 февраля 2019

По умолчанию 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.

Start point Wrong coordinates on the y-axis, expected 200

1 Ответ

0 голосов
/ 04 февраля 2019

Вы возитесь с координатами .Я добавляю это изображение, чтобы проиллюстрировать:

enter image description here

Окно черного фона - это ваше исходное окно.Вы должны представить свое окно как это, окно, которое показывает вид бесконечной плоскости .Он начинает показывать точки от (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).Это на самом деле то, что происходит.

...