Plus jammais on en reparle

This commit is contained in:
Marc
2023-01-21 18:25:17 +01:00
parent 814d135ada
commit 1a0ef2e90a
5 changed files with 60 additions and 30 deletions
+22 -6
View File
@@ -1,5 +1,6 @@
#include "menu.h" #include "menu.h"
#include <SDL2/SDL_image.h> #include <SDL2/SDL_image.h>
#include <stdio.h>
#include "renderer.h" #include "renderer.h"
#include "scaller.h" #include "scaller.h"
#include "scene.h" #include "scene.h"
@@ -15,9 +16,10 @@ static bool increaseTextBrightness = false;
static Uint8 textOpacity = 255; static Uint8 textOpacity = 255;
Scene_t menuScene = { NULL, 0, 0, 0 }; Scene_t menuScene = { NULL, 0, 0, 0, 0, 0 };
int menu_staticRender(void){ int menu_staticRender(void){
MonitorSize_t size = renderer_getMonitorSize(); MonitorSize_t size = renderer_getMonitorSize();
float aspectRatio = (float)size.width / size.height; float aspectRatio = (float)size.width / size.height;
@@ -35,17 +37,31 @@ int menu_staticRender(void){
backgroundImage.width = 1; backgroundImage.width = 1;
backgroundImage.height = 1; backgroundImage.height = 1;
menuObjects[menuObjectsSize] = scene_addRenderObject(&menuScene, backgroundImage, 0, 0); menuObjects[menuObjectsSize] = scene_addRenderObject(&menuScene, backgroundImage, 0, 0);
renderer_setScene(&menuScene);
++menuObjectsSize; ++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; return 0;
} }
int menu_render(float delta){ int menu_render(float delta){
for(unsigned i = 3; i < menuObjectsSize; ++i){
for(unsigned i = 1; i < menuObjectsSize; ++i){
scene_removeRenderObject(&menuScene, menuObjects[i]); scene_removeRenderObject(&menuScene, menuObjects[i]);
} }
menuObjectsSize = 1; menuObjectsSize = 3;
blinkDelta += delta; blinkDelta += delta;
@@ -77,6 +93,6 @@ int menu_render(float delta){
} }
void menu_remove(void){ void menu_remove(void){
scene_free(&menuScene); //scene_free(&menuScene);
menuObjectsSize = 0; menuObjectsSize = 0;
} }
+3 -3
View File
@@ -17,7 +17,7 @@ bool running;
MonitorSize_t monitorSize; MonitorSize_t monitorSize;
SDL_Window* win; SDL_Window* win;
SDL_Renderer * renderer; SDL_Renderer * renderer;
Scene_t * scene; const Scene_t * scene;
int scenesCount = 0; int scenesCount = 0;
//int (*compar)(const void [.size], const void [.size], void *) //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) { if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
printf("error initializing SDL: %s\n", SDL_GetError()); 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,
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
1280, 720, 0); 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; scene = newScene;
} }
+1 -1
View File
@@ -18,6 +18,6 @@ typedef struct MonitorSize {
void renderer_main(void(*game_setup)(void), void(*game_loop)(void)); void renderer_main(void(*game_setup)(void), void(*game_loop)(void));
MonitorSize_t renderer_getMonitorSize(void); MonitorSize_t renderer_getMonitorSize(void);
void renderer_setScene(Scene_t * newScene); void renderer_setScene(const Scene_t * newScene);
#endif #endif
+31 -19
View File
@@ -4,29 +4,27 @@
#include <SDL2/SDL_image.h> #include <SDL2/SDL_image.h>
#include <SDL2/SDL_render.h> #include <SDL2/SDL_render.h>
#include <SDL2/SDL_surface.h> #include <SDL2/SDL_surface.h>
#include <stdio.h>
#include <string.h>
static int compartSort(const SceneObject_t * a, const SceneObject_t * b) { static int compartSort(const SceneObject_t * a, const SceneObject_t * b) {
return a->renderObj.z - b->renderObj.z; 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(); MonitorSize_t monitorSize = renderer_getMonitorSize();
int minScanX = scene->x - CAMERA_WIDTH; int minScanX = scene->x - CAMERA_WIDTH;
int minScanY = scene->y - CAMERA_HEIGHT; int minScanY = scene->y - CAMERA_HEIGHT;
int maxScanX = scene->x + CAMERA_WIDTH; int maxScanX = scene->x + CAMERA_WIDTH;
int maxScanY = scene->y + CAMERA_HEIGHT; 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++) { 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) { if(object->x > minScanX && object->x < maxScanX && object->y > minScanY && object->y < maxScanY) {
float x = (object->x) / CAMERA_WIDTH; float x = (object->x) / CAMERA_WIDTH;
float y = (object->y) / CAMERA_HEIGHT; float y = (object->y) / CAMERA_HEIGHT;
//the object is to be rendered //the object is to be rendered
printf("%f %f\n", x, y);
SDL_Rect rect = { SDL_Rect rect = {
round(x * monitorSize.width) , round(x * monitorSize.width) ,
round(y * monitorSize.height), 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 scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x, int y) {
RenderId_t itemId = scene->objectCount++; scene->objectCount++;
printf("Adding: %s\n", object.name); RenderId_t itemId = scene->lastId++;
scene->objects = realloc(scene->objects, scene->objectCount * sizeof(SceneObject_t));
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 = { SceneObject_t item = {
x, y, x, y,
@@ -67,7 +72,8 @@ RenderId_t scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x,
buildCache(&item); buildCache(&item);
scene->objects[itemId] = item; scene->objects[scene->objectCount - 1] = item;
//the objects are sorted //the objects are sorted
qsort(scene->objects, scene->objectCount, sizeof(SceneObject_t), (__compar_fn_t)compartSort); qsort(scene->objects, scene->objectCount, sizeof(SceneObject_t), (__compar_fn_t)compartSort);
return itemId; 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) { void scene_removeRenderObject(Scene_t * scene, RenderId_t id) {
bool found = false; bool found = false;
for(int i = 0; i < scene->objectCount - 1; i++) { int index = 0;
if(scene->objects[i].id == id) { for(int i = 0; i < scene->objectCount; i++) {
SDL_FreeSurface(scene->objects[i].renderObj.surface); if(scene->objects[i].id == id){
if(scene->objects[i].cache != NULL) { found = true;
SDL_DestroyTexture(scene->objects[i].cache); index = i;
} break;
}
if(found) {
scene->objects[i] = scene->objects[i + 1];
} }
} }
if(!found){
printf("object %d not found\n", id);
return;
}
scene->objectCount--; scene->objectCount--;
for(int i = index; i < scene->objectCount; i++) {
scene->objects[i] = scene->objects[i + 1];
}
} }
void scene_free(Scene_t * scene) { void scene_free(Scene_t * scene) {
@@ -97,6 +108,7 @@ void scene_free(Scene_t * scene) {
} }
} }
free(scene->objects); free(scene->objects);
scene->objectArraySize = 0;
scene->objectCount = 0; scene->objectCount = 0;
scene->objects = NULL; scene->objects = NULL;
} }
+3 -1
View File
@@ -26,10 +26,12 @@ typedef struct SceneObject {
typedef struct Scene { typedef struct Scene {
SceneObject_t * objects; SceneObject_t * objects;
int objectCount; int objectCount;
unsigned long objectArraySize;
int lastId;
int x,y; int x,y;
} Scene_t; } Scene_t;
void scene_render(Scene_t * scene); void scene_render(const Scene_t * scene);
void scene_removeRenderObject(Scene_t * scene, RenderId_t id); void scene_removeRenderObject(Scene_t * scene, RenderId_t id);
RenderId_t scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x, int y); RenderId_t scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x, int y);
void scene_free(Scene_t * scene); void scene_free(Scene_t * scene);