Ajout de l'interaction sélection rectangulaire dans éditeur
This commit is contained in:
parent
603c2fff65
commit
b4b8aaedac
|
@ -38,8 +38,8 @@ private:
|
||||||
void removeObject(sf::Vector2f position);
|
void removeObject(sf::Vector2f position);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ajoute l'objet donné (par position ou par pointeur)
|
* Ajoute l'objet/les objets donné(s) (par position, entre deux
|
||||||
* à la sélection
|
* positions ou par pointeur) à la sélection
|
||||||
*
|
*
|
||||||
* - REPLACE : remplace toute sélection précédente
|
* - REPLACE : remplace toute sélection précédente
|
||||||
* - FLIP : sélectionne l'élément s'il ne l'est pas, sinon le désélectionne
|
* - FLIP : sélectionne l'élément s'il ne l'est pas, sinon le désélectionne
|
||||||
|
@ -47,11 +47,17 @@ private:
|
||||||
*/
|
*/
|
||||||
void select(ObjectPtr object, SelectionMode mode);
|
void select(ObjectPtr object, SelectionMode mode);
|
||||||
void select(sf::Vector2f position, SelectionMode mode);
|
void select(sf::Vector2f position, SelectionMode mode);
|
||||||
|
void select(sf::Vector2f top_left, sf::Vector2f bottom_right);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lance le test du niveau
|
* Lance le test du niveau
|
||||||
*/
|
*/
|
||||||
void testLevel();
|
void test();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Traite l'événement et renvoie true si on s'en est servi
|
||||||
|
*/
|
||||||
|
bool processEvent(const sf::Event& event);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -23,11 +23,18 @@ void Editor::frame() {
|
||||||
|
|
||||||
// traitement des événements
|
// traitement des événements
|
||||||
for (unsigned int i = 0; i < events.size(); i++) {
|
for (unsigned int i = 0; i < events.size(); i++) {
|
||||||
const sf::Event& event = events[i];
|
processEvent(events[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// dessin de la frame
|
||||||
|
draw();
|
||||||
|
sf::sleep(sf::seconds(1.f / 30));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Editor::processEvent(const sf::Event& event) {
|
||||||
// traitement des événements du widget timer
|
// traitement des événements du widget timer
|
||||||
if (widget_timer.processEvent(event)) {
|
if (widget_timer.processEvent(event)) {
|
||||||
continue;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// lorsque l'on clique dans l'éditeur
|
// lorsque l'on clique dans l'éditeur
|
||||||
|
@ -42,7 +49,7 @@ void Editor::frame() {
|
||||||
drag_end = position;
|
drag_end = position;
|
||||||
drag_mode = DragMode::SELECT_RECT;
|
drag_mode = DragMode::SELECT_RECT;
|
||||||
|
|
||||||
continue;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clic sur un objet : démarrage de la sélection libre
|
// clic sur un objet : démarrage de la sélection libre
|
||||||
|
@ -56,20 +63,24 @@ void Editor::frame() {
|
||||||
} else {
|
} else {
|
||||||
select(pointed_object, SelectionMode::FLIP);
|
select(pointed_object, SelectionMode::FLIP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clic gauche dans le vide : démarrage du placement
|
// clic gauche dans le vide : démarrage du placement
|
||||||
// en drag&ndrop
|
// en drag&ndrop
|
||||||
else {
|
|
||||||
drag_start = position;
|
drag_start = position;
|
||||||
drag_end = position;
|
drag_end = position;
|
||||||
drag_mode = DragMode::PLACE_OBJECTS;
|
drag_mode = DragMode::PLACE_OBJECTS;
|
||||||
|
|
||||||
select(addObject(position), SelectionMode::REPLACE);
|
select(addObject(position), SelectionMode::REPLACE);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
} else if (event.mouseButton.button == sf::Mouse::Right) {
|
|
||||||
|
if (event.mouseButton.button == sf::Mouse::Right) {
|
||||||
// clic droit : on supprime l'objet pointé
|
// clic droit : on supprime l'objet pointé
|
||||||
removeObject(pointed_object);
|
removeObject(pointed_object);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,18 +93,27 @@ void Editor::frame() {
|
||||||
// mode placement d'objets
|
// mode placement d'objets
|
||||||
if (drag_mode == DragMode::PLACE_OBJECTS && pointed_object == nullptr) {
|
if (drag_mode == DragMode::PLACE_OBJECTS && pointed_object == nullptr) {
|
||||||
select(addObject(position), SelectionMode::ADD);
|
select(addObject(position), SelectionMode::ADD);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// mode sélection libre : on l'objet à la sélection
|
// mode sélection libre : on l'objet à la sélection
|
||||||
if (drag_mode == DragMode::SELECT_BULK) {
|
if (drag_mode == DragMode::SELECT_BULK) {
|
||||||
select(position, SelectionMode::ADD);
|
select(position, SelectionMode::ADD);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// lorsqu'on relâche un clic dans l'éditeur
|
// lorsqu'on relâche un clic dans l'éditeur
|
||||||
if (event.type == sf::Event::MouseButtonReleased) {
|
if (event.type == sf::Event::MouseButtonReleased) {
|
||||||
sf::Vector2f position(event.mouseButton.x, event.mouseButton.y);
|
sf::Vector2f position(event.mouseButton.x, event.mouseButton.y);
|
||||||
|
|
||||||
|
// mode sélection rectangulaire : on applique la sélection
|
||||||
|
if (drag_mode == DragMode::SELECT_RECT) {
|
||||||
|
select(drag_start, drag_end);
|
||||||
|
}
|
||||||
|
|
||||||
drag_mode = DragMode::NONE;
|
drag_mode = DragMode::NONE;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// gestion des touches
|
// gestion des touches
|
||||||
|
@ -109,20 +129,17 @@ void Editor::frame() {
|
||||||
}
|
}
|
||||||
|
|
||||||
selection.clear();
|
selection.clear();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// appui sur espace : test du niveau en cours d'édition
|
// appui sur espace : test du niveau en cours d'édition
|
||||||
if (event.key.code == sf::Keyboard::Space) {
|
if (event.key.code == sf::Keyboard::Space) {
|
||||||
testLevel();
|
test();
|
||||||
return; // important : ne pas dessiner la frame
|
return true;
|
||||||
// on risque d'avoir perdu le pointeur en changeant de vue
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// dessin de la frame
|
return false;
|
||||||
draw();
|
|
||||||
sf::sleep(sf::seconds(1.f / 30));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::draw() {
|
void Editor::draw() {
|
||||||
|
@ -254,7 +271,31 @@ void Editor::select(sf::Vector2f position, SelectionMode mode) {
|
||||||
select(getObject(position), mode);
|
select(getObject(position), mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::testLevel() {
|
void Editor::select(sf::Vector2f top_left, sf::Vector2f bottom_right) {
|
||||||
|
std::vector<ObjectPtr>& objects = getObjects();
|
||||||
|
sf::FloatRect selection_rect(
|
||||||
|
std::min(top_left.x, bottom_right.x),
|
||||||
|
std::min(top_left.y, bottom_right.y),
|
||||||
|
std::abs(bottom_right.x - top_left.x),
|
||||||
|
std::abs(bottom_right.y - top_left.y)
|
||||||
|
);
|
||||||
|
|
||||||
|
// réinitialisation de la sélectionne
|
||||||
|
for (unsigned int i = 0; i < selection.size(); i++) {
|
||||||
|
selection[i]->setSelected(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
selection.clear();
|
||||||
|
|
||||||
|
// sélection des éléments intersectant le rectangle
|
||||||
|
for (unsigned int i = 0; i < objects.size(); i++) {
|
||||||
|
if (objects[i]->getAABB()->intersects(selection_rect)) {
|
||||||
|
select(objects[i], SelectionMode::ADD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::test() {
|
||||||
std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(manager));
|
std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(manager));
|
||||||
|
|
||||||
// copie des propriétés
|
// copie des propriétés
|
||||||
|
|
Loading…
Reference in New Issue