C++ SFML анимация

371
30 ноября 2017, 02:40

Всем привет. У меня задание разработать движение электрона во круг атома, это должно быть как анимация. Использовал я для этого библиотеку SFML. Я вроде как реализовал, но в какой-то момент электрон уходит за экран. Потом еще я не знаю как реализовать так что бы объекта(электрон) не было видно когда он за атомом. Заранее спасибо.

Я использовал такую формулу для движения по окружности

x = x0 + radius*sin(angle);
y = y0 + radius*cos(angle);
alpha += deltaTime * k;

где x0 и у0 - это координаты центра; х, у - координаты объекта, а alpha - угол.

alpha += deltaTime * k

это изменение угла со временем.

Вот мой код:

#include "stdafx.h"
#include <iostream>
#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;
int main()
{
   float xo = 250;//координаты центра(coordinates of the center)
   float yo = 250;//координаты центра(coordinates of the center)
   float radius = 10;//радиус
   float k = 0.0f;//время(time)
   float x = 130;//координаты объекта(object coordinates)
   float y = 330;//координаты объекта(object coordinates)
   float rotation = 5.0;
   //float x = 1000 / 2;
   //float y = 1000 / 2;
   float alpha = 0;//угол(angle)
   float speed = 2000.0f;
   RenderWindow window(sf::VideoMode(1000, 1000), "Atom");
   window.setFramerateLimit(60);
   Clock clock;
   sf::Event windowEvent;
   Texture herotexture;
   herotexture.loadFromFile("atom_image.png");
   Sprite herosprite;
   herosprite.setTexture(herotexture);
//herosprite.setTextureRect(IntRect(0, 99, 48, 51));//получили нужный нам прямоугольник с котом
   herosprite.setPosition(250, 250); //выводим спрайт в позицию x y (output the sprite to the position x y)
   CircleShape circle;
   circle.setRadius(radius);
   circle.setOutlineColor(Color::Red);
   circle.setOutlineThickness(5);
   circle.setPosition(x, y);
   circle.setRotation(0);
   while (window.isOpen())
   {
       Event event;
       while (window.pollEvent(event))
       {
           if (event.type == sf::Event::Closed)
               window.close();
       }
      //circle.rotate(rotation);
      //alpha = (float)clock.getElapsedTime().asMicroseconds() * k;
      clock.restart();
      k = k / 800;
      float deltaTime = clock.restart().asSeconds();
      alpha += deltaTime*(float)clock.getElapsedTime().asSeconds();
      float Radius = (float)herosprite.getPosition().x - (float)circle.getPosition().x;
      cout << "\nGet Position Atom is -> " << (float)herosprite.getPosition().x << endl;
      cout << "\nGet Position Circle is -> " << (float)circle.getPosition().x << endl;
      cout << "\nRadius is -> " << Radius << endl;
      x = xo + Radius*sin(alpha);//формула для движения по окружности(formula for motion along a circle)
      y = yo + Radius*cos(alpha);//формула для движения по окружности(formula for motion along a circle)
      Vector2f direction(x, y);
      circle.move(direction * deltaTime * speed);
      //circle.move(direction);
      //circle.move(x, y);
      window.clear();
      window.draw(herosprite);
      window.draw(circle);
      window.display();
  }
  return 0;
}
READ ALSO
Нарисовать полукруг (pie) в QML и наложить OpocityMask

Нарисовать полукруг (pie) в QML и наложить OpocityMask

Как в QML нарисовать полукруг и применить по нему маску прозрачности? имеется изображение, от которого нужно рисовать только его часть - (полукруг...

314
Ошибка кодировки в выходном файле

Ошибка кодировки в выходном файле

Есть код алгоритма сжатия lz77:

361
Работа с архивом 7z в c++ builder

Работа с архивом 7z в c++ builder

В c++ builder есть простая форма, где пользователь может выбрать 7z архивНеобходимо по нажатию кнопки изменить определённый файле в выбранном...

239
Кто вызвал abort()?

Кто вызвал abort()?

На целевой системе программа вылетает при некоторых входных данных с exit кодом 134 (SIGABORT)Возможности запустить под отладчиком нет

258