You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
2.3 KiB
C++

#include "MovingSectors.h"
namespace CClock {
MovingSectors::MovingSectors() {}
MovingSectors::MovingSectors(unsigned int size, double radii[], double rotSpeeds[], sf::Color color, double maxSpeed) {
sectors_.resize(size);
radii_.resize(size);
rotSpeeds_.resize(size);
for (unsigned int i = 0; i < radii_.size(); ++i) {
radii_[i] = radii[i];
rotSpeeds_[i] = rotSpeeds[i];
}
maxSpeed_ = maxSpeed;
for (unsigned int i = 0; i < radii_.size(); ++i) {
sectors_[i] = CircularSector(radii_[i], 6, angle_, color);
}
}
void MovingSectors::draw(sf::RenderTarget& target, sf::RenderStates states) const {
states.transform *= getTransform();
for (auto& i : sectors_) {
target.draw(i, states);
}
}
void MovingSectors::update(double timeStep, sf::RenderWindow& window) {
//rotate all sectors with predefined speeds
sf::Vector2i mousePos = sf::Mouse::getPosition(window);
sf::Vector2u windowSize = window.getSize();
sf::Vector2f mouseToCenter = sf::Vector2f((float)mousePos.x - ((float)windowSize.x / 2), (float)mousePos.y - ((float)windowSize.y / 2));
double mouseToCenterLength = std::sqrt((mouseToCenter.x * mouseToCenter.x) + (mouseToCenter.y * mouseToCenter.y));
for (unsigned int i = 0; i < sectors_.size(); ++i) {
if (mouseToCenterLength > radii_[i]) {
sectors_[i].rotate(rotSpeeds_[i] * timeStep);
}
//if mouse is within radius, rotate sector with maxspeed to mousepos
else {
float rotation = sectors_[i].getRotation();
float targetRotation = -180 - (atan2(mouseToCenter.x , mouseToCenter.y) + angle_ / 2) * 180 / pi;
float rotationDiff = std::remainder(targetRotation - rotation + 180, 360);
//limit rotationspeed
if (rotationDiff > maxSpeed_ * timeStep) {
rotation -= maxSpeed_ * timeStep;
}
else if (rotationDiff < -maxSpeed_ * timeStep) {
rotation += maxSpeed_ * timeStep;
}
sectors_[i].setRotation(rotation);
}
}
}
}