默认情况下,从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进行了展望。
你跟坐标搞乱。我添加此图片说明:
黑色背景窗口是原来的窗口。你必须想象你的窗口为,这表明一个无限平面的视图窗口。它开始显示点(0,0)(左上角)到(800,600)(右下角)。
当你创建一个窗口,它必须有一个观点。默认情况下,窗口的观点是(400300)为中心的视图,整个窗口(蓝色矩形)的大小。
你首先要做的是:
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);
这是一个正方形,其中心点将是(0600)(原来的窗口的左下角)。
当你正在浏览的线x=0
上述飞机的部分,则需要以查看它,即达(0,0),(几乎)600个单位拉升的平方。这实际上发生了什么。