From c46db36fe1c319a76cb6bd089b25952db0d98e11 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Mon, 16 Mar 2015 10:30:31 -0400 Subject: Added ability to edit and remove entities to map editor --- tools/mapedit/src/frame.cpp | 7 +++ tools/mapedit/src/frame.h | 1 + tools/mapedit/src/map.cpp | 25 ++++++++--- tools/mapedit/src/map.h | 11 ++++- tools/mapedit/src/object.cpp | 6 +-- tools/mapedit/src/tile_widget.cpp | 2 +- tools/mapedit/src/widget.cpp | 89 ++++++++++++++++++++++++++++++++++++--- tools/mapedit/src/widget.h | 4 ++ 8 files changed, 126 insertions(+), 19 deletions(-) (limited to 'tools') diff --git a/tools/mapedit/src/frame.cpp b/tools/mapedit/src/frame.cpp index 6119ad3..0b03448 100644 --- a/tools/mapedit/src/frame.cpp +++ b/tools/mapedit/src/frame.cpp @@ -301,6 +301,13 @@ void MapeditFrame::OnCancelAddEntity(wxCommandEvent&) mapEditor->CancelAddingEntity(); } +void MapeditFrame::StartAddingEntity() +{ + addingEntity = true; + addEntityButton->Disable(); + cancelEntityButton->Enable(); +} + void MapeditFrame::FinishAddingEntity() { addingEntity = false; diff --git a/tools/mapedit/src/frame.h b/tools/mapedit/src/frame.h index cb29480..1cce4f3 100644 --- a/tools/mapedit/src/frame.h +++ b/tools/mapedit/src/frame.h @@ -19,6 +19,7 @@ class MapeditFrame : public wxFrame { MapeditFrame(Map map, std::string filename); MapeditWidget* GetMapEditor(); + void StartAddingEntity(); void FinishAddingEntity(); static void NewMap(); diff --git a/tools/mapedit/src/map.cpp b/tools/mapedit/src/map.cpp index 1414e16..2799a4e 100644 --- a/tools/mapedit/src/map.cpp +++ b/tools/mapedit/src/map.cpp @@ -60,18 +60,19 @@ Map::Map(std::string filename) { if (!xmlStrcmp(entityNode->name, (const xmlChar*) "entity")) { - MapObjectEntry data; + auto data = std::make_shared(); + for (xmlNodePtr entityDataNode = entityNode->xmlChildrenNode; entityDataNode != NULL; entityDataNode = entityDataNode->next) { if (!xmlStrcmp(entityDataNode->name, (const xmlChar*) "entity-type")) { xmlChar* key = xmlNodeListGetString(doc, entityDataNode->xmlChildrenNode, 1); - data.object = MapObject::getAllObjects().at((char*) key).get(); + data->object = MapObject::getAllObjects().at((char*) key).get(); xmlFree(key); } else if (!xmlStrcmp(entityDataNode->name, (const xmlChar*) "entity-position")) { xmlChar* key = xmlNodeListGetString(doc, entityDataNode->xmlChildrenNode, 1); - sscanf((char*) key, "%lf,%lf", &data.position.first, &data.position.second); + sscanf((char*) key, "%lf,%lf", &data->position.first, &data->position.second); xmlFree(key); } } @@ -172,11 +173,11 @@ void Map::save(std::string name) rc = xmlTextWriterStartElement(writer, (xmlChar*) "entity"); if (rc < 0) throw MapWriteException(name); - rc = xmlTextWriterWriteElement(writer, (xmlChar*) "entity-type", (xmlChar*) object.object->getType().c_str()); + rc = xmlTextWriterWriteElement(writer, (xmlChar*) "entity-type", (xmlChar*) object->object->getType().c_str()); if (rc < 0) throw MapWriteException(name); std::ostringstream entpos_out; - entpos_out << object.position.first << "," << object.position.second; + entpos_out << object->position.first << "," << object->position.second; rc = xmlTextWriterWriteElement(writer, (xmlChar*) "entity-position", (xmlChar*) entpos_out.str().c_str()); if (rc < 0) throw MapWriteException(name); @@ -226,7 +227,19 @@ void Map::setTitle(std::string title) this->title = title; } -std::list& Map::getObjects() +const std::list>& Map::getObjects() const { return objects; } + +void Map::addObject(std::shared_ptr& obj) +{ + dirty = true; + objects.push_back(obj); +} + +void Map::removeObject(std::shared_ptr& obj) +{ + dirty = true; + objects.remove(obj); +} diff --git a/tools/mapedit/src/map.h b/tools/mapedit/src/map.h index 850a66b..16bbb4c 100644 --- a/tools/mapedit/src/map.h +++ b/tools/mapedit/src/map.h @@ -46,6 +46,11 @@ class MapWriteException: public std::exception struct MapObjectEntry { MapObject* object; std::pair position; + + bool operator==(MapObjectEntry& other) const + { + return (object == other.object) && (position == other.position); + } }; class Map { @@ -64,10 +69,12 @@ class Map { bool hasUnsavedChanges() const; void setTileAt(int x, int y, int tile); int getTileAt(int x, int y) const; - std::list& getObjects(); + const std::list>& getObjects() const; + void addObject(std::shared_ptr& obj); + void removeObject(std::shared_ptr& obj); private: - std::list objects; + std::list> objects; int* mapdata; std::string title; std::string leftmap; diff --git a/tools/mapedit/src/object.cpp b/tools/mapedit/src/object.cpp index 4cd267d..a783691 100644 --- a/tools/mapedit/src/object.cpp +++ b/tools/mapedit/src/object.cpp @@ -10,7 +10,7 @@ const std::map> MapObject::getAllObjects { if (!objsInit) { - DIR* dir = opendir("../../../entities/"); + DIR* dir = opendir("entities/"); if (dir != NULL) { struct dirent* ent; @@ -37,7 +37,7 @@ MapObject::MapObject(const char* filename) { type = filename; - xmlDocPtr doc = xmlParseFile(("../../../entities/" + std::string(filename) + ".xml").c_str()); + xmlDocPtr doc = xmlParseFile(("entities/" + std::string(filename) + ".xml").c_str()); if (doc == nullptr) throw MapObjectLoadException(filename); xmlNodePtr top = xmlDocGetRootElement(doc); @@ -56,7 +56,7 @@ MapObject::MapObject(const char* filename) std::string spriteFile = (char*) key; xmlFree(key); - sprite = wxImage("../../" + spriteFile); + sprite = wxImage(spriteFile); } else if (!xmlStrcmp(node->name, (const xmlChar*) "action")) { xmlChar* key = xmlNodeListGetString(doc, node->xmlChildrenNode, 1); diff --git a/tools/mapedit/src/tile_widget.cpp b/tools/mapedit/src/tile_widget.cpp index dc39fdd..7ffaf30 100644 --- a/tools/mapedit/src/tile_widget.cpp +++ b/tools/mapedit/src/tile_widget.cpp @@ -26,7 +26,7 @@ int TileWidget::getSelected() void TileWidget::Init() { - tiles = wxBitmap(wxImage("../../../res/tiles.png")); + tiles = wxBitmap(wxImage("res/tiles.png")); this->FitInside(); this->SetScrollRate(5, 5); diff --git a/tools/mapedit/src/widget.cpp b/tools/mapedit/src/widget.cpp index a78caae..c1f044c 100644 --- a/tools/mapedit/src/widget.cpp +++ b/tools/mapedit/src/widget.cpp @@ -6,6 +6,7 @@ IMPLEMENT_DYNAMIC_CLASS(MapeditWidget,wxScrolledWindow) BEGIN_EVENT_TABLE(MapeditWidget, wxScrolledWindow) EVT_PAINT(MapeditWidget::OnPaint) EVT_LEFT_DOWN(MapeditWidget::OnClick) + EVT_RIGHT_DOWN(MapeditWidget::OnRightClick) EVT_LEFT_UP(MapeditWidget::OnMouseUp) EVT_MOTION(MapeditWidget::OnMouseMove) EVT_LEAVE_WINDOW(MapeditWidget::OnMouseOut) @@ -24,7 +25,7 @@ MapeditWidget::MapeditWidget(wxWindow* parent, wxWindowID winid, Map* map, TileW void MapeditWidget::Init() { - tiles = wxBitmap(wxImage("../../../res/tiles.png")); + tiles = wxBitmap(wxImage("res/tiles.png")); this->FitInside(); this->SetScrollRate(5, 5); @@ -62,10 +63,18 @@ void MapeditWidget::OnPaint(wxPaintEvent&) { tiles_dc.SelectObject(wxNullBitmap); - wxBitmap sprite = object.object->getSprite(); + wxBitmap sprite = object->object->getSprite(); tiles_dc.SelectObject(sprite); - dc.StretchBlit(object.position.first*scale-vX, object.position.second*scale-vY, object.object->getWidth()*scale, object.object->getHeight()*scale, &tiles_dc, 0, 0, object.object->getWidth(), object.object->getHeight()); + dc.StretchBlit(object->position.first*scale-vX, object->position.second*scale-vY, object->object->getWidth()*scale, object->object->getHeight()*scale, &tiles_dc, 0, 0, object->object->getWidth(), object->object->getHeight()); + + if ((editMode == EditEntities) && (selectedEntity) && (object == selectedEntity)) + { + wxPen pen(*wxGREEN, 2); + dc.SetPen(pen); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(object->position.first*scale-vX, object->position.second*scale-vY, object->object->getWidth()*scale, object->object->getHeight()*scale); + } } if (editMode == EditTiles) @@ -140,22 +149,87 @@ void MapeditWidget::OnClick(wxMouseEvent& event) int x = (event.GetPosition().x + vX) / scale - (addingEntity->getWidth() / 2); int y = (event.GetPosition().y + vY) / scale - (addingEntity->getHeight() / 2); - MapObjectEntry data; - data.object = addingEntity; - data.position = std::make_pair(x,y); - map->getObjects().push_back(data); + auto data = std::make_shared(); + data->object = addingEntity; + data->position = std::make_pair(x,y); + map->addObject(data); addingEntity = nullptr; frame->FinishAddingEntity(); Refresh(); + } else { + int vX, vY; + GetViewStart(&vX, &vY); + int vXX, vYX; + GetScrollPixelsPerUnit(&vXX, &vYX); + vX *= vXX; + vY *= vYX; + + int x = (event.GetPosition().x + vX) / scale; + int y = (event.GetPosition().y + vY) / scale; + + if (selectedEntity) + { + if ((x > selectedEntity->position.first) && (x < selectedEntity->position.first + selectedEntity->object->getWidth()) + && (y > selectedEntity->position.second) && (y < selectedEntity->position.second + selectedEntity->object->getHeight())) + { + addingEntity = selectedEntity->object; + map->removeObject(selectedEntity); + selectedEntity.reset(); + frame->StartAddingEntity(); + } else { + selectedEntity.reset(); + } + + Refresh(); + } else { + for (auto object : map->getObjects()) + { + if ((x >= object->position.first) && (x <= object->position.first + object->object->getWidth()) + && (y >= object->position.second) && (y <= object->position.second + object->object->getHeight())) + { + selectedEntity = object; + + Refresh(); + + break; + } + } + } } } event.Skip(); } +void MapeditWidget::OnRightClick(wxMouseEvent& event) +{ + if (editMode == EditEntities) + { + if (selectedEntity) + { + int vX, vY; + GetViewStart(&vX, &vY); + int vXX, vYX; + GetScrollPixelsPerUnit(&vXX, &vYX); + vX *= vXX; + vY *= vYX; + + int x = (event.GetPosition().x + vX) / scale; + int y = (event.GetPosition().y + vY) / scale; + + if ((x > selectedEntity->position.first) && (x < selectedEntity->position.first + selectedEntity->object->getWidth()) + && (y > selectedEntity->position.second) && (y < selectedEntity->position.second + selectedEntity->object->getHeight())) + { + map->removeObject(selectedEntity); + selectedEntity.reset(); + } + } + } +} + void MapeditWidget::OnMouseMove(wxMouseEvent& event) { mousePos = event.GetPosition(); @@ -216,6 +290,7 @@ void MapeditWidget::SetEditMode(EditMode editMode) void MapeditWidget::StartAddingEntity(MapObject* object) { addingEntity = object; + selectedEntity = nullptr; } void MapeditWidget::CancelAddingEntity() diff --git a/tools/mapedit/src/widget.h b/tools/mapedit/src/widget.h index 9de5b02..a660f82 100644 --- a/tools/mapedit/src/widget.h +++ b/tools/mapedit/src/widget.h @@ -9,6 +9,8 @@ #include "map.h" #include "tile_widget.h" +#include +#include class MapeditFrame; @@ -35,6 +37,7 @@ class MapeditWidget : public wxScrolledWindow { virtual wxSize DoGetBestSize() const; void OnPaint(wxPaintEvent& event); void OnClick(wxMouseEvent& event); + void OnRightClick(wxMouseEvent& event); void OnMouseMove(wxMouseEvent& event); void OnMouseUp(wxMouseEvent& event); void OnMouseOut(wxMouseEvent& event); @@ -53,6 +56,7 @@ class MapeditWidget : public wxScrolledWindow { EditMode editMode = EditTiles; MapObject* addingEntity = nullptr; + std::shared_ptr selectedEntity; DECLARE_DYNAMIC_CLASS(MapeditWidget) DECLARE_EVENT_TABLE() -- cgit 1.4.1