diff --git a/src/menu.c b/src/menu.c index 99d0260..1ccbeec 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1,5 +1,6 @@ #include "menu.h" #include +#include #include "renderer.h" #include "scaller.h" #include "scene.h" @@ -15,9 +16,10 @@ static bool increaseTextBrightness = false; static Uint8 textOpacity = 255; -Scene_t menuScene = { NULL, 0, 0, 0 }; +Scene_t menuScene = { NULL, 0, 0, 0, 0, 0 }; int menu_staticRender(void){ + MonitorSize_t size = renderer_getMonitorSize(); float aspectRatio = (float)size.width / size.height; @@ -35,17 +37,31 @@ int menu_staticRender(void){ backgroundImage.width = 1; backgroundImage.height = 1; menuObjects[menuObjectsSize] = scene_addRenderObject(&menuScene, backgroundImage, 0, 0); - renderer_setScene(&menuScene); ++menuObjectsSize; + + RenderObject_t legendOfAdam; + strcpy(legendOfAdam.name, "TheLegendOfA"); + SDL_Color white = {255, 255, 255, 255}; + text_renderText(&legendOfAdam, 9, 1.f, white, "./assets/fonts/Quinquefive.ttf", 48, "The legend of adame"); + menuObjects[menuObjectsSize] = scene_addRenderObject(&menuScene, legendOfAdam, CAMERA_WIDTH * 0.095f, CAMERA_HEIGHT * 0.2f); + ++menuObjectsSize; + + RenderObject_t shadowOfAdam; + strcpy(legendOfAdam.name, "shadowOfAdam"); + SDL_Color black = {0, 0, 0, 255}; + text_renderText(&legendOfAdam, 8, 1.f, black, "./assets/fonts/Quinquefive.ttf", 48, "The legend of adame"); + menuObjects[menuObjectsSize] = scene_addRenderObject(&menuScene, legendOfAdam, CAMERA_WIDTH * 0.085f, CAMERA_HEIGHT * 0.23f); + ++menuObjectsSize; + + renderer_setScene(&menuScene); return 0; } int menu_render(float delta){ - - for(unsigned i = 1; i < menuObjectsSize; ++i){ + for(unsigned i = 3; i < menuObjectsSize; ++i){ scene_removeRenderObject(&menuScene, menuObjects[i]); } - menuObjectsSize = 1; + menuObjectsSize = 3; blinkDelta += delta; @@ -77,6 +93,6 @@ int menu_render(float delta){ } void menu_remove(void){ - scene_free(&menuScene); + //scene_free(&menuScene); menuObjectsSize = 0; } diff --git a/src/renderer.c b/src/renderer.c index 3508bbe..2403559 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -17,7 +17,7 @@ bool running; MonitorSize_t monitorSize; SDL_Window* win; SDL_Renderer * renderer; -Scene_t * scene; +const Scene_t * scene; int scenesCount = 0; //int (*compar)(const void [.size], const void [.size], void *) @@ -26,7 +26,7 @@ void renderer_main(void(*game_setup)(void), void(*game_loop)(void)) { if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { printf("error initializing SDL: %s\n", SDL_GetError()); } - win = SDL_CreateWindow("GAME", // creates a window + win = SDL_CreateWindow("The legend of ADAM", // creates a window SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, 0); @@ -82,7 +82,7 @@ void renderer_main(void(*game_setup)(void), void(*game_loop)(void)) { } } -void renderer_setScene(Scene_t * newScene) { +void renderer_setScene(const Scene_t * newScene) { scene = newScene; } diff --git a/src/renderer.h b/src/renderer.h index f9f2221..dee0a9c 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -18,6 +18,6 @@ typedef struct MonitorSize { void renderer_main(void(*game_setup)(void), void(*game_loop)(void)); MonitorSize_t renderer_getMonitorSize(void); -void renderer_setScene(Scene_t * newScene); +void renderer_setScene(const Scene_t * newScene); #endif diff --git a/src/scene.c b/src/scene.c index 4d3ad60..3f32de0 100644 --- a/src/scene.c +++ b/src/scene.c @@ -4,29 +4,27 @@ #include #include #include +#include +#include static int compartSort(const SceneObject_t * a, const SceneObject_t * b) { return a->renderObj.z - b->renderObj.z; } -void scene_render(Scene_t * scene) { +void scene_render(const Scene_t * scene) { MonitorSize_t monitorSize = renderer_getMonitorSize(); int minScanX = scene->x - CAMERA_WIDTH; int minScanY = scene->y - CAMERA_HEIGHT; int maxScanX = scene->x + CAMERA_WIDTH; int maxScanY = scene->y + CAMERA_HEIGHT; - printf("camera: %d %d %d %d\n", minScanX, minScanY, maxScanX, maxScanY); - for(int i = 0; i < scene->objectCount; i++) { - SceneObject_t * object = &scene->objects[i]; + const SceneObject_t * object = &scene->objects[i]; if(object->x > minScanX && object->x < maxScanX && object->y > minScanY && object->y < maxScanY) { float x = (object->x) / CAMERA_WIDTH; float y = (object->y) / CAMERA_HEIGHT; //the object is to be rendered - printf("%f %f\n", x, y); - SDL_Rect rect = { round(x * monitorSize.width) , round(y * monitorSize.height), @@ -54,9 +52,16 @@ static void buildCache(SceneObject_t * object) { } RenderId_t scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x, int y) { - RenderId_t itemId = scene->objectCount++; - printf("Adding: %s\n", object.name); - scene->objects = realloc(scene->objects, scene->objectCount * sizeof(SceneObject_t)); + scene->objectCount++; + RenderId_t itemId = scene->lastId++; + + if(scene->objectCount * sizeof(SceneObject_t) > scene->objectArraySize) { + scene->objectArraySize = scene->objectCount * sizeof(SceneObject_t); + scene->objects = realloc(scene->objects, scene->objectArraySize); + if(scene->objects == NULL) { + printf("Realloc failed\n"); + } + } SceneObject_t item = { x, y, @@ -67,7 +72,8 @@ RenderId_t scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x, buildCache(&item); - scene->objects[itemId] = item; + scene->objects[scene->objectCount - 1] = item; + //the objects are sorted qsort(scene->objects, scene->objectCount, sizeof(SceneObject_t), (__compar_fn_t)compartSort); return itemId; @@ -75,18 +81,23 @@ RenderId_t scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x, void scene_removeRenderObject(Scene_t * scene, RenderId_t id) { bool found = false; - for(int i = 0; i < scene->objectCount - 1; i++) { - if(scene->objects[i].id == id) { - SDL_FreeSurface(scene->objects[i].renderObj.surface); - if(scene->objects[i].cache != NULL) { - SDL_DestroyTexture(scene->objects[i].cache); - } - } - if(found) { - scene->objects[i] = scene->objects[i + 1]; + int index = 0; + for(int i = 0; i < scene->objectCount; i++) { + if(scene->objects[i].id == id){ + found = true; + index = i; + break; } } + if(!found){ + printf("object %d not found\n", id); + return; + } scene->objectCount--; + + for(int i = index; i < scene->objectCount; i++) { + scene->objects[i] = scene->objects[i + 1]; + } } void scene_free(Scene_t * scene) { @@ -97,6 +108,7 @@ void scene_free(Scene_t * scene) { } } free(scene->objects); + scene->objectArraySize = 0; scene->objectCount = 0; scene->objects = NULL; } diff --git a/src/scene.h b/src/scene.h index 58264de..469cba0 100644 --- a/src/scene.h +++ b/src/scene.h @@ -26,10 +26,12 @@ typedef struct SceneObject { typedef struct Scene { SceneObject_t * objects; int objectCount; + unsigned long objectArraySize; + int lastId; int x,y; } Scene_t; -void scene_render(Scene_t * scene); +void scene_render(const Scene_t * scene); void scene_removeRenderObject(Scene_t * scene, RenderId_t id); RenderId_t scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x, int y); void scene_free(Scene_t * scene);