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; |