Мой класс body в SFML: как он правильно вращает формы элементов? - PullRequest
1 голос
/ 11 июля 2011

Эй, я создал класс body, который наследуется от sf :: drawable в SFML, который объединяет фигуры, чтобы я мог формировать более сложные фигуры и фигуры.Я обнаружил, что мне нужно было сделать несколько обновлений для каждой отдельной формы элемента во время рендеринга, основываясь на том, что произошло со всем телом с момента последнего рендеринга.

Это включает:

  • Вращение
  • Переводы
  • Масштабирование

Я думал, что мне придется написать вручнуюкод, чтобы учесть эти изменения, которые могли произойти со всем телом, поэтому положение фигуры оказалось правильным.Однако при кодировании части Rotation я обнаружил после написания ручного кода, что, хотя я сделал функцию Bodies Render () только для итераций и рендеринга каждой фигуры, не меняя их, они так или иначе получили правильную ориентацию. КАК ЭТО МОЖЕТ БЫТЬ?

Я закомментировал код, который я написал и который мне явно не нужен, и использую функцию Draw () для рендеринга.Пожалуйста, объясните мне мой собственный код! (Боже, я чувствую себя отсталым).

вот класс:

class Body : public sf::Drawable{ 

    public:
        Body(const sf::Vector2f& Position = sf::Vector2f(0, 0), const sf::Vector2f& Scale = sf::Vector2f(1, 1), float Rotation = 0.f, const sf::Color& Col = sf::Color(255, 255, 255, 255)){
            SetPosition(Position);
            SetScale(Scale);
            SetRotation(Rotation);
            SetColor(Col);
            RotVal=0;};

////////////////// Drawable Functions   ////////////////////
        void SetX(float X){
            MoveVal.x += X - GetPosition().x;
            Drawable::SetX(X);};

        void SetY(float Y){
            MoveVal.y += Y - GetPosition().y;
            Drawable::SetY(Y);};

        void SetRotation(float Rotation){
            RotVal+= Rotation-GetRotation();
            Drawable::SetRotation(Rotation);};
////////////////////////////////////////////////////////////

        bool AddShape(sf::Shape& S){
            Shapes.push_back(S); return true;};
        bool AddSprite(sf::Sprite& S){
            Sprites.push_back(S); return true;};

        void Draw(sf::RenderTarget& target){
            for(unsigned short I=0; I<Shapes.size(); I++){
                //Body offset
                Shapes[I].SetPosition( 
                    Shapes[I].GetPosition().x + MoveVal.x,
                    Shapes[I].GetPosition().y + MoveVal.y);

                // Aparrently Body shapes rotate on their own...
                //WWTFFFF>>>>??????????

                //Body Rotation
                //float px= GetPosition().x,
                //    py= GetPosition().y,
                //    x=  Shapes[I].GetPosition().x,
                //    y=  Shapes[I].GetPosition().y,
                //   rot= ConvToRad(RotVal);

                /*Shapes[I].SetPosition( 
                    px + ((x-px)*cos(rot)) - ((y-py)*sin(rot)),
                    py - ((x-px)*sin(rot)) + ((y-py)*cos(rot)));*/ //TODO: put this in a math header
                //Shapes[I].Rotate(RotVal);
            }

            target.Draw(*this); // draws each individual shape

            //Reset all the Change Values
            RotVal=0;
            MoveVal.x=0;
            MoveVal.y=0;
        };

    private:
        sf::Vector2f MoveVal;
        float         RotVal;
        std::vector<sf::Shape> Shapes;
        std::vector<sf::Sprite> Sprites;

        virtual void Render(sf::RenderTarget& target) const{                
            for(unsigned short I=0; I<Shapes.size(); I++){
                target.Draw(Shapes[I]);}
            for(unsigned short I=0; I<Sprites.size(); I++){
                target.Draw(Sprites[I]);}
        };
};

1 Ответ

3 голосов
/ 11 июля 2011

Мое предположение было подтверждено исходным кодом SFML.

Когда вы вызываете target.Draw(*this), в конечном итоге он вызывает Drawable::Draw(RenderTarget& Target) const, который устанавливает матрицу рендеринга, которая имеет поворот, который вы дали ей с Drawable::SetRotation вызов.Затем вызывается ваша функция virtual Render с установленной средой вращения.Это означает, что ваши части тела вращаются.

Посмотрите на источник, чтобы лучше понять.(;

...