diff --git a/CMakeLists.txt b/CMakeLists.txt index a895660..7b8d30b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ set(SRC src/text.c src/menu.c src/input.c + src/scaller.c ) # add the executable diff --git a/src/main.c b/src/main.c index f62f087..101f4ce 100644 --- a/src/main.c +++ b/src/main.c @@ -8,7 +8,7 @@ #include #include #include - +#include "scaller.h" long timecode; long iter; @@ -29,10 +29,11 @@ static void game_main(void) { //main game code if(iter == 0) { + menu_render(); RenderObject_t text; SDL_Color white = {255, 255, 255, 255}; TTF_Init(); - if(text_renderText(&text, 0.f, 0.f, 1000, 1, white, "./assets/fonts/arial.ttf", 25, "Hello World") < 0){ + if(text_renderText(&text, 0.1f, 0.1f, 1000, 1, white, "./assets/fonts/arial.ttf", 25, "Hello World") < 0){ printf("error"); exit(1); } @@ -40,14 +41,16 @@ static void game_main(void) { SDL_Surface* img = IMG_Load("./assets/img/pp.png"); RenderObject_t duck = { - 0.2, - 0.2, + 0.5, + 0.5, 0, 0.50, 0.50, 0, img }; + scaller(duck.surface, 1, &duck.width, &duck.height); + placer(duck.surface, 1, &duck.x, &duck.y); renderer_renderObject(text); renderer_renderObject(duck); diff --git a/src/menu.c b/src/menu.c index 25b636f..3030882 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1,34 +1,30 @@ #include "menu.h" #include +#include "renderer.h" +#include "scaller.h" static RenderId_t menuObjects[10]; static unsigned menuObjectsSize = 0; -int menu_render(int windowWidth, int windowHeight){ +int menu_render(void){ SDL_Surface* buttonImageSurface = IMG_Load("./assets/img/start.png"); if(buttonImageSurface == NULL){ printf("cannot load"); return -1; } + RenderObject_t buttonImage; float buttonScale = 0.3f; - // float buttonX = ((float)windowWidth - (float)buttonImageSurface->w) / (2.f * (float)buttonImageSurface->w); - // float buttonY = ((float)windowHeight - (float)buttonImageSurface->h) / (2.f * (float)buttonImageSurface->h); - float buttonX = 0.5f - buttonScale * (float)buttonImageSurface->w / (2.f * (float)windowWidth); - float buttonY = 0.5f - buttonScale * (float)buttonImageSurface->h / (2.f * (float)windowHeight); - printf("buttonImageSurface->w: %d\n", buttonImageSurface->w); - printf("buttonImageSurface->h: %d\n", buttonImageSurface->h); - printf("windowWidth: %d\n", windowWidth); - printf("buttonX: %f\n", buttonX); - RenderObject_t buttonImage = { - buttonX, - buttonY, - 0, - buttonScale, - buttonScale, - 0, - buttonImageSurface - }; + MonitorSize_t size = renderer_getMonitorSize(); + float aspectRatio = (float)size.width / size.height; + + buttonImage.x = 0.5f; + buttonImage.y = 0.5f; + + scaller(buttonImageSurface, buttonScale, &buttonImage.width, &buttonImage.height); + placer(buttonImageSurface, buttonScale, &buttonImage.x, &buttonImage.y); + + buttonImage.surface = buttonImageSurface; menuObjects[menuObjectsSize] = renderer_renderObject(buttonImage); ++menuObjectsSize; return 0; @@ -40,4 +36,3 @@ void menu_remove(void){ } menuObjectsSize = 0; } - diff --git a/src/menu.h b/src/menu.h index 2ad8f30..c62fbc6 100644 --- a/src/menu.h +++ b/src/menu.h @@ -3,7 +3,7 @@ #include "renderer.h" -int menu_render(int windowWidth, int windowHeight); +int menu_render(void); void menu_remove(void); diff --git a/src/renderer.c b/src/renderer.c index caee589..c550f9d 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -46,7 +46,7 @@ void renderer_main(void(*game_main)(void)) { win = SDL_CreateWindow("GAME", // creates a window SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - 500, 500, 0); + 1280, 720, 0); Uint32 render_flags = SDL_RENDERER_ACCELERATED; @@ -95,17 +95,6 @@ void renderer_main(void(*game_main)(void)) { for(int i = 0; i < objectCount; i++) { RenderItem_t * object = &objects[i]; - if(object->cache == NULL) { - SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, object->object.surface); - if(texture == NULL) { - fprintf(stderr, "Error while creating texture %s is_null: %d\n", SDL_GetError(), object->object.surface == NULL); - exit(1); - } - SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); - object->cache = texture; - printf("Built cache\n"); - } - int error = SDL_RenderCopyEx(renderer, object->cache, NULL, &object->rect, object->object.angle_degre, NULL, SDL_FLIP_NONE); if(error != 0) { fprintf(stderr, "Render error in object %d with error %s\n", object->id, SDL_GetError()); @@ -117,6 +106,16 @@ void renderer_main(void(*game_main)(void)) { } } +static void buildCache(RenderItem_t * object) { + SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, object->object.surface); + if(texture == NULL) { + fprintf(stderr, "Error while creating texture %s is_null: %d\n", SDL_GetError(), object->object.surface == NULL); + exit(1); + } + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + object->cache = texture; +} + RenderId_t renderer_renderObject(RenderObject_t object) { RenderId_t itemId = objectCount++; @@ -134,6 +133,8 @@ RenderId_t renderer_renderObject(RenderObject_t object) { itemId }; + buildCache(&item); + objects[itemId] = item; //the objects are sorted qsort(objects, objectCount, sizeof(RenderItem_t), (__compar_fn_t)compartSort); diff --git a/src/scaller.c b/src/scaller.c new file mode 100644 index 0000000..9287392 --- /dev/null +++ b/src/scaller.c @@ -0,0 +1,15 @@ +#include "renderer.h" +#include +#include "scaller.h" + +void scaller(SDL_Surface * surface, float scale, float * width, float * height) { + MonitorSize_t size = renderer_getMonitorSize(); + *width = (float)surface->w / size.width * scale; + *height = (float)surface->h / size.height * scale; +} + +void placer(SDL_Surface * surface, float scale, float * x, float * y) { + MonitorSize_t size = renderer_getMonitorSize(); + *x = *x - scale * surface->w / (2.f * (float)size.width); + *y = *y - scale * surface->h / (2.f * (float)size.height); +} diff --git a/src/scaller.h b/src/scaller.h new file mode 100644 index 0000000..f77c9a9 --- /dev/null +++ b/src/scaller.h @@ -0,0 +1,9 @@ +#ifndef __SCALLER_H__ +#define __SCALLER_H__ + +#include + +void scaller(SDL_Surface * surface, float scale, float * width, float * height); +void placer(SDL_Surface * surface, float scale, float * x, float * y); + +#endif diff --git a/src/text.c b/src/text.c index 2e183a1..d4a84b7 100644 --- a/src/text.c +++ b/src/text.c @@ -1,6 +1,7 @@ #include #include #include "renderer.h" +#include "scaller.h" #include "text.h" #include @@ -72,10 +73,11 @@ int text_renderText(RenderObject_t* renderObject, float x, float y, int z, float renderObject->x = x; renderObject->y = y; renderObject->z = z; - renderObject->width = w * scale / 500; - renderObject->height = h * scale / 500; renderObject->angle_degre = 0; renderObject->surface = surface; + scaller(surface, scale, &renderObject->width, &renderObject->height); + placer(renderObject->surface, scale, &renderObject->x, &renderObject->y); + return 0; }