bool level_execute(level_str* level_info, sf::RenderWindow* window) { auto resource = make_shared<ResourceManager>(); auto config = resource->get_json("conf.json"); auto style = sf::Style::Default; bool win = false; Ground ground(resource, level_info->name); Object people = {}; Object front_print = {}; Interactives interact(resource, level_info->name); int levelJump = 0; auto level = resource->get_json("levels/"+ level_info->name+".json"); View view = (sf::FloatRect((float)0, (float)(SCREEN_Y_PXSIZE - ((int)(*level)["background"]["world"]["y"]) * BLOCK_PXSIZE), (float)(((int)(*level)["background"]["world"]["x"]) * BLOCK_PXSIZE), (float)(((int)(*level)["background"]["world"]["y"]) * BLOCK_PXSIZE))); Background background(resource, level_info->name, sf::IntRect(0, 0, ((int)(*level)["background"]["world"]["x"]) * BLOCK_PXSIZE, ((int)(*level)["background"]["world"]["y"]) * BLOCK_PXSIZE)); auto font = resource->get_font(MATHLETE); auto song = resource->get_music(SONG_1); int ground_level = (*level)["ground"]["level"]; song->setLoop(true); Text text((string)"SuperTeacher", sf::Vector2f(-60, -25) + view.GetView().getCenter(), font); std::shared_ptr<sf::Text> timetext = make_shared<sf::Text>("Clock: " + to_string(Timer::get_time_ms()), *font, 100); text.Add_Text(timetext, sf::Vector2f(-1500, -25) + view.GetView().getCenter()); std::array<std::array<int, 18>, 32> ColisionDetect = {}; const int SOLID = 1; window->setMouseCursorVisible(false); window->setFramerateLimit(50); HIManager user_input = { window }; user_input.HIEvent_sig.connect([level_info,&view](HIEvent event)->void { static float factor = 1; switch (event) { case HIEvent::CLOSE: level_info->end = true; break; case HIEvent::DOWN_DOWN: if (factor <= 1.6) { factor += 0.3; } else { factor = 1; } view.SetSize(sf::Vector2f(factor*SCREEN_X_PXSIZE, factor*SCREEN_Y_PXSIZE)); break; default: break; } }); std::shared_ptr<sf::Text> score = make_shared<sf::Text>("Points: ", *font, 50); text.Add_Text(score, sf::Vector2f(-900, -25) + view.GetView().getCenter()); std::shared_ptr<sf::Text> live = make_shared<sf::Text>("Lives: ", *font, 50); text.Add_Text(live, sf::Vector2f(-60, -75) + view.GetView().getCenter()); for (int y = 17; y >= ground_level; y--) { for (int x = 0; x < 32; x++) { ColisionDetect[x][y] = SOLID; } } std::string gr_name = (*level)["ground"]["name"]; auto character = Character(resource, level_info->name, ground_level); character.addPencil((*level)["init"]["pencil"]); std::shared_ptr<sf::Text> pencil = make_shared<sf::Text>("Pencils: " + to_string(character.getNbPencil()), *font, 50); text.Add_Text(pencil, sf::Vector2f(-900, -75) + view.GetView().getCenter()); user_input.HIEvent_sig.connect([&character,&level_info](HIEvent event)->void { character.process_event(event,&level_info->score); }); if ((bool)(*config)["audio"]) { song->play(); } colision col = { true,true,ground_level*BLOCK_PXSIZE,0 }; while (!level_info->end) { *level_info = interact.update(character, score, ground_level*BLOCK_PXSIZE, &col,&level_info->score); if (level_info->end && level_info->live > 0) { win = true; } user_input.process(); character.write_collision(col); character.update(); window->clear(sf::Color::Blue); view.process(character.get_rectangle()); window->setView(view.GetView()); auto tmp_time = Timer::get_time_s(); timetext->setString("Time: " + to_string(tmp_time) + " sec"); pencil->setString("Pencils: " + to_string(character.getNbPencil())); live->setString("Lives: " + to_string(character.getLive())); text.update(view.GetView()); // Dessin for (auto n : background.get_drawables()) { window->draw(*n); } for (auto n : ground.get_drawables()) { window->draw(*n); } for (auto n : interact.get_drawables()) { window->draw(*n); } for (auto n : character.get_drawables()) { window->draw(*n); } for (auto n : front_print.get_drawables()) { window->draw(*n); } for (auto n : text.get_texts()) { window->draw(*n); } window->display(); window->clear(); } window->setMouseCursorVisible(true); user_input.HIEvent_sig.disconnect_all_slots(); return win; }