drawObject, она должна вернуть один из пяти типов - пример такого типа: sf::RectangleShape, или например sf::CircleShape, у всех этих типов есть общий наследуемый класс: sf::Drawable, я пытался сделать возвращаемый тип функции sf::Drawable, но тогда возникала ошибка что невозможно вернуть абстрактный класс из функции. Пытался написать свой общий класс, но ошибка та же, нельзя вернуть абстрактный класс. Также пытался использовать std::variant e.g:std::variant<sf::RectangleShape, sf::CircleShape, other classes...> Но такой код крашил программу, других вариантов как сделать я не знаю. Примерная работа функции:// какой тип?
??? function(int x) {
if(x == 1) {
return 1.0f; // float
} else if(x == 2) {
return 1; // int
} else if(x == 3) {
return 'a'; // char
}
}
sf::Drawable drawObject(...); вместо sf::Drawable* drawObject(...);. А это уже другое дело.
sf::Drawable а не sf::Drawable* (sf::Drawable* drawObject(), но ошибки все еще есть:sf::RectangleShape rectangleShape(sf::Vector2f(object.objectWidth, object.objectHeight));
rectangleShape.setPosition(sf::Vector2f(object.objectX, object.objectY));
if(object.objectRotation.has_value()) {
rectangleShape.setOrigin(object.objectWidth / 2.f, object.objectHeight / 2.f);
rectangleShape.setRotation(object.objectRotation.value());
}
rectangleShape.setFillColor(object.objectColor);
window.draw(rectangleShape);
return rectangleShape;sfml.ld2d\objdrawer.h: In static member function 'static sf::Drawable* ObjectDrawer::drawObject(LevelObject&, sf::RenderWindow&)':
sfml.ld2d\objdrawer.h:36:24: error: cannot convert 'sf::RectangleShape' to 'sf::Drawable*' in return
36 | return rectangleShape;
static sf::Drawable* drawObject(LevelObject& object, sf::RenderWindow &window) {
if(!object.hidden) {
if(object.lobjecttype == LevelObjectType::RECTANGLE) {
sf::RectangleShape rectangleShape(sf::Vector2f(object.objectWidth, object.objectHeight));
rectangleShape.setPosition(sf::Vector2f(object.objectX, object.objectY));
if(object.objectRotation.has_value()) {
rectangleShape.setOrigin(object.objectWidth / 2.f, object.objectHeight / 2.f);
rectangleShape.setRotation(object.objectRotation.value());
}
rectangleShape.setFillColor(object.objectColor);
window.draw(rectangleShape);
return rectangleShape;
} // другие if else
}
for(int bufferPosition=0; bufferPosition < objectsBuffer.getBufferSize(); ++bufferPosition) {
sf::Drawable* object = ObjectDrawer::drawObject(objectsBuffer.getReferenceBuffer()[bufferPosition], window);
std::cout << object
}
static sf::Drawable& drawObject(LevelObject& object, sf::RenderWindow &window) {
if(!object.hidden) {
if(object.lobjecttype == LevelObjectType::RECTANGLE) {
sf::RectangleShape rectangleShape(sf::Vector2f(object.objectWidth, object.objectHeight));
rectangleShape.setPosition(sf::Vector2f(object.objectX, object.objectY));
if(object.objectRotation.has_value()) {
rectangleShape.setOrigin(object.objectWidth / 2.f, object.objectHeight / 2.f);
rectangleShape.setRotation(object.objectRotation.value());
}
rectangleShape.setFillColor(object.objectColor);
window.draw(rectangleShape);
return &rectangleShape;
}
}sf::Drawable& object = ObjectDrawer::drawObject(objectsBuffer.getReferenceBuffer()[bufferPosition], window)
static sf::Drawable* drawObject(LevelObject& object, sf::RenderWindow &window) {
if(!object.hidden) {
if(object.lobjecttype == LevelObjectType::RECTANGLE) {
sf::RectangleShape* rectangleShape = new sf::RectangleShape(sf::Vector2f(object.objectWidth, object.objectHeight));
rectangleShape->setPosition(sf::Vector2f(object.objectX, object.objectY));
if(object.objectRotation.has_value()) {
rectangleShape->setOrigin(object.objectWidth / 2.f, object.objectHeight / 2.f);
rectangleShape->setRotation(object.objectRotation.value());
}
rectangleShape->setFillColor(object.objectColor);
window.draw(*rectangleShape);
return rectangleShape;
}
}
class SFML_GRAPHICS_API Drawable
{
public:
////////////////////////////////////////////////////////////
/// \brief Virtual destructor
///
////////////////////////////////////////////////////////////
virtual ~Drawable() {}
protected:
friend class RenderTarget;
////////////////////////////////////////////////////////////
/// \brief Draw the object to a render target
///
/// This is a pure virtual function that has to be implemented
/// by the derived class to define how the drawable should be
/// drawn.
///
/// \param target Render target to draw to
/// \param states Current render states
///
////////////////////////////////////////////////////////////
virtual void draw(RenderTarget& target, RenderStates states) const = 0;
};class SFML_GRAPHICS_API Shape : public Drawable, public Transformable
{
public:
virtual ~Shape();
// нужно иметь доступ к этим методам ->
void setTexture(const Texture* texture, bool resetRect = false);
void setTextureRect(const IntRect& rect);
void setFillColor(const Color& color);
// и другие методы..
void drawObject(sf::Drawable &out) {
out = /* Возвращаемое значение */;
}
void test() {
sf::CircleShape circleShape { /* ... */ };
drawObject(circleShape); // circleShape = drawObject();
// ...
}