← Back to ratslair.com
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorr4tss <[email protected]>2023-07-04 02:19:44 +0200
committerr4tss <[email protected]>2023-07-04 02:19:44 +0200
commit8451cf8ea92d4f21cfe82254902fcd8b74c5aed2 (patch)
tree8502076cbd72553379a24d01d3cdd0d837439090
parent29727894d3eded998a6a1a5140dd9b5329cdfccf (diff)
Added functionality to the map maker
-rw-r--r--main.c120
-rw-r--r--maker.c52
2 files changed, 124 insertions, 48 deletions
diff --git a/main.c b/main.c
index 767108a..43d0344 100644
--- a/main.c
+++ b/main.c
@@ -1,7 +1,12 @@
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
#include <stdbool.h>
+#include <stdio.h>
#include <math.h>
+
+#define WINDOW_WIDTH 1920
+#define WINDOW_HEIGHT 1088
+
// TODO FIRSST get rendering and movement around map working. DONE DONE DONE
// Improving movement with strafing.
@@ -37,6 +42,44 @@ struct Ray
int type;
};
+void printText(SDL_Renderer *renderer, TTF_Font *font, char *str, int x, int y, int h, int r, int g, int b)
+ {
+ SDL_Color c = {r, g, b, 255};
+
+ SDL_Surface *s = TTF_RenderText_Solid(font, str, c);
+ SDL_Texture *t = SDL_CreateTextureFromSurface(renderer, s);
+
+ SDL_Rect rect = {x, y, strlen(str) * (h / 2), h};
+
+ SDL_RenderCopy(renderer, t, NULL, &rect);
+ }
+
+void loadMap(char *file, int map_w, int map_h, struct Tile map[map_w][map_h])
+{
+ FILE *f;
+ char mapString[64];
+ f = fopen(file, "r");
+
+ fgets(mapString, 64, f);
+
+ int ch = getc(f), x = 0, y = 0;
+ while(ch != EOF)
+ {
+ printf("%c", ch);
+ if(ch == '\n')
+ {
+ y++;
+ x = 0;
+ }
+ else
+ {
+ map[x][y].type = ch - '0';
+ x++;
+ }
+ ch = getc(f);
+ }
+}
+
float shootRay(float xDir, float yDir, float x, float y, float angle, float baseAngle, float map_depth, int map_w, int map_h, struct Tile map[map_w][map_h], int *type)
{
float stepX, stepY, vx, vy, hx, hy;
@@ -160,11 +203,12 @@ float shootRay(float xDir, float yDir, float x, float y, float angle, float base
bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, SDL_Window* window, struct Tile map[map_w][map_h])
{
- int framerate = 30, ticksPerFrame = 1000/framerate, startFrame = 0, ray_n = 150;
+ int framerate = 30, ticksPerFrame = 1000/framerate, startFrame = 0, ray_n = WINDOW_WIDTH / 2;
float fov = 90 * (M_PI/180), angle_step = fov/ray_n, map_depth = sqrt(pow(map_w, 2) + pow(map_h, 2)), acceleration = 0.0, sideAcceleration = 0.0, mouseMovement;
bool end = false;
- SDL_Rect floor = {0, 240, 640, 240};
+ SDL_Rect floor = {0, WINDOW_HEIGHT / 2, WINDOW_WIDTH, WINDOW_HEIGHT / 2};
+ SDL_Rect skybox = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT / 2};
// Make minimap squares 60x60 pixels. DONE
SDL_Rect minimap[map_w][map_h];
@@ -172,10 +216,10 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, SDL
{
for(int x = 0;x < map_w;x++)
{
- minimap[x][y].x = x * 60 + 640;
- minimap[x][y].y = y * 60;
- minimap[x][y].w = 60;
- minimap[x][y].h = 60;
+ minimap[x][y].x = x * 34 + WINDOW_WIDTH;
+ minimap[x][y].y = y * 34;
+ minimap[x][y].w = 34;
+ minimap[x][y].h = 34;
}
}
@@ -193,7 +237,6 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, SDL
{
startFrame = SDL_GetTicks();
SDL_RenderClear(renderer);
- SDL_WarpMouseInWindow(window, 320, 240);
// Make player shoot out rays from position with an FoV of 60 degrees DONE
for(int i = 0;i <= ray_n;i++)
@@ -206,6 +249,7 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, SDL
}
/* --- CONTROLS --- */
+ mouseMovement = 0;
while(SDL_PollEvent(&event))
{
switch(event.type)
@@ -218,8 +262,7 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, SDL
break;
}
}
- if(mouseMovement > 10.0 || mouseMovement < -10.0)
- player.angle += mouseMovement / 500;
+ player.angle += mouseMovement / 25;
const Uint8* keys = SDL_GetKeyboardState(NULL);
if(keys[SDL_SCANCODE_W])
{
@@ -279,6 +322,8 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, SDL
sideAcceleration = 0.0;
/* --- RENDERING --- */
+ SDL_SetRenderDrawColor(renderer, 0, 213, 255, 255);
+ SDL_RenderFillRect(renderer, &skybox);
SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255);
SDL_RenderFillRect(renderer, &floor);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
@@ -296,21 +341,21 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, SDL
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderFillRect(renderer, &minimap[x][y]);
SDL_SetRenderDrawColor(renderer, 100, 100, 100, 50);
- SDL_RenderDrawLine(renderer, (x * 60) + 640, y * 60, (x * 60) + 700, y * 60);
- SDL_RenderDrawLine(renderer, (x * 60) + 640, y * 60, (x * 60) + 640, (y * 60) + 60);
+ SDL_RenderDrawLine(renderer, (x * 34) + WINDOW_WIDTH, y * 34, (x * 34) + 1920 + 34, y * 34);
+ SDL_RenderDrawLine(renderer, (x * 34) + WINDOW_WIDTH, y * 34, (x * 34) + WINDOW_WIDTH, (y * 34) + 34);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
}
}
for(int i = 0;i <= ray_n;i++)
{
- rayDisplay[i].w = 640 / ray_n;
- rayDisplay[i].h = 400 / ray[i].distance;
- rayDisplay[i].x = i * (640 / ray_n);
- rayDisplay[i].y = 240 - (rayDisplay[i].h / 2);
- if(ray[i].type == 0)
- SDL_SetRenderDrawColor(renderer, 50, 50, 50, 255);
- else if(ray[i].type == 1)
+ rayDisplay[i].w = 2;
+ rayDisplay[i].h = 800 / ray[i].distance;
+ rayDisplay[i].x = i * 2;
+ rayDisplay[i].y = WINDOW_HEIGHT / 2 - (rayDisplay[i].h / 2);
+ //if(ray[i].type == 0)
+ // SDL_SetRenderDrawColor(renderer, 50, 50, 50, 255);
+ if(ray[i].type == 1)
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
else if(ray[i].type == 2)
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
@@ -318,12 +363,12 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, SDL
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderFillRect(renderer, &rayDisplay[i]);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
- SDL_RenderDrawLine(renderer, (player.x * 60) + 640, player.y * 60, ((player.x + cos(ray[i].angle) * (ray[i].distance / cos(ray[i].angle - player.angle))) * 60) + 640, (player.y + sin(ray[i].angle) * (ray[i].distance / cos(ray[i].angle - player.angle))) * 60);
+ SDL_RenderDrawLine(renderer, (player.x * 34) + WINDOW_WIDTH, player.y * 34, ((player.x + cos(ray[i].angle) * (ray[i].distance / cos(ray[i].angle - player.angle))) * 34) + WINDOW_WIDTH, (player.y + sin(ray[i].angle) * (ray[i].distance / cos(ray[i].angle - player.angle))) * 34);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
}
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
- SDL_RenderDrawLine(renderer, (player.x * 60) + 640, player.y * 60, ((player.x + cos(player.angle)) * 60) + 640, (player.y + sin(player.angle)) * 60);
+ //SDL_RenderDrawLine(renderer, (player.x * 60) + WINDOW_WIDTH, player.y * 60, ((player.x + cos(player.angle)) * 60) + WINDOW_WIDTH, (player.y + sin(player.angle)) * 60);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderPresent(renderer);
int ticks = startFrame - SDL_GetTicks();
@@ -335,23 +380,26 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, SDL
int main()
{
- int map_w = 8, map_h = 8;
+ int map_w = 32, map_h = 32;
struct Tile map[map_w][map_h];
bool quit = false;
- for(int y = 0;y < map_h;y++)
- {
- for(int x = 0;x < map_w;x++)
- {
- if(x == 0 || x == map_w - 1 || y == 0 || y == map_h - 1)
- map[x][y].type = 1;
- else if(x == 3 && y == 5)
- map[x][y].type = 2;
- else if(x == 2 && y >= 2 && y <= 6)
- map[x][y].type = 3;
- else
- map[x][y].type = 0;
- }
- }
+
+ //for(int y = 0;y < map_h;y++)
+ // {
+ // for(int x = 0;x < map_w;x++)
+ // {
+ // if(x == 0 || x == map_w - 1 || y == 0 || y == map_h - 1)
+ // map[x][y].type = 1;
+ // else if(x == 3 && y == 5)
+ // map[x][y].type = 2;
+ // else if(x == 2 && y >= 2 && y <= 6)
+ // map[x][y].type = 3;
+ // else
+ // map[x][y].type = 0;
+ // }
+ // }
+
+ loadMap("./maps/test-lineless.map", map_w, map_h, map);
SDL_Window *window;
SDL_Renderer *renderer;
@@ -360,7 +408,7 @@ int main()
SDL_Init(SDL_INIT_VIDEO);
TTF_Init();
- window = SDL_CreateWindow("Doom", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640 + 480, 480, SDL_WINDOW_OPENGL);
+ window = SDL_CreateWindow("Doom", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH + 1088, WINDOW_HEIGHT, SDL_WINDOW_OPENGL);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_SetRelativeMouseMode(SDL_TRUE);
diff --git a/maker.c b/maker.c
index 618ac10..67fe1b8 100644
--- a/maker.c
+++ b/maker.c
@@ -1,6 +1,7 @@
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
#include <stdbool.h>
+#include <stdio.h>
#define WINDOW_SIDE 800
@@ -9,14 +10,14 @@ struct Tile
int type;
};
-void printText(SDL_Renderer *renderer, TTF_Font *font, char *str, int x, int y, int w, int h, int r, int g, int b)
+void printText(SDL_Renderer *renderer, TTF_Font *font, char *str, int x, int y, int h, int r, int g, int b)
{
SDL_Color c = {r, g, b, 255};
SDL_Surface *s = TTF_RenderText_Solid(font, str, c);
SDL_Texture *t = SDL_CreateTextureFromSurface(renderer, s);
- SDL_Rect rect = {x, y, w, h};
+ SDL_Rect rect = {x, y, strlen(str) * (h / 2), h};
SDL_RenderCopy(renderer, t, NULL, &rect);
}
@@ -54,6 +55,9 @@ int editor(SDL_Renderer *renderer, SDL_Event event, TTF_Font *font, int map_w, i
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
+ case SDLK_ESCAPE:
+ return 0;
+ break;
case SDLK_1:
type = 1;
break;
@@ -117,7 +121,7 @@ int editor(SDL_Renderer *renderer, SDL_Event event, TTF_Font *font, int map_w, i
}
}
sprintf(ty, "Current Type: %i", type);
- printText(renderer, font, ty, (WINDOW_SIDE / 2) - 100, 0, 200, 40, 255, 255, 255);
+ printText(renderer, font, ty, (WINDOW_SIDE / 2) - 100, 0, 40, 255, 255, 255);
SDL_RenderPresent(renderer);
int ticks = startFrame - SDL_GetTicks();
if(ticks < ticksPerFrame)
@@ -130,13 +134,16 @@ void save(SDL_Renderer *renderer, SDL_Event event, TTF_Font *font, int map_w, in
{
int framerate = 30, ticksPerFrame = 1000/framerate, startFrame = 0, len = 0;
bool done = false;
- char text[64] = "", *filename;
+ char text[64] = "", filename_disp[64], filename[64];
+ FILE *f;
SDL_StartTextInput();
while(!done)
{
startFrame = SDL_GetTicks();
SDL_RenderClear(renderer);
+ sprintf(filename_disp, "%s.map", text);
+
while(SDL_PollEvent(&event))
{
switch(event.type)
@@ -153,23 +160,39 @@ void save(SDL_Renderer *renderer, SDL_Event event, TTF_Font *font, int map_w, in
break;
case SDLK_RETURN:
// Save the map to file with name text
- FILE *f = fopen(text, "W");
- fprintf(f, "poobie");
- fclose(f);
+ f = fopen(filename, "r");
+ if(f == NULL)
+ {
+ printf("here\n");
+ sprintf(filename, "./maps/%s", filename_disp);
+ f = fopen(filename, "w");
+ fprintf(f, "%i %i\n", map_w, map_h);
+ for(int y = 0;y < map_h;y++)
+ {
+ for(int x = 0;x < map_w;x++)
+ {
+ if(x < map_w - 1)
+ fprintf(f, "|%i", map[x][y].type);
+ else
+ fprintf(f, "|%i|", map[x][y].type);
+ }
+ fprintf(f, "\n");
+ }
+ fclose(f);
+ }
break;
}
break;
case SDL_TEXTINPUT:
- if(len < 20)
+ if(strlen(text)<15)
{
strcat(text, event.text.text);
- len++;
}
break;
}
}
- sprintf(filename, 64, "%s.txt", text);
- printText(renderer, font, filename, 0, 0, 400, 100, 255, 255, 255);
+ //sprintf(filename, 64, "%s.txt", text);
+ printText(renderer, font, filename_disp, 0, 0, 100, 255, 255, 255);
SDL_RenderPresent(renderer);
int ticks = startFrame - SDL_GetTicks();
@@ -197,6 +220,11 @@ int main()
while(s != 0)
{
s = editor(renderer, event, font, map_w, map_h, map);
- save(renderer, event, font, map_w, map_h, map);
+ if(s == 1)
+ save(renderer, event, font, map_w, map_h, map);
}
+
+ TTF_Quit();
+ SDL_Quit();
+ return 0;
}