Witam.
Od kilku dni próbuję zrobić własny kształt, którego moim zdaniem brakuje w bibliotece SFML ( w sumie brakuje tam dużo kształtów).
Taki prostokąt z zaokrąglonymi bokami (taki prawie owal który fajnie pasuje na guziki).
Ogólnie na początku próbowałem zrobić funkcje która narysuje kształt używając klasy sf::ConvexShape.
I udało się funkcja działa ok. Następnie przyszła Myśl żeby zrobić własną klasę kształtu co by było idealne.
I tutaj mnie wyłożyło.
Próbowałem zrobić klasę kształtu który (w środku rysuje obiekt klasy sf::ConvexShape ) i też się udało.
Ale nie mogę zmieniać pozycji ani koloru obiektu w tamtej klasie bezpośrednio tylko poprzez odwołanie się w taki sposób:
Mojaklasa krowa;
krowa.setFillColor(sf::Color::Red); // Niedziała
krowa.shape.setFillColor(sf::Color::Red); //Działa.
Więc pomyślałem żeby zamiast korzystać z sf::ConvexShape zrobić własną klasę kształtu.
Próbowałem skopiować klasę sf::ConvexShape i ją przerobić niestety kompilacja się sypie.
Próbowałem również odpalić przykładową klasę kształtu podaną przez twórców SFML niestety nawet jej nie udało mi się zastosować kompilacja się sypie. i nie wiem już co jest grane być może ja źle ją implementuje.
Ogólnie klas dopiero się uczę więc na pewno gdzieś robię masę błędów.
To program z klasą podaną przez SFML nie kompiluje się i wywala
||=== Build: Debug in rerer (compiler: GNU GCC Compiler) ===|
/home/damian/Desktop/rerer/main.cpp||In function ‘int main()’:|
/home/damian/Desktop/rerer/main.cpp|28|error: conflicting return type specified for ‘virtual unsigned int main()::EllipseShape::getPointCount() const’|
/usr/include/SFML/Graphics/Shape.hpp|196|error: overriding ‘virtual std::size_t sf::Shape::getPointCount() const’|
/home/damian/Desktop/rerer/main.cpp|50|error: cannot declare variable ‘test’ to be of abstract type ‘main()::EllipseShape’|
/home/damian/Desktop/rerer/main.cpp|7|note: because the following virtual functions are pure within ‘main()::EllipseShape’:|
/usr/include/SFML/Graphics/Shape.hpp|213|note: virtual sf::Vector2f sf::Shape::getPoint(std::size_t) const|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 2 second(s)) ===|
#include <SFML/Graphics.hpp>
#include "krowa.h"
int main()
{
class EllipseShape : public sf::Shape
{
public :
explicit EllipseShape(const sf::Vector2f& radius = sf::Vector2f(0, 0)) :
m_radius(radius)
{
update();
}
void setRadius(const sf::Vector2f& radius)
{
m_radius = radius;
update();
}
const sf::Vector2f& getRadius() const
{
return m_radius;
}
virtual unsigned int getPointCount() const
{
return 30; // fixed, but could be an attribute of the class if needed
}
virtual sf::Vector2f getPoint(unsigned int index) const
{
static const float pi = 3.141592654f;
float angle = index * 2 * pi / getPointCount() - pi / 2;
float x = std::cos(angle) * m_radius.x;
float y = std::sin(angle) * m_radius.y;
return sf::Vector2f(m_radius.x + x, m_radius.y + y);
}
private :
sf::Vector2f m_radius;
};
sf::RenderWindow app(sf::VideoMode(800, 600), "SFML window");
EllipseShape test;
// Start the game loop
while (app.isOpen())
{
// Process events
sf::Event event;
while (app.pollEvent(event))
{
// Close window : exit
if (event.type == sf::Event::Closed)
app.close();
}
// Clear screen
app.clear();
// Draw the sprite
app.draw(test);
// Update the window
app.display();
}
return EXIT_SUCCESS;
}
Proszę o nakierowanie mnie co robię źle. Lub o jakieś przykłady.
Ogólnie chciałbym aby moja klasa robiła element konstruktorem w którym podaje parametry lub ewentualnie metoda która go zbuduje po podaniu wymiarów i parametrów. (nie chodzi mi o algorytm bo to mam ale o ciało)
Pozdrawiam Damian.