@@ -148,7 +148,7 @@ void Level::setLevel(int levelNumber)
148148 backgroundPath = " assets/textures/stage3.png" ;
149149 topEdgeCollision = 210 ;
150150 enemyInfos = {
151- {Enemy::Type::Cerberus, {510 ,250 }},
151+ {Enemy::Type::Cerberus, {530 ,250 }},
152152 {Enemy::Type::Cerberus, {900 ,250 }},
153153 {Enemy::Type::Cerberus, {910 ,240 }},
154154 {Enemy::Type::Golem, {1310 ,240 }},
@@ -185,6 +185,9 @@ void Level::update(float deltaTime)
185185 updateEnemies (deltaTime);
186186 doPlaying (deltaTime);
187187 break ;
188+ case GameState::Paused:
189+ doPaused (deltaTime);
190+ break ;
188191 case GameState::GameOver:
189192 updateEnemies (deltaTime);
190193 doGameOver ();
@@ -219,11 +222,11 @@ void Level::draw(Image& image)
219222 case GameState::Playing:
220223 background.draw (image, camera);
221224
222- // sorting order of drawing player/enemy based on their Y position
223- // Solution using std::sort and lambda fn. suggested by Jeremiah
225+ // Sorting order of drawing player/enemy based on their Y position
226+ // Solution using std::sort and lambda fn. suggested by Jeremiah van Oosten (@jpvanoosten)
224227 // ** ranges algorithm suggested by resharper over the normal std::sort
225228 std::ranges::sort (entities, [](const Entity* a, const Entity* b) {return a->getPosition ().y < b->getPosition ().y ; });
226- for (const auto entity : entities)
229+ for (auto entity : entities)
227230 {
228231 entity->draw (image, camera);
229232 }
@@ -239,6 +242,24 @@ void Level::draw(Image& image)
239242 image.drawSprite (coinUiAnim, glm::vec2{SCREEN_WIDTH - 150 .f , 1 .f });
240243 image.drawText (Font::Default, std::to_string (player.getCoins ()), glm::vec2{ SCREEN_WIDTH - 115 .f , 5 .f }, Color::Yellow);
241244 break ;
245+ case GameState::Paused:
246+ background.draw (image, camera);
247+ player.draw (image, camera);
248+ for (auto & enemy : enemies)
249+ {
250+ enemy->draw (image, camera);
251+ }
252+ image.drawSprite (coinUiAnim, glm::vec2{ SCREEN_WIDTH - 150 .f , 1 .f });
253+ image.drawText (Font::Default, std::to_string (player.getCoins ()), glm::vec2{ SCREEN_WIDTH - 115 .f , 5 .f }, Color::Yellow);
254+
255+ image.drawText (tafelSans, " Game is Paused, press P to unpause" , glm::vec2{ SCREEN_WIDTH / 2 - 110 , SCREEN_HEIGHT / 2.3 - 1 .5f }, Color::Black);
256+ image.drawText (tafelSans, " Game is Paused, press P to unpause" , glm::vec2{ SCREEN_WIDTH / 2 - 110 , SCREEN_HEIGHT / 2.3 + 3 .5f }, Color::Black);
257+ image.drawText (tafelSans, " Game is Paused, press P to unpause" , glm::vec2{ SCREEN_WIDTH / 2 - 110 , SCREEN_HEIGHT / 2.3 }, Color::Yellow);
258+
259+ image.drawText (tafelSans, " Press Q to go back to main menu" , glm::vec2{ SCREEN_WIDTH / 2 - 110 , SCREEN_HEIGHT / 2 - 1 .5f }, Color::Black);
260+ image.drawText (tafelSans, " Press Q to go back to main menu" , glm::vec2{ SCREEN_WIDTH / 2 - 110 , SCREEN_HEIGHT / 2 + 3 .5f }, Color::Black);
261+ image.drawText (tafelSans, " Press Q to go back to main menu" , glm::vec2{ SCREEN_WIDTH / 2 - 110 , SCREEN_HEIGHT / 2 }, Color::Yellow);
262+ break ;
242263 case GameState::GameOver:
243264 background.draw (image, camera);
244265 for (auto & enemy : enemies)
@@ -259,7 +280,7 @@ void Level::draw(Image& image)
259280 std::string winText2 = " Press Enter to go back" ;
260281 if (currentLevel < 3 )
261282 {
262- winText = " Congrats on clearing level " + std::to_string (currentLevel) /* + ", press Enter to go to level " + std::to_string(currentLevel + 1) */ ;
283+ winText = " Congrats on clearing level " + std::to_string (currentLevel);
263284 winText2 = " Press Enter to go to next level" ;
264285 }
265286 image.drawText (tafelSans, winText, glm::vec2{ SCREEN_WIDTH / 2 - 120 , SCREEN_HEIGHT / 2 + 3 .5f }, Color::Black);
@@ -278,12 +299,15 @@ void Level::setState(GameState newState)
278299{
279300 if (newState != gameState)
280301 {
281- beginState (newState);
282- endState (gameState);
302+ beginState (newState, gameState );
303+ endState (gameState, newState );
283304 gameState = newState;
284305 }
285306}
286307
308+ // Got help to implement processEvents(),onMouseMoved(), onResized() from~
309+ // Source: https://github.com/jpvanoosten/SoftwareRasterizer/blob/main/samples/07-PixelAdventure/src/Game.cpp
310+
287311void Level::processEvents (const Event& e)
288312{
289313 // Copy the event so you can modify it.
@@ -358,17 +382,17 @@ void Level::onResized(ResizeEventArgs& args)
358382
359383 // Update any UI elements or positions that depend on the game rectangle.
360384
361- playButton.setTransform (Transform2D{ { 120 , 170 }/* ,{0.8f,0.8f} */ });
362- helpButton.setTransform (Transform2D{ { 220 , 170 }/* ,{0.8f,0.8f} */ });
363- quitButton.setTransform (Transform2D{ { 320 , 170 }/* ,{0.8f,0.8f} */ });
385+ playButton.setTransform (Transform2D{ { 120 , 170 } });
386+ helpButton.setTransform (Transform2D{ { 220 , 170 } });
387+ quitButton.setTransform (Transform2D{ { 320 , 170 } });
364388 for (int i = 0 ; i < 3 ; ++i)
365389 {
366- levelButtons[i].setTransform (Transform2D{ { 230 + i * 35 , 215 }/* ,{0.8f,0.8f} */ });
390+ levelButtons[i].setTransform (Transform2D{ { 230 + i * 35 , 215 } });
367391 }
368- backButton.setTransform (Transform2D{ { 285 , 1 },{0 .7f ,0 .7f } });
392+ backButton.setTransform (Transform2D{ { 375 , 220 },{0 .7f ,0 .7f } });
369393}
370394
371- void Level::beginState (GameState newState)
395+ void Level::beginState (GameState newState, GameState oldState )
372396{
373397 switch (newState)
374398 {
@@ -381,7 +405,7 @@ void Level::beginState(GameState newState)
381405 player.setCoins (0 );
382406 break ;
383407 case GameState::Playing:
384- if (!isFirstLoad)
408+ if (!isFirstLoad && oldState != GameState::Paused )
385409 {
386410 loadLevelAssets ();
387411 camera.setPosition (glm::vec2{ 0 ,0 });
@@ -396,15 +420,17 @@ void Level::beginState(GameState newState)
396420 }
397421}
398422
399- void Level::endState (GameState oldState)
423+ void Level::endState (GameState oldState,GameState newState )
400424{
401425 switch (oldState)
402426 {
403427 case GameState::Menu:
404428 break ;
405429 case GameState::Playing:
406- entities.clear ();
407- // enemies.clear();
430+ if (newState != GameState::Paused)
431+ {
432+ entities.clear ();
433+ }
408434 break ;
409435 case GameState::GameOver:
410436 enemies.clear ();
@@ -607,13 +633,28 @@ void Level::doPlaying(float deltaTime)
607633 ++iter;
608634 }
609635 }
636+ if (Input::getKeyDown (KeyCode::P))
637+ {
638+ setState (GameState::Paused);
639+ }
610640
611641 if (enemies.empty ())
612642 {
613643 setState (GameState::Win);
614644 }
615645}
616646
647+ void Level::doPaused (float deltaTime)
648+ {
649+ // Any logic that needs to happen when the game is paused
650+ if (Input::getKeyDown (KeyCode::P))
651+ setState (GameState::Playing);
652+
653+ if (Input::getKeyDown (KeyCode::Q))
654+ setState (GameState::Menu);
655+
656+ }
657+
617658void Level::doGameOver ()
618659{
619660 // Any logic that needs to happen when the game is over
0 commit comments