main.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include <furi.h>
  2. #include "engine.h"
  3. #include "game_engine.h"
  4. #include "director_i.h"
  5. #include "level_manager_i.h"
  6. #include "level_i.h"
  7. #include "entity_i.h"
  8. static void frame_cb(RunningGameEngine* engine, Canvas* canvas, InputState input, void* context) {
  9. Director* director = context;
  10. director_input_set(director, input);
  11. director_engine_set(director, engine);
  12. LevelManager* level_manager = director_level_manager_get(director);
  13. level_manager_update(level_manager, director);
  14. level_manager_render(level_manager, director, canvas);
  15. }
  16. int32_t game_app(void* p) {
  17. UNUSED(p);
  18. Director* director = director_alloc();
  19. LevelManager* level_manager = level_manager_alloc();
  20. director_level_manager_set(director, level_manager);
  21. void* game_context = NULL;
  22. if(game.context_size > 0) {
  23. game_context = malloc(game.context_size);
  24. director_game_context_set(director, game_context);
  25. }
  26. game.start(level_manager, NULL);
  27. GameEngineSettings settings = game_engine_settings_init();
  28. settings.fps = 60.0f;
  29. settings.show_fps = true;
  30. settings.always_backlight = true;
  31. settings.frame_callback = frame_cb;
  32. settings.context = director;
  33. GameEngine* engine = game_engine_alloc(settings);
  34. game_engine_run(engine);
  35. game_engine_free(engine);
  36. level_manager_free(level_manager);
  37. director_free(director);
  38. game.stop(game_context);
  39. if(game_context) {
  40. free(game_context);
  41. }
  42. int32_t entities = entities_get_count();
  43. if(entities != 0) {
  44. FURI_LOG_E("Game", "Memory leak detected: %ld entities still allocated", entities);
  45. return -1;
  46. }
  47. return 0;
  48. }