scene.c 2.2 KB

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