From c94b984cd4496b53459ef5c4c6d2fdc80904a956 Mon Sep 17 00:00:00 2001 From: renatbabacaev Date: Tue, 20 Dec 2022 18:10:34 +0200 Subject: [PATCH 1/4] Code restructure --- main.c | 4 +++ render.c | 81 +++++++++++++++++++++++++++----------------------------- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/main.c b/main.c index 9e5b714..a209145 100644 --- a/main.c +++ b/main.c @@ -16,6 +16,10 @@ int main() fscanf(level, "%i %i", &x, &y); fscanf(level, "%i %i", &x_player, &y_player); fscanf(level, "%u", &camfov); + + // Normalize + y_player = y - y_player; + if(x <= 0 || y <= 0) { fclose(level); diff --git a/render.c b/render.c index 35387d6..d02ea55 100644 --- a/render.c +++ b/render.c @@ -25,17 +25,20 @@ Maybe will make output as colored dots only // Maybe give an input value +// General variables extern int x, y; extern int x_player, y_player; extern unsigned int camfov; -void print(int up, int down, int left, int right, char a[y][x]) +int up, down, left, right; + +void print(char a[y][x]) { int i, j; - for(j = up; j <= down; j++) + for(j = up; j < down; j++) { - for(i = left; i <= right; i++) + for(i = left; i < right; i++) { //Render part switch (a[j][i]) @@ -66,20 +69,16 @@ void print(int up, int down, int left, int right, char a[y][x]) void camera(char a[y][x]) { - // If world is smaller than camera fov - if(x <= camfov - 1 || y <= camfov - 1) - { - // + 1 in order to set correct matrix size - print(0, y - 1, 0, x - 1, a); - return; - } - // Math coordonates to array index - x_player--; - // ypos--; + // x_player--; + // y_player--; - int up_bound, down_bound; - int left_bound, right_bound; + // Y bounds + up = y_player - (camfov/2); + down = y_player + (camfov/2) + 1; + // X bounds + left = x_player - (camfov/2) - 1; + right = x_player + (camfov/2); /* If camera FOV is positive (10x10 screen) @@ -89,46 +88,44 @@ void camera(char a[y][x]) to move, move camera if they leave the middle 2x2 zone (center). */ - - - // Y bounds - up_bound = y_player - (camfov/2); - down_bound = y_player + (camfov/2); - // X bounds - left_bound = x_player - (camfov/2); - right_bound = x_player + (camfov/2); - if(camfov % 2 == 0) { - up_bound++; - left_bound++; + up++; + left++; } - // Back to bounds math: Negative shift - if(up_bound < 0) + // Up and Down camera bounds + if(up < 0) { - down_bound = camfov - 1; - up_bound = 0; + down = camfov; + up = 0; } - if(left_bound < 0) + else if(down >= y) { - right_bound = camfov - 1; - left_bound = 0; + up = y - camfov; + down = y; } - - // Positive shift - if(down_bound >= y) + // Left and Right camera bounds + if(left < 0) { - up_bound = y - camfov + 1; - down_bound = y; + right = camfov; + left = 0; } - if(right_bound >= x) + else if(right >= x) { - left_bound = x - camfov; - right_bound = x; + left = x - camfov; + right = x; } - print(up_bound, down_bound, left_bound, right_bound, a); + + // If camera FOV is bigger than world + if(x <= camfov - 1 || y <= camfov - 1) + { + print(a); + return; + } + + print(a); return; } \ No newline at end of file From 596f9ab153a100e79cb7fd4f97b92ecab64d86de Mon Sep 17 00:00:00 2001 From: renatbabacaev Date: Tue, 20 Dec 2022 18:53:14 +0200 Subject: [PATCH 2/4] Further variable math fixes --- main.c | 3 ++- render.c | 43 +++++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/main.c b/main.c index a209145..e78a444 100644 --- a/main.c +++ b/main.c @@ -19,6 +19,7 @@ int main() // Normalize y_player = y - y_player; + x_player = x_player - 1; if(x <= 0 || y <= 0) { @@ -26,7 +27,7 @@ int main() printf("\nInvalid world dimensions."); return 0; } - if(x_player > x || (y - y_player) > y || x_player <= 0 || (y - y_player) <= 0) + if(x_player > x || y_player > y || x_player < 0 || y_player < 0) { fclose(level); printf("\nOut of bounds position."); diff --git a/render.c b/render.c index d02ea55..cefbcdf 100644 --- a/render.c +++ b/render.c @@ -36,9 +36,9 @@ void print(char a[y][x]) { int i, j; - for(j = up; j < down; j++) + for(j = up; j <= down; j++) { - for(i = left; i < right; i++) + for(i = left; i <= right; i++) { //Render part switch (a[j][i]) @@ -75,25 +75,11 @@ void camera(char a[y][x]) // Y bounds up = y_player - (camfov/2); - down = y_player + (camfov/2) + 1; + down = y_player + (camfov/2); // X bounds - left = x_player - (camfov/2) - 1; + left = x_player - (camfov/2); right = x_player + (camfov/2); - /* - If camera FOV is positive (10x10 screen) - then place coordonates in top-left pixel. - - In the future, if the player will be able - to move, move camera if they leave the - middle 2x2 zone (center). - */ - if(camfov % 2 == 0) - { - up++; - left++; - } - // Up and Down camera bounds if(up < 0) { @@ -117,13 +103,30 @@ void camera(char a[y][x]) right = x; } - // If camera FOV is bigger than world - if(x <= camfov - 1 || y <= camfov - 1) + if(x <= camfov || y <= camfov) { + right = x - 1; + down = y - 1; print(a); return; } + + /* + If camera FOV is positive (10x10 screen) + then place coordonates in top-left pixel. + + In the future, if the player will be able + to move, move camera if they leave the + middle 2x2 zone (center). + */ + if(camfov % 2 == 0) + { + up++; + left++; + } + + print(a); From c6f907e36372e5384f9066beb9c370e85fe532e0 Mon Sep 17 00:00:00 2001 From: renatbabacaev Date: Tue, 20 Dec 2022 20:06:43 +0200 Subject: [PATCH 3/4] Make list of colors --- render.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/render.c b/render.c index cefbcdf..1786874 100644 --- a/render.c +++ b/render.c @@ -14,6 +14,8 @@ #define CYAN "\x1b[46m" #define RESET "\x1b[0m" +char *color[] = { BLACK, WHITE, RED, GREEN, YELLOW, BROWN, PINK }; + /* . - green color , - yellow color @@ -34,7 +36,7 @@ int up, down, left, right; void print(char a[y][x]) { - int i, j; + int i, j, colori; for(j = up; j <= down; j++) { @@ -44,22 +46,25 @@ void print(char a[y][x]) switch (a[j][i]) { case '.': - printf(GREEN " " RESET); + colori = 3; break; case ',': - printf(YELLOW " " RESET); + colori = 4; break; case '#': - printf(BROWN " " RESET); + colori = 5; break; case '@': - printf(PINK " " RESET); + colori = 6; break; default: - printf(BLACK " " RESET); + colori = 0; break; } + + printf(color[colori]); + printf(" " RESET); } printf("\n"); } From 999fb40f291a91a28b671cf6cb0696c74c706611 Mon Sep 17 00:00:00 2001 From: renatbabacaev Date: Tue, 20 Dec 2022 20:07:41 +0200 Subject: [PATCH 4/4] Add optimized and debug builds for native, x64, x32 --- makefile | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/makefile b/makefile index 7c26c92..4119760 100644 --- a/makefile +++ b/makefile @@ -1,2 +1,16 @@ game: main.c render.c - gcc -o game -g main.c render.c \ No newline at end of file + gcc -o game -O2 main.c render.c +gameDEBUG: main.c render.c + gcc -o gameDEBUG -g main.c render.c + +gameX64: main.c render.c + gcc -m64 -o gameX64 -O2 main.c render.c +gameX64DEBUG: main.c render.c + gcc -m64 -o gameX64DEBUG -g main.c render.c + +gameX32: main.c render.c + gcc -m32 -o gameX32 -O2 main.c render.c +gameX32DEBUG: main.c render.c + gcc -m32 -o gameX32DEBUG -g main.c render.c + +all: gameX64 gameX64DEBUG game gameDEBUG