Ajout de l'interaction sélection rectangulaire dans éditeur

This commit is contained in:
Mattéo Delabre 2016-04-07 22:01:07 +02:00
parent 603c2fff65
commit b4b8aaedac
2 changed files with 146 additions and 99 deletions

View File

@ -38,8 +38,8 @@ private:
void removeObject(sf::Vector2f position);
/**
* Ajoute l'objet donné (par position ou par pointeur)
* à la sélection
* Ajoute l'objet/les objets donné(s) (par position, entre deux
* positions ou par pointeur) à la sélection
*
* - 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
@ -47,11 +47,17 @@ private:
*/
void select(ObjectPtr object, SelectionMode mode);
void select(sf::Vector2f position, SelectionMode mode);
void select(sf::Vector2f top_left, sf::Vector2f bottom_right);
/**
* 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:
/**

View File

@ -23,11 +23,18 @@ void Editor::frame() {
// traitement des événements
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
if (widget_timer.processEvent(event)) {
continue;
return true;
}
// lorsque l'on clique dans l'éditeur
@ -42,7 +49,7 @@ void Editor::frame() {
drag_end = position;
drag_mode = DragMode::SELECT_RECT;
continue;
return true;
}
// clic sur un objet : démarrage de la sélection libre
@ -56,20 +63,24 @@ void Editor::frame() {
} else {
select(pointed_object, SelectionMode::FLIP);
}
return true;
}
// clic gauche dans le vide : démarrage du placement
// en drag&ndrop
else {
drag_start = position;
drag_end = position;
drag_mode = DragMode::PLACE_OBJECTS;
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é
removeObject(pointed_object);
return true;
}
}
@ -82,18 +93,27 @@ void Editor::frame() {
// mode placement d'objets
if (drag_mode == DragMode::PLACE_OBJECTS && pointed_object == nullptr) {
select(addObject(position), SelectionMode::ADD);
return true;
}
// mode sélection libre : on l'objet à la sélection
if (drag_mode == DragMode::SELECT_BULK) {
select(position, SelectionMode::ADD);
return true;
}
}
// lorsqu'on relâche un clic dans l'éditeur
if (event.type == sf::Event::MouseButtonReleased) {
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;
return true;
}
// gestion des touches
@ -109,20 +129,17 @@ void Editor::frame() {
}
selection.clear();
return true;
}
// appui sur espace : test du niveau en cours d'édition
if (event.key.code == sf::Keyboard::Space) {
testLevel();
return; // important : ne pas dessiner la frame
// on risque d'avoir perdu le pointeur en changeant de vue
}
test();
return true;
}
}
// dessin de la frame
draw();
sf::sleep(sf::seconds(1.f / 30));
return false;
}
void Editor::draw() {
@ -254,7 +271,31 @@ void Editor::select(sf::Vector2f position, SelectionMode 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));
// copie des propriétés