scene.c 2.1 KB

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