SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Вращение вокруг двух точек одновременно.
В этой теме 1 ответ, 2 участника, последнее обновление LastikPro 7 года/лет, 10 мес. назад.
-
АвторСообщения
-
Доброго времени суток,
Пытаюсь при движении мыши влево-вправо двигать квадрат вокруг центра, а при движении вверх-вниз – вокруг точки 50:100. Соответственно, при движении по диагонали крутиться квадрат должен одновременно вокруг центра и точки 50:100.
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#include <SFML/Graphics.hpp>using namespace sf;Event evt;int main(int argc, char* argv){RenderWindow window(VideoMode(600, 600), "test");RectangleShape test(Vector2<float>(20.0f, 20.0f));test.setFillColor(Color::Red);test.setPosition(300, 300);test.setOrigin(10, 10);Clock deltaTime;Clock timer;timer.restart();int mouseX = 0, mouseY = 0;int curMouseX = 0, curMouseY = 0;float offset = 100;bool moving = false;while (window.isOpen()){while (window.pollEvent(evt)) {switch (evt.type){case Event::MouseMoved:curMouseX = mouseX;curMouseY = mouseY;mouseX = evt.mouseMove.x;mouseY = evt.mouseMove.y;moving = true;break;}}float elaspedTime = deltaTime.restart().asSeconds();if (curMouseX != mouseX && moving) {test.setOrigin(10, 10);test.rotate(360 * elaspedTime);// test.setOrigin(50, 100); Tried this to avoid jumping. When uncommented, doesn't rotate around the center.}if (curMouseY != mouseY && moving) {test.setOrigin(50, 100);test.rotate(60 * elaspedTime);}window.clear();window.draw(test);window.display();moving = false;}return 0;}1) deltaTime.restart().asSeconds() возвращает 0. 2) У квадрата не может быть 2 центра.Для вращения вокруг точки 50 100 надо писать отдельную функцию.3) test.rotate(360 * elaspedTime); вы поворачиваете тело сразу на 360 то есть фактически оно не движется для плавного движения 0.15 хватит вполне.
C++1234float ET =deltaTime.getElapsedTime().asMicroseconds();deltaTime.restaet();test.rotate(0.1*ET);test.setPosition(50+20*cos(0.15*ET),100+20*sin(0.15*ET)); -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.