Composite pattern issue
#include <iostream>
#include <string>
#include "Drawing.hpp"
#include "Shape.hpp"
#include "Circle.hpp"
#include "Group.hpp"
using namespace std;
int main() {
Circle tete(0, 0, 200, Circle::Color::BLACK);
Circle c1(0, 0, 100, Circle::Color::BLACK);
Circle c2(0, 0, 70, Circle::Color::PINK);
Group oreille;
oreille.add(c1);
oreille.add(c2);
oreille.translate(-210, 210);
Group oreille2(oreille);
oreille2.translate(420, 0);
Circle nez(0, 0, 20, Circle::Color::RED);
Drawing d;
d.add(tete);
d.add(oreille);
d.add(oreille2);
d.add(nez);
d.draw();
return 0;
}
// Commande de compilation car pas cool de la retrouver dans l'historique console à chaque fois...
// g++ -std=c++11 source/main.cpp source/Circle.cpp source/Shape.cpp source/Group.cpp source/Drawing.cpp -framework SFML-graphics -framework SFML -framework SFML-window -framework SFML-system
#ifndef SHAPE_H
#define SHAPE_H
#include "Drawing.hpp"
class Drawing;
class Shape {
public:
virtual void draw(sf::RenderWindow &target);
virtual void translate(const float x, const float y);
private:
};
#endif
#include "Shape.hpp"
void Shape::draw(sf::RenderWindow &target) {};
void Shape::translate(const float x, const float y) {};
#ifndef GROUP_H
#define GROUP_H
#include <vector>
#include "Shape.hpp"
class Group : public Shape::Shape {
public:
Group();
Group(const std::vector<Shape::Shape> &children);
void add(Shape::Shape &s);
std::vector<Shape::Shape> &getChildren();
void draw(sf::RenderWindow &target);
void translate(const float x, const float y);
private:
std::vector<Shape::Shape> myChildren;
};
#endif
#include "Group.hpp"
using namespace std;
Group::Group() {
myChildren = vector<Shape::Shape>();
};
Group::Group(const vector<Shape::Shape> &children){
myChildren = children;
};
void Group::add (Shape::Shape &s) {
myChildren.push_back(s);
};
std::vector<Shape::Shape> &Group::getChildren() {
return myChildren;
};
void Group::draw(sf::RenderWindow &target) {
for (Shape::Shape s : myChildren) {
s.draw(target);
}
};
void Group::translate(const float x, const float y) {
for (Shape::Shape s : myChildren) {
s.translate(x, y);
}
};
#ifndef DRAWING_H
#define DRAWING_H
#include <SFML/Graphics.hpp>
#include "Shape.hpp"
#include <string>
class Shape;
class Drawing {
public:
Drawing();
void draw();
void add(Shape &shape);
private:
std::vector<Shape> myShapes;
};
#endif
#include "Drawing.hpp"
#include <iostream>
using namespace std;
Drawing::Drawing () {
myShapes = vector<Shape::Shape>();
};
void Drawing::draw() {
sf::RenderWindow window(sf::VideoMode(800, 600), "myTitle"); // TODO enlever le hardcodage des dimensions et du titre
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed || (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape)) {
window.close();
}
window.clear(sf::Color::White);
for (Shape::Shape s : myShapes) {
s.draw(window);
}
window.display();
}
}
};
void Drawing::add(Shape::Shape &shape) {
myShapes.push_back(shape);
};
#ifndef CIRCLE_H
#define CIRCLE_H
#include "Shape.hpp"
class Circle : public Shape::Shape {
public:
enum class Color {
BLACK,
RED,
PINK
};
Circle (float x, float y, float r, Color color);
Circle (float x, float y, float r);
void draw(sf::RenderWindow &target);
void translate(const float x, const float y);
private:
float myX;
float myY;
float myR;
Color myColor;
};
#endif
#include "Circle.hpp"
#include <iostream>
#include <string>
using namespace std;
Circle::Circle(float x, float y, float r, Circle::Color color) {
myX = x;
myY = y;
myR = r;
myColor = color;
};
Circle::Circle(float x, float y, float r) {
Circle::Circle(x, y, r, Circle::Color::BLACK);
};
void Circle::draw(sf::RenderWindow &target) {
cout << "Drawing a shape..." << endl;
sf::CircleShape circle;
circle.setRadius(myR);
circle.setPosition(myX, myY);
circle.setFillColor(sf::Color(100, 250, 50)); // On verra les différentes couleures ensuite...
target.draw(circle);
};
void Circle::translate(const float x, const float y) {
myX += x;
myY += y;
};