scene.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 Scene_load(Scene* self){
  41. int i;
  42. Object* object;
  43. Vector* objects = self->objects;
  44. for(i = 0; i < objects->count(objects); i++){
  45. object = objects->get(objects, i);
  46. object->scene = self;
  47. object->load(object);
  48. }
  49. }
  50. void free_Scene(struct Scene* self){
  51. Scene_log("Freeing scene");
  52. free(self->objects);
  53. free(self->sprites);
  54. free(self->name);
  55. free(self);
  56. current_scene = NULL;
  57. }
  58. Scene* new_Scene(const char* name){
  59. Scene* self = (Scene*)malloc(sizeof(Scene));
  60. if(current_scene != NULL){
  61. free_Scene(current_scene);
  62. }
  63. current_scene = self;
  64. self->name = name;
  65. Scene_log("Creating scene");
  66. self->objects = new_Vector(0, sizeof(Object), &free_Object);
  67. self->sprites = new_Vector(0, sizeof(Sprite), &free_Sprite);
  68. self->add_object = &Scene_add_object;
  69. self->add_sprite = &Scene_add_sprite;
  70. self->update = &Scene_update;
  71. self->draw = &Scene_draw;
  72. self->load = &Scene_load;
  73. return self;
  74. }
  75. Scene* current_Scene(){
  76. return current_scene;
  77. }