scene.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "../main.h"
  2. #include "scene.h"
  3. #include <debug.h>
  4. #include <keypadc.h>
  5. #define Scene_log(msg) dbg_sprintf(dbgout, "[Scene %s] %s\n", self->name, msg)
  6. Scene* current_scene = NULL;
  7. bool Scene_add_object(Scene* self, Object* object){
  8. return self->objects->consume(self->objects, object);
  9. }
  10. bool Scene_add_sprite(Scene* self, Sprite* sprite){
  11. return self->sprites->consume(self->sprites, sprite);
  12. }
  13. void Scene_update(Scene* self){
  14. int i;
  15. Object* object;
  16. Vector* objects = self->objects;
  17. #ifdef LOG_UPDATE
  18. Scene_log("Updating scene");
  19. #endif
  20. kb_Scan();
  21. for(i = 0; i < objects->count(objects); i++){
  22. object = objects->get(objects, i);
  23. object->update(object);
  24. }
  25. }
  26. void Scene_draw(Scene* self){
  27. int i;
  28. Object* object;
  29. Vector* objects = self->objects;
  30. #ifdef LOG_DRAW
  31. Scene_log("Drawing scene");
  32. #endif
  33. gfx_FillScreen(0);
  34. for(i = 0; i < objects->count(objects); i++){
  35. object = objects->get(objects, i);
  36. object->draw(object);
  37. }
  38. gfx_BlitBuffer();
  39. }
  40. void free_Scene(struct Scene* self){
  41. Scene_log("Freeing scene");
  42. free(self->objects);
  43. free(self->sprites);
  44. free(self->name);
  45. free(self);
  46. current_scene = NULL;
  47. }
  48. Scene* new_Scene(const char* name){
  49. Scene* self = (Scene*)malloc(sizeof(Scene));
  50. if(current_scene != NULL){
  51. free_Scene(current_scene);
  52. }
  53. current_scene = self;
  54. self->name = name;
  55. Scene_log("Creating scene");
  56. self->objects = new_Vector(0, sizeof(Object), &free_Object);
  57. self->sprites = new_Vector(0, sizeof(Sprite), &free_Sprite);
  58. self->add_object = &Scene_add_object;
  59. self->add_sprite = &Scene_add_sprite;
  60. self->update = &Scene_update;
  61. self->draw = &Scene_draw;
  62. return self;
  63. }
  64. Scene* current_Scene(){
  65. return current_scene;
  66. }