diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2015-03-15 23:24:22 -0400 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2015-03-15 23:24:22 -0400 |
commit | 213cab3c04b81428ab715f340bd7c12438fdb980 (patch) | |
tree | 295d25eac4b94357ac5b9bb4b3fd03130181b956 /tools/mapedit/src/widget.cpp | |
parent | 25240241e91dc913d20fbb93aa4acc9433dda6a0 (diff) | |
download | therapy-213cab3c04b81428ab715f340bd7c12438fdb980.tar.gz therapy-213cab3c04b81428ab715f340bd7c12438fdb980.tar.bz2 therapy-213cab3c04b81428ab715f340bd7c12438fdb980.zip |
Map editor can now add entities to maps
Also fixed a big bug regarding scrolling
Diffstat (limited to 'tools/mapedit/src/widget.cpp')
-rw-r--r-- | tools/mapedit/src/widget.cpp | 123 |
1 files changed, 101 insertions, 22 deletions
diff --git a/tools/mapedit/src/widget.cpp b/tools/mapedit/src/widget.cpp index d7f1a51..ba3b6a5 100644 --- a/tools/mapedit/src/widget.cpp +++ b/tools/mapedit/src/widget.cpp | |||
@@ -1,4 +1,5 @@ | |||
1 | #include "widget.h" | 1 | #include "widget.h" |
2 | #include "frame.h" | ||
2 | 3 | ||
3 | IMPLEMENT_DYNAMIC_CLASS(MapeditWidget,wxScrolledWindow) | 4 | IMPLEMENT_DYNAMIC_CLASS(MapeditWidget,wxScrolledWindow) |
4 | 5 | ||
@@ -36,13 +37,17 @@ wxSize MapeditWidget::DoGetBestSize() const | |||
36 | return {GAME_WIDTH*2, GAME_HEIGHT*2}; | 37 | return {GAME_WIDTH*2, GAME_HEIGHT*2}; |
37 | } | 38 | } |
38 | 39 | ||
39 | void MapeditWidget::OnPaint(wxPaintEvent& event) | 40 | void MapeditWidget::OnPaint(wxPaintEvent&) |
40 | { | 41 | { |
41 | wxPaintDC dc(this); | 42 | wxPaintDC dc(this); |
42 | wxMemoryDC tiles_dc; | 43 | wxMemoryDC tiles_dc; |
43 | tiles_dc.SelectObject(tiles); | 44 | tiles_dc.SelectObject(tiles); |
44 | int vX, vY; | 45 | int vX, vY; |
45 | GetViewStart(&vX, &vY); | 46 | GetViewStart(&vX, &vY); |
47 | int vXX, vYX; | ||
48 | GetScrollPixelsPerUnit(&vXX, &vYX); | ||
49 | vX *= vXX; | ||
50 | vY *= vYX; | ||
46 | 51 | ||
47 | for (int y=0; y<MAP_HEIGHT; y++) | 52 | for (int y=0; y<MAP_HEIGHT; y++) |
48 | { | 53 | { |
@@ -63,20 +68,38 @@ void MapeditWidget::OnPaint(wxPaintEvent& event) | |||
63 | 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()); | 68 | 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()); |
64 | } | 69 | } |
65 | 70 | ||
66 | if (mouseIsIn) | 71 | if (editMode == EditTiles) |
67 | { | 72 | { |
68 | int tile = tileWidget->getSelected(); | 73 | if (mouseIsIn) |
69 | int x = (mousePos.x + vX) / (TILE_WIDTH * scale); | 74 | { |
70 | int y = (mousePos.y + vY) / (TILE_HEIGHT * scale); | 75 | int tile = tileWidget->getSelected(); |
76 | int x = (mousePos.x + vX) / (TILE_WIDTH * scale); | ||
77 | int y = (mousePos.y + vY) / (TILE_HEIGHT * scale); | ||
71 | 78 | ||
72 | tiles_dc.SelectObject(wxNullBitmap); | 79 | tiles_dc.SelectObject(wxNullBitmap); |
73 | tiles_dc.SelectObject(tiles); | 80 | tiles_dc.SelectObject(tiles); |
74 | 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); | 81 | 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); |
75 | 82 | ||
76 | wxPen pen(*wxGREEN, 2); | 83 | wxPen pen(*wxGREEN, 2); |
77 | dc.SetPen(pen); | 84 | dc.SetPen(pen); |
78 | dc.SetBrush(*wxTRANSPARENT_BRUSH); | 85 | dc.SetBrush(*wxTRANSPARENT_BRUSH); |
79 | dc.DrawRectangle(x*TILE_WIDTH*scale-vX, y*TILE_HEIGHT*scale-vY, TILE_WIDTH*scale, TILE_HEIGHT*scale); | 86 | dc.DrawRectangle(x*TILE_WIDTH*scale-vX, y*TILE_HEIGHT*scale-vY, TILE_WIDTH*scale, TILE_HEIGHT*scale); |
87 | } | ||
88 | } else if (editMode == EditEntities) | ||
89 | { | ||
90 | if ((addingEntity != nullptr) && (mouseIsIn)) | ||
91 | { | ||
92 | wxBitmap sprite = addingEntity->getSprite(); | ||
93 | tiles_dc.SelectObject(wxNullBitmap); | ||
94 | tiles_dc.SelectObject(sprite); | ||
95 | |||
96 | 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()); | ||
97 | |||
98 | wxPen pen(*wxGREEN, 2); | ||
99 | dc.SetPen(pen); | ||
100 | dc.SetBrush(*wxTRANSPARENT_BRUSH); | ||
101 | dc.DrawRectangle(mousePos.x - addingEntity->getWidth()/2*scale, mousePos.y - addingEntity->getHeight()/2*scale, addingEntity->getWidth()*scale, addingEntity->getHeight()*scale); | ||
102 | } | ||
80 | } | 103 | } |
81 | } | 104 | } |
82 | 105 | ||
@@ -84,6 +107,10 @@ void MapeditWidget::SetTile(wxPoint pos) | |||
84 | { | 107 | { |
85 | int vX, vY; | 108 | int vX, vY; |
86 | GetViewStart(&vX, &vY); | 109 | GetViewStart(&vX, &vY); |
110 | int vXX, vYX; | ||
111 | GetScrollPixelsPerUnit(&vXX, &vYX); | ||
112 | vX *= vXX; | ||
113 | vY *= vYX; | ||
87 | 114 | ||
88 | int x = (pos.x + vX) / (TILE_WIDTH * scale); | 115 | int x = (pos.x + vX) / (TILE_WIDTH * scale); |
89 | int y = (pos.y + vY) / (TILE_HEIGHT * scale); | 116 | int y = (pos.y + vY) / (TILE_HEIGHT * scale); |
@@ -96,32 +123,64 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
96 | { | 123 | { |
97 | mouseIsDown = true; | 124 | mouseIsDown = true; |
98 | 125 | ||
99 | SetTile(event.GetPosition()); | 126 | if (editMode == EditTiles) |
127 | { | ||
128 | SetTile(event.GetPosition()); | ||
129 | } else if (editMode == EditEntities) | ||
130 | { | ||
131 | if (addingEntity != nullptr) | ||
132 | { | ||
133 | int vX, vY; | ||
134 | GetViewStart(&vX, &vY); | ||
135 | int vXX, vYX; | ||
136 | GetScrollPixelsPerUnit(&vXX, &vYX); | ||
137 | vX *= vXX; | ||
138 | vY *= vYX; | ||
139 | |||
140 | int x = (event.GetPosition().x + vX) / scale - (addingEntity->getWidth() / 2); | ||
141 | int y = (event.GetPosition().y + vY) / scale - (addingEntity->getHeight() / 2); | ||
142 | printf("%d,%d\n",x,y); | ||
143 | MapObjectEntry data; | ||
144 | data.object = addingEntity; | ||
145 | data.position = std::make_pair(x,y); | ||
146 | map->getObjects().push_back(data); | ||
147 | |||
148 | addingEntity = nullptr; | ||
149 | |||
150 | frame->FinishAddingEntity(); | ||
151 | |||
152 | Refresh(); | ||
153 | } | ||
154 | } | ||
100 | 155 | ||
101 | event.Skip(); | 156 | event.Skip(); |
102 | } | 157 | } |
103 | 158 | ||
104 | void MapeditWidget::OnMouseMove(wxMouseEvent& event) | 159 | void MapeditWidget::OnMouseMove(wxMouseEvent& event) |
105 | { | 160 | { |
106 | if (mouseIsDown) | 161 | mousePos = event.GetPosition(); |
162 | mouseIsIn = true; | ||
163 | |||
164 | if (editMode == EditTiles) | ||
107 | { | 165 | { |
108 | SetTile(event.GetPosition()); | 166 | if (mouseIsDown) |
167 | { | ||
168 | SetTile(event.GetPosition()); | ||
169 | } | ||
109 | } | 170 | } |
110 | 171 | ||
111 | mouseIsIn = true; | ||
112 | mousePos = event.GetPosition(); | ||
113 | Refresh(); | 172 | Refresh(); |
114 | } | 173 | } |
115 | 174 | ||
116 | void MapeditWidget::OnMouseUp(wxMouseEvent& event) | 175 | void MapeditWidget::OnMouseUp(wxMouseEvent&) |
117 | { | 176 | { |
118 | mouseIsDown = false; | 177 | mouseIsDown = false; |
119 | } | 178 | } |
120 | 179 | ||
121 | void MapeditWidget::OnMouseOut(wxMouseEvent& event) | 180 | void MapeditWidget::OnMouseOut(wxMouseEvent&) |
122 | { | 181 | { |
123 | mouseIsIn = false; | 182 | mouseIsIn = false; |
124 | 183 | ||
125 | Refresh(); | 184 | Refresh(); |
126 | } | 185 | } |
127 | 186 | ||
@@ -132,7 +191,10 @@ void MapeditWidget::ZoomIn() | |||
132 | 191 | ||
133 | void MapeditWidget::ZoomOut() | 192 | void MapeditWidget::ZoomOut() |
134 | { | 193 | { |
135 | SetZoomSize(scale-1); | 194 | if (scale > 1) |
195 | { | ||
196 | SetZoomSize(scale-1); | ||
197 | } | ||
136 | } | 198 | } |
137 | 199 | ||
138 | void MapeditWidget::SetZoomSize(int zoom) | 200 | void MapeditWidget::SetZoomSize(int zoom) |
@@ -141,5 +203,22 @@ void MapeditWidget::SetZoomSize(int zoom) | |||
141 | 203 | ||
142 | SetVirtualSize(MAP_WIDTH*TILE_WIDTH*scale, MAP_HEIGHT*TILE_HEIGHT*scale); | 204 | SetVirtualSize(MAP_WIDTH*TILE_WIDTH*scale, MAP_HEIGHT*TILE_HEIGHT*scale); |
143 | 205 | ||
144 | GetParent()->Refresh(); | 206 | Refresh(); |
207 | } | ||
208 | |||
209 | void MapeditWidget::SetEditMode(EditMode editMode) | ||
210 | { | ||
211 | this->editMode = editMode; | ||
212 | |||
213 | Refresh(); | ||
214 | } | ||
215 | |||
216 | void MapeditWidget::StartAddingEntity(MapObject* object) | ||
217 | { | ||
218 | addingEntity = object; | ||
219 | } | ||
220 | |||
221 | void MapeditWidget::CancelAddingEntity() | ||
222 | { | ||
223 | addingEntity = nullptr; | ||
145 | } | 224 | } |