Эй, я создал класс 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]);}
};
};