diff options
Diffstat (limited to 'tools/mapedit/src/widget.cpp')
| -rw-r--r-- | tools/mapedit/src/widget.cpp | 138 |
1 files changed, 103 insertions, 35 deletions
| diff --git a/tools/mapedit/src/widget.cpp b/tools/mapedit/src/widget.cpp index d50cf91..6cbedcd 100644 --- a/tools/mapedit/src/widget.cpp +++ b/tools/mapedit/src/widget.cpp | |||
| @@ -66,48 +66,91 @@ void MapeditWidget::OnPaint(wxPaintEvent&) | |||
| 66 | wxBitmap sprite = object->object->getSprite(); | 66 | wxBitmap sprite = object->object->getSprite(); |
| 67 | tiles_dc.SelectObject(sprite); | 67 | tiles_dc.SelectObject(sprite); |
| 68 | 68 | ||
| 69 | 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()); | 69 | wxPoint pos {(int) object->position.first*scale-vX, (int) object->position.second*scale-vY}; |
| 70 | wxSize size {object->object->getWidth()*scale, object->object->getHeight()*scale}; | ||
| 71 | dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, object->object->getWidth(), object->object->getHeight()); | ||
| 70 | 72 | ||
| 71 | if ((editMode == EditEntities) && (selectedEntity) && (object == selectedEntity)) | 73 | if (editMode == EditEntities) |
| 72 | { | 74 | { |
| 73 | wxPen pen(*wxGREEN, 2); | 75 | if (!selectedEntity) |
| 74 | dc.SetPen(pen); | 76 | { |
| 75 | dc.SetBrush(*wxTRANSPARENT_BRUSH); | 77 | wxPen pen(*wxYELLOW, 2); |
| 76 | dc.DrawRectangle(object->position.first*scale-vX, object->position.second*scale-vY, object->object->getWidth()*scale, object->object->getHeight()*scale); | 78 | dc.SetPen(pen); |
| 79 | dc.SetBrush(*wxTRANSPARENT_BRUSH); | ||
| 80 | dc.DrawRectangle(pos.x, pos.y, size.GetWidth(), size.GetHeight()); | ||
| 81 | } else if (object == selectedEntity) | ||
| 82 | { | ||
| 83 | wxPen pen(*wxGREEN, 2); | ||
| 84 | dc.SetPen(pen); | ||
| 85 | dc.SetBrush(*wxTRANSPARENT_BRUSH); | ||
| 86 | dc.DrawRectangle(pos.x, pos.y, size.GetWidth(), size.GetHeight()); | ||
| 87 | } | ||
| 77 | } | 88 | } |
| 78 | } | 89 | } |
| 79 | 90 | ||
| 80 | if (editMode == EditTiles) | 91 | if (map->getWorld()->getStartingMap()->getID() == map->getID()) |
| 92 | { | ||
| 93 | wxBitmap sprite = wxImage("res/Starla.png"); | ||
| 94 | tiles_dc.SelectObject(wxNullBitmap); | ||
| 95 | tiles_dc.SelectObject(sprite); | ||
| 96 | |||
| 97 | std::pair<double, double> startPos = map->getWorld()->getStartingPosition(); | ||
| 98 | |||
| 99 | wxPoint pos {(int) startPos.first*scale-vX, (int) startPos.second*scale-vY}; | ||
| 100 | wxSize size {PLAYER_WIDTH[currentPlayer]*scale, PLAYER_HEIGHT[currentPlayer]*scale}; | ||
| 101 | |||
| 102 | dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, PLAYER_WIDTH[currentPlayer], PLAYER_HEIGHT[currentPlayer]); | ||
| 103 | } | ||
| 104 | |||
| 105 | if (mouseIsIn) | ||
| 81 | { | 106 | { |
| 82 | if (mouseIsIn) | 107 | if (isSettingPos) |
| 108 | { | ||
| 109 | wxBitmap sprite = wxImage("res/Starla.png"); | ||
| 110 | tiles_dc.SelectObject(wxNullBitmap); | ||
| 111 | tiles_dc.SelectObject(sprite); | ||
| 112 | |||
| 113 | wxPoint pos {mousePos.x - PLAYER_WIDTH[currentPlayer]/2*scale, mousePos.y - PLAYER_HEIGHT[currentPlayer]/2*scale}; | ||
| 114 | wxSize size {PLAYER_WIDTH[currentPlayer]*scale, PLAYER_HEIGHT[currentPlayer]*scale}; | ||
| 115 | |||
| 116 | dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, PLAYER_WIDTH[currentPlayer], PLAYER_HEIGHT[currentPlayer]); | ||
| 117 | |||
| 118 | wxPen pen(*wxGREEN, 2); | ||
| 119 | dc.SetPen(pen); | ||
| 120 | dc.SetBrush(*wxTRANSPARENT_BRUSH); | ||
| 121 | dc.DrawRectangle(pos.x, pos.y, size.GetWidth(), size.GetHeight()); | ||
| 122 | } else if (editMode == EditTiles) | ||
| 83 | { | 123 | { |
| 84 | int tile = tileWidget->getSelected(); | 124 | int tile = tileWidget->getSelected(); |
| 85 | int x = (mousePos.x + vX) / (TILE_WIDTH * scale); | 125 | int x = (mousePos.x + vX) / (TILE_WIDTH * scale); |
| 86 | int y = (mousePos.y + vY) / (TILE_HEIGHT * scale); | 126 | int y = (mousePos.y + vY) / (TILE_HEIGHT * scale); |
| 87 | 127 | ||
| 128 | wxPoint pos {x*TILE_WIDTH*scale-vX, y*TILE_HEIGHT*scale-vY}; | ||
| 129 | wxSize size {TILE_WIDTH*scale, TILE_HEIGHT*scale}; | ||
| 130 | |||
| 88 | tiles_dc.SelectObject(wxNullBitmap); | 131 | tiles_dc.SelectObject(wxNullBitmap); |
| 89 | tiles_dc.SelectObject(tiles); | 132 | tiles_dc.SelectObject(tiles); |
| 90 | dc.StretchBlit(x*TILE_WIDTH*scale-vX, y*TILE_HEIGHT*scale-vY, TILE_WIDTH*scale, TILE_HEIGHT*scale, &tiles_dc, tile%8*TILE_WIDTH, tile/8*TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT); | 133 | dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, tile%8*TILE_WIDTH, tile/8*TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT); |
| 91 | 134 | ||
| 92 | wxPen pen(*wxGREEN, 2); | 135 | wxPen pen(*wxGREEN, 2); |
| 93 | dc.SetPen(pen); | 136 | dc.SetPen(pen); |
| 94 | dc.SetBrush(*wxTRANSPARENT_BRUSH); | 137 | dc.SetBrush(*wxTRANSPARENT_BRUSH); |
| 95 | dc.DrawRectangle(x*TILE_WIDTH*scale-vX, y*TILE_HEIGHT*scale-vY, TILE_WIDTH*scale, TILE_HEIGHT*scale); | 138 | dc.DrawRectangle(pos.x, pos.y, size.GetWidth(), size.GetHeight()); |
| 96 | } | 139 | } else if ((editMode == EditEntities) && (addingEntity != nullptr)) |
| 97 | } else if (editMode == EditEntities) | ||
| 98 | { | ||
| 99 | if ((addingEntity != nullptr) && (mouseIsIn)) | ||
| 100 | { | 140 | { |
| 101 | wxBitmap sprite = addingEntity->getSprite(); | 141 | wxBitmap sprite = addingEntity->getSprite(); |
| 102 | tiles_dc.SelectObject(wxNullBitmap); | 142 | tiles_dc.SelectObject(wxNullBitmap); |
| 103 | tiles_dc.SelectObject(sprite); | 143 | tiles_dc.SelectObject(sprite); |
| 104 | 144 | ||
| 105 | dc.StretchBlit(mousePos.x - addingEntity->getWidth()/2*scale, mousePos.y - addingEntity->getHeight()/2*scale, addingEntity->getWidth()*scale, addingEntity->getHeight()*scale, &tiles_dc, 0, 0, addingEntity->getWidth(), addingEntity->getHeight()); | 145 | wxPoint pos {mousePos.x - addingEntity->getWidth()/2*scale, mousePos.y - addingEntity->getHeight()/2*scale}; |
| 106 | 146 | wxSize size {addingEntity->getWidth()*scale, addingEntity->getHeight()*scale}; | |
| 147 | |||
| 148 | dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, addingEntity->getWidth(), addingEntity->getHeight()); | ||
| 149 | |||
| 107 | wxPen pen(*wxGREEN, 2); | 150 | wxPen pen(*wxGREEN, 2); |
| 108 | dc.SetPen(pen); | 151 | dc.SetPen(pen); |
| 109 | dc.SetBrush(*wxTRANSPARENT_BRUSH); | 152 | dc.SetBrush(*wxTRANSPARENT_BRUSH); |
| 110 | dc.DrawRectangle(mousePos.x - addingEntity->getWidth()/2*scale, mousePos.y - addingEntity->getHeight()/2*scale, addingEntity->getWidth()*scale, addingEntity->getHeight()*scale); | 153 | dc.DrawRectangle(pos.x, pos.y, size.GetWidth(), size.GetHeight()); |
| 111 | } | 154 | } |
| 112 | } | 155 | } |
| 113 | } | 156 | } |
| @@ -132,6 +175,13 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
| 132 | { | 175 | { |
| 133 | mouseIsDown = true; | 176 | mouseIsDown = true; |
| 134 | 177 | ||
| 178 | int vX, vY; | ||
| 179 | GetViewStart(&vX, &vY); | ||
| 180 | int vXX, vYX; | ||
| 181 | GetScrollPixelsPerUnit(&vXX, &vYX); | ||
| 182 | vX *= vXX; | ||
| 183 | vY *= vYX; | ||
| 184 | |||
| 135 | if (editMode == EditTiles) | 185 | if (editMode == EditTiles) |
| 136 | { | 186 | { |
| 137 | SetTile(event.GetPosition()); | 187 | SetTile(event.GetPosition()); |
| @@ -139,13 +189,6 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
| 139 | { | 189 | { |
| 140 | if (addingEntity != nullptr) | 190 | if (addingEntity != nullptr) |
| 141 | { | 191 | { |
| 142 | int vX, vY; | ||
| 143 | GetViewStart(&vX, &vY); | ||
| 144 | int vXX, vYX; | ||
| 145 | GetScrollPixelsPerUnit(&vXX, &vYX); | ||
| 146 | vX *= vXX; | ||
| 147 | vY *= vYX; | ||
| 148 | |||
| 149 | int x = (event.GetPosition().x + vX) / scale - (addingEntity->getWidth() / 2); | 192 | int x = (event.GetPosition().x + vX) / scale - (addingEntity->getWidth() / 2); |
| 150 | int y = (event.GetPosition().y + vY) / scale - (addingEntity->getHeight() / 2); | 193 | int y = (event.GetPosition().y + vY) / scale - (addingEntity->getHeight() / 2); |
| 151 | 194 | ||
| @@ -156,17 +199,10 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
| 156 | 199 | ||
| 157 | addingEntity = nullptr; | 200 | addingEntity = nullptr; |
| 158 | 201 | ||
| 159 | frame->FinishAddingEntity(); | 202 | frame->SetIsAddingEntity(false); |
| 160 | 203 | ||
| 161 | Refresh(); | 204 | Refresh(); |
| 162 | } else { | 205 | } else { |
| 163 | int vX, vY; | ||
| 164 | GetViewStart(&vX, &vY); | ||
| 165 | int vXX, vYX; | ||
| 166 | GetScrollPixelsPerUnit(&vXX, &vYX); | ||
| 167 | vX *= vXX; | ||
| 168 | vY *= vYX; | ||
| 169 | |||
| 170 | int x = (event.GetPosition().x + vX) / scale; | 206 | int x = (event.GetPosition().x + vX) / scale; |
| 171 | int y = (event.GetPosition().y + vY) / scale; | 207 | int y = (event.GetPosition().y + vY) / scale; |
| 172 | 208 | ||
| @@ -178,7 +214,7 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
| 178 | addingEntity = selectedEntity->object; | 214 | addingEntity = selectedEntity->object; |
| 179 | map->removeObject(selectedEntity); | 215 | map->removeObject(selectedEntity); |
| 180 | selectedEntity.reset(); | 216 | selectedEntity.reset(); |
| 181 | frame->StartAddingEntity(); | 217 | frame->SetIsAddingEntity(true); |
| 182 | } else { | 218 | } else { |
| 183 | selectedEntity.reset(); | 219 | selectedEntity.reset(); |
| 184 | } | 220 | } |
| @@ -201,6 +237,18 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
| 201 | } | 237 | } |
| 202 | } | 238 | } |
| 203 | 239 | ||
| 240 | if (isSettingPos) | ||
| 241 | { | ||
| 242 | int x = (event.GetPosition().x + vX) / scale - (PLAYER_WIDTH[currentPlayer] / 2); | ||
| 243 | int y = (event.GetPosition().y + vY) / scale - (PLAYER_HEIGHT[currentPlayer] / 2); | ||
| 244 | |||
| 245 | map->getWorld()->setStart(map, {x, y}); | ||
| 246 | isSettingPos = false; | ||
| 247 | frame->SetIsSettingStart(false); | ||
| 248 | |||
| 249 | Refresh(); | ||
| 250 | } | ||
| 251 | |||
| 204 | event.Skip(); | 252 | event.Skip(); |
| 205 | } | 253 | } |
| 206 | 254 | ||
| @@ -225,6 +273,8 @@ void MapeditWidget::OnRightClick(wxMouseEvent& event) | |||
| 225 | { | 273 | { |
| 226 | map->removeObject(selectedEntity); | 274 | map->removeObject(selectedEntity); |
| 227 | selectedEntity.reset(); | 275 | selectedEntity.reset(); |
| 276 | |||
| 277 | Refresh(); | ||
| 228 | } | 278 | } |
| 229 | } | 279 | } |
| 230 | } | 280 | } |
| @@ -290,7 +340,11 @@ void MapeditWidget::SetEditMode(EditMode editMode) | |||
| 290 | void MapeditWidget::StartAddingEntity(MapObject* object) | 340 | void MapeditWidget::StartAddingEntity(MapObject* object) |
| 291 | { | 341 | { |
| 292 | addingEntity = object; | 342 | addingEntity = object; |
| 343 | |||
| 344 | // Turn everything else off | ||
| 293 | selectedEntity = nullptr; | 345 | selectedEntity = nullptr; |
| 346 | isSettingPos = false; | ||
| 347 | frame->SetIsSettingStart(false); | ||
| 294 | } | 348 | } |
| 295 | 349 | ||
| 296 | void MapeditWidget::CancelAddingEntity() | 350 | void MapeditWidget::CancelAddingEntity() |
| @@ -298,6 +352,20 @@ void MapeditWidget::CancelAddingEntity() | |||
| 298 | addingEntity = nullptr; | 352 | addingEntity = nullptr; |
| 299 | } | 353 | } |
| 300 | 354 | ||
| 355 | void MapeditWidget::SetIsSettingStart(bool isSetting) | ||
| 356 | { | ||
| 357 | if (isSetting) | ||
| 358 | { | ||
| 359 | isSettingPos = true; | ||
| 360 | |||
| 361 | frame->SetIsAddingEntity(false); | ||
| 362 | addingEntity = nullptr; | ||
| 363 | selectedEntity = nullptr; | ||
| 364 | } else { | ||
| 365 | isSettingPos = false; | ||
| 366 | } | ||
| 367 | } | ||
| 368 | |||
| 301 | void MapeditWidget::SetMap(Map* map) | 369 | void MapeditWidget::SetMap(Map* map) |
| 302 | { | 370 | { |
| 303 | this->map = map; | 371 | this->map = map; |
