@@ -34,7 +34,7 @@ int main(int argc, char* argv[])
34
34
return EXIT_FAILURE;
35
35
}
36
36
// Initialize window
37
- SDL_Window* win = SDL_CreateWindow (" Alchemy++ alpha v0.2 " , 64 , 64 , 800 , 600 , SDL_WINDOW_SHOWN|SDL_WINDOW_RESIZABLE);
37
+ SDL_Window* win = SDL_CreateWindow (" Alchemy++ alpha v0.3 " , 64 , 64 , 800 , 600 , SDL_WINDOW_SHOWN|SDL_WINDOW_RESIZABLE);
38
38
if (win == NULL ) {
39
39
fprintf (stderr, " SDL_CreateWindow Error: %s\n " , SDL_GetError ());
40
40
return EXIT_FAILURE;
@@ -79,8 +79,6 @@ int main(int argc, char* argv[])
79
79
FC_Font* font = FC_CreateFont ();
80
80
FC_LoadFont (font, ren, " gamedata/default/font/Open-Sans.ttf" , 12 , FC_MakeColor (255 ,255 ,255 ,255 ), TTF_STYLE_NORMAL);
81
81
82
- // FC_LoadFontFromTTF(font, ren, ttfFont, FC_MakeColor(255,255,255,255));
83
-
84
82
elem::JSONInit (); // Initialize JSON
85
83
Text::loadAll (" en-us" ); // Load game text
86
84
@@ -103,14 +101,14 @@ int main(int argc, char* argv[])
103
101
104
102
auto endTick = Clock::now ();
105
103
double deltaTime = 1.0 /60 ;
104
+ // Game flags
105
+ bool deleteNeeded = false ; // Used to determine if any elements need to be deleted
106
106
bool zSortNeeded = false ; // Used to indicate if elements need to be sorted
107
107
bool quit = false ; // Main loop exit flag
108
108
while (!quit) {
109
109
SDL_GetWindowSize (win, &winWidth, &winHeight); // Get screen size
110
110
auto startTick = Clock::now ();
111
111
112
- // deltaTime = endTick-startTick;
113
-
114
112
SDL_Event e;
115
113
ImGui_ImplSDL2_ProcessEvent (&e);
116
114
while (SDL_PollEvent (&e)) {
@@ -136,40 +134,58 @@ int main(int argc, char* argv[])
136
134
selectedElem = NULL ; // Release selected rectangle when left is released
137
135
zSortNeeded = true ; // Re-sort Z-index after element was dropped
138
136
}
137
+ // Remove if right clicked
139
138
if (rightClickDown && e.button .button == SDL_BUTTON_RIGHT) {
140
139
rightClickDown = false ;
140
+ if (selectedElem != NULL ) {
141
+ selectedElem->anim = ANIM_SHRINK;
142
+ anim::animInProgress = true ;
143
+ selectedElem = nullptr ;
144
+ }
141
145
}
142
146
break ;
143
147
case SDL_MOUSEBUTTONDOWN:
148
+ // Get element clicked regardless of mouse button
149
+ std::vector<DraggableElement*> clickMatches; // Every element that the cursor clicked on
150
+ if (selectedElem == NULL ) {
151
+ for (auto &d : draggables) {
152
+ if (SDL_PointInRect (&mousePos, d->box )) {
153
+ clickMatches.push_back (d.get ());
154
+ }
155
+ }
156
+ if (!clickMatches.empty ()) {
157
+ zSortNeeded = true ; // Z-index will need to be resorted as this element will be moved to the front
158
+ std::stable_sort (clickMatches.begin (), clickMatches.end (), [](DraggableElement* d1, DraggableElement* d2) {
159
+ return d1->z > d2->z ;
160
+ });
161
+
162
+ selectedElem = clickMatches.back (); // Select rectangle with highest Z-index
163
+ selectedElem->z = 0 ; // Move to front of z-index
164
+ }
165
+ }
144
166
if (!leftClickDown && e.button .button == SDL_BUTTON_LEFT) {
145
167
leftClickDown = true ;
146
-
147
- std::vector<DraggableElement*> clickMatches; // Every element that the mouse clicked on
148
168
if (selectedElem == NULL ) {
149
- for (auto &d : draggables) {
150
- if (SDL_PointInRect (&mousePos, d->box )) {
151
- clickMatches.push_back (d.get ());
152
- }
153
- }
154
169
if (!clickMatches.empty ()) {
155
- zSortNeeded = true ; // Z-index will need to be resorted as this element will be moved to the front
156
- std::stable_sort (clickMatches.begin (), clickMatches.end (), compareZIndexRaw); // Sort matching elements by Z-index, with the highest coming last
157
-
158
- selectedElem = clickMatches.back (); // Select rectangle with highest Z-index
159
- selectedElem->z = 0 ; // Move to front of z-index
160
170
clickOffset.x = mousePos.x - selectedElem->box ->x ;
161
171
clickOffset.y = mousePos.y - selectedElem->box ->y ; // Get clicked point in element box relative to its boundary
162
172
}
163
173
} else {
164
174
clickOffset.x = mousePos.x - selectedElem->box ->x ;
165
175
clickOffset.y = mousePos.y - selectedElem->box ->y ; // Don't look for a new element to select if one is already selected
166
176
}
167
- // Spawn new elements on double click
168
- if (SDL_GetTicks64 () > leftClickTick && SDL_GetTicks64 () <= leftClickTick + 250 ) { // Double clicks have to be within 3/8 second of each other
169
- elem::spawnDraggable (draggables, mousePos.x , mousePos.y +32 , " air" );
170
- elem::spawnDraggable (draggables, mousePos.x , mousePos.y -32 , " earth" );
171
- elem::spawnDraggable (draggables, mousePos.x -32 , mousePos.y , " fire" );
172
- elem::spawnDraggable (draggables, mousePos.x +32 , mousePos.y , " water" );
177
+ // Spawn new elements on double click
178
+ if (SDL_GetTicks64 () > leftClickTick && SDL_GetTicks64 () <= leftClickTick + 250 ) { // Double clicks have to be within 1/4 second of each other
179
+ if (selectedElem == NULL ) {
180
+ elem::spawnDraggable (draggables, mousePos.x , mousePos.y +40 , " air" );
181
+ elem::spawnDraggable (draggables, mousePos.x , mousePos.y -40 , " earth" );
182
+ elem::spawnDraggable (draggables, mousePos.x -40 , mousePos.y , " fire" );
183
+ elem::spawnDraggable (draggables, mousePos.x +40 , mousePos.y , " water" );
184
+ } else {
185
+ int hSpawnOffset = ((selectedElem->box ->x + selectedElem->box ->w /2 ) > mousePos.x ) ? -40 : 40 ;
186
+ int vSpawnOffset = ((selectedElem->box ->y + selectedElem->box ->h /2 ) > mousePos.y ) ? -40 : 40 ; // Duplocate the element to the corner it was clicked
187
+ elem::spawnDraggable (draggables, selectedElem->box ->x +hSpawnOffset, selectedElem->box ->y +vSpawnOffset, selectedElem->id ); // Duplicate element if it's double clicked
188
+ }
173
189
}
174
190
leftClickTick = SDL_GetTicks64 (); // Get next click tick
175
191
}
@@ -182,7 +198,8 @@ int main(int argc, char* argv[])
182
198
}
183
199
// Sort draggable elements by z index when animations finish
184
200
if (zSortNeeded && !anim::animInProgress) {
185
- std::stable_sort (draggables.begin (), draggables.end (), [](const std::unique_ptr<DraggableElement> &d1, const std::unique_ptr<DraggableElement> &d2) {
201
+ std::stable_sort (draggables.begin (), draggables.end (), []
202
+ (const std::unique_ptr<DraggableElement> &d1, const std::unique_ptr<DraggableElement> &d2) {
186
203
return d1->z > d2->z ;
187
204
});
188
205
zSortNeeded = false ;
@@ -194,21 +211,23 @@ int main(int argc, char* argv[])
194
211
if (d->anim == ANIM_SHRINK) {
195
212
anim::animateShrink (d.get (), deltaTime);
196
213
animDone = true ;
214
+ } else if (d->anim == ANIM_SHRINK_END) {
215
+ d->queuedForDeletion = true ; // Queue element for deletion when it finishes shrinking
216
+ deleteNeeded = true ; // Remove elements when they finish shrinking
217
+ animDone = true ;
197
218
} else if (d->anim == ANIM_GROW) {
198
219
anim::animateGrow (d.get (), deltaTime);
199
220
animDone = true ;
200
221
}
201
222
anim::animInProgress = animDone; // Stop animations if none are running
202
223
}
203
- // Remove combined elements when they finish shrinking
204
- if (elem::firstParentElem != NULL && elem::secondParentElem != NULL && elem::firstParentElem->anim == ANIM_SHRINK_END && elem::secondParentElem->anim == ANIM_SHRINK_END) {
205
- // elem::firstParentElem->queuedForDeletion = true;
206
- // elem::secondParentElem->queuedForDeletion = true;
207
- DraggableElement::deleteElem (draggables, elem::firstParentElem);
208
- DraggableElement::deleteElem (draggables, elem::secondParentElem); // Delete combo elements when they finish shrinking
209
- elem::firstParentElem = NULL ;
210
- elem::secondParentElem = NULL ;
211
- }
224
+ }
225
+ // Remove elements that are queued for deletion if needed
226
+ if (deleteNeeded) {
227
+ draggables.erase (std::remove_if (draggables.begin (), draggables.end (), []
228
+ (const std::unique_ptr<DraggableElement> &d) { return d->queuedForDeletion ; }
229
+ ), draggables.end ());
230
+ deleteNeeded = false ;
212
231
}
213
232
214
233
// Load draggable element textures
@@ -227,7 +246,7 @@ int main(int argc, char* argv[])
227
246
SDL_RenderCopy (ren, addBtn, NULL , &r); // Render add button
228
247
229
248
// Render text
230
- FC_Draw (font, ren, 0 , 0 , " Alchemy++ alpha v0.2 " );
249
+ FC_Draw (font, ren, 0 , 0 , " Alchemy++ alpha v0.3 " );
231
250
232
251
FC_Draw (font, ren, 20 , winHeight-20 , " elems: %d" , draggables.size ());
233
252
0 commit comments