Welcome, Guest. Please login or register. Did you miss your activation email?

Author Topic: Rotating and moving a simple `CircleShape` object  (Read 637 times)

0 Members and 1 Guest are viewing this topic.

Han

  • Newbie
  • *
  • Posts: 1
    • View Profile
Rotating and moving a simple `CircleShape` object
« on: May 30, 2022, 04:25:07 pm »
Hello, I am writing my first SFML project today.

I write a simple class which encapsulates a CircleShape class.

Ball.h
class Ball
{
        public:
                Ball() = delete;
                Ball(Ball &) = delete;
                Ball(   const std::string & texturePath,
                        const float radius,
                        const float initialX,
                        const float initialY,
                        const float initialVX,
                        const float initialVY,
                        const float initialR,
                        const float initialWR);

                sf::CircleShape shape;

                void Update();


        private:
                float radius;
                float x, y;
                float vx, vy;
                float theta, w;
                sf::Texture texture;
                std::chrono::time_point<std::chrono::steady_clock> lastUpdate;

};

Ball.cpp
#include "Ball.h"

Ball::Ball(     const std::string & texturePath,
                const float radius,
                const float initialX,
                const float initialY,
                const float initialVX,
                const float initialVY,
                const float initialR,
                const float initialWR)
        :       texture         ()
        ,       radius          (radius)
        ,       x               (initialX)
        ,       y               (initialY)
        ,       vx              (initialVX)
        ,       vy              (initialVY)
        ,       theta           (initialR)
        ,       w               (initialWR)
        ,       shape           (radius)
        ,       lastUpdate      (std::chrono::steady_clock::now())
{
        texture.loadFromFile(texturePath);
        shape.setTexture(&texture, false);
        //shape.setOrigin(x - radius / 2.0f, y - radius / 2.0f);
        shape.setFillColor(sf::Color::Green);
        Update();
}

void Ball::Update()
{
        std::chrono::time_point<std::chrono::steady_clock> now = std::chrono::steady_clock::now();
        const float dt = std::chrono::duration_cast<std::chrono::duration<float>>(lastUpdate - now).count();
        lastUpdate = now;
       
        theta += w * dt;
        x += vx * dt;
        y += vy * dt;

        shape.setRotation(theta);
        shape.setPosition(x, y);
}

main.cpp
#include "Ball.h"
#include <SFML/Graphics.hpp>

int main()
{
        Ball mehmet("resources/Cavus.png",
                        50.0f,
                        400, 400,
                        0, 0,
                        0, 10.0);
       
        sf::RenderWindow window(sf::VideoMode(800, 800), "SFML works!");
       
        while (window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window.close();
                }
               
                mehmet.Update();

                window.clear();
                window.draw(mehmet.shape);
                window.display();
        }

        return EXIT_SUCCESS;
}

I want to create a Ball object. I give it an initial position, velocity, rotation and angular velocity. I update the dynamics of the object by using the Update() method.

When I call the setRotation() method, it indeed rotates the Ball, but the pivot point is the upper left corner of the initial rectangular bounding box of the Ball. I found the setOrigin() method in the documentation. setOrigin() is said to change the origin of the object. I set it to the center of the ball in the constructor as seen in my code. But when I use it like that, I cannot change the position of my ball anymore.

What am I missing here? I simply want to rotate and move round object. Can you please guide me?
Thanks in advance.
« Last Edit: May 30, 2022, 04:27:24 pm by Han »

kojack

  • Sr. Member
  • ****
  • Posts: 315
  • C++/C# game dev teacher.
    • View Profile
Re: Rotating and moving a simple `CircleShape` object
« Reply #1 on: May 30, 2022, 06:37:19 pm »
//shape.setOrigin(x - radius / 2.0f, y - radius / 2.0f);

The origin is local to the shape, a value of 0,0 places the pivot/origin at the top left corner. So you don't want the circle's position in there.
Try this:
shape.setOrigin(radius,radius);