← Back to ratslair.com
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdvin Jakobsson <[email protected]>2023-06-30 21:03:13 +0200
committerEdvin Jakobsson <[email protected]>2023-06-30 21:03:13 +0200
commit86c95b40269fd90946525daa1cb99e44670a1ca3 (patch)
tree4c42fca81b9ad991719fad1b587ef5a792cb64ce
parent547ecd4a2d8e537997e4a822d3488d356eab9798 (diff)
Added mouse controls for the camera
-rw-r--r--main.c66
1 files changed, 47 insertions, 19 deletions
diff --git a/main.c b/main.c
index d9f4acf..767108a 100644
--- a/main.c
+++ b/main.c
@@ -2,10 +2,18 @@
#include <SDL2/SDL_ttf.h>
#include <stdbool.h>
#include <math.h>
-// TODO FIRSST get rendering and movement around map working. DONE
+// TODO FIRSST get rendering and movement around map working. DONE DONE DONE
+
+// Improving movement with strafing.
// TODO Enemies, Load maps. Weapons
+// Map loading - needs to save maps to files. Maybe implement a map editor
+
+// Enemies - Some kind of AI? gotta shoot at you and do damage. Maybe less chance to hit when moving
+
+// Weapons - need some sort of graphic for different weapon types. Have to shoot and be able to hit things. Hitboxes for enemies and such.
+
struct Tile
{
int type;
@@ -150,17 +158,13 @@ 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, struct Tile map[map_w][map_h])
+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;
- 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;
+ 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;
- floor.w = 640;
- floor.h = 240;
- floor.x = 0;
- floor.y = 240;
+ SDL_Rect floor = {0, 240, 640, 240};
// Make minimap squares 60x60 pixels. DONE
SDL_Rect minimap[map_w][map_h];
@@ -176,8 +180,8 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, str
}
struct Player player;
- player.x = 3.9;
- player.y = 3.9;
+ player.x = 3.95;
+ player.y = 3.95;
player.angle = 0.0;
player.health = 10;
@@ -189,6 +193,7 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, str
{
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++)
@@ -205,17 +210,16 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, str
{
switch(event.type)
{
- //case SDL_KEYDOWN:
- // keys[event.key.keysym.sym] = true;
- // break;
- //case SDL_KEYUP:
- // keys[event.key.keysym.sym] = false;
- // break;
+ case SDL_MOUSEMOTION:
+ mouseMovement = (float)event.motion.xrel;
+ break;
case SDL_QUIT:
return true;
break;
}
}
+ if(mouseMovement > 10.0 || mouseMovement < -10.0)
+ player.angle += mouseMovement / 500;
const Uint8* keys = SDL_GetKeyboardState(NULL);
if(keys[SDL_SCANCODE_W])
{
@@ -229,11 +233,21 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, str
}
if(keys[SDL_SCANCODE_A])
{
+ if(sideAcceleration < 0.5)
+ sideAcceleration -= 0.1;
+ }
+ if(keys[SDL_SCANCODE_D])
+ {
+ if(sideAcceleration > -0.5)
+ sideAcceleration += 0.1;
+ }
+ if(keys[SDL_SCANCODE_Q])
+ {
player.angle -= 5 * angle_step;
if(player.angle < 0.0)
player.angle += 2 * M_PI;
}
- if(keys[SDL_SCANCODE_D])
+ if(keys[SDL_SCANCODE_E])
{
player.angle += 5 * angle_step;
if(player.angle > 2 * M_PI)
@@ -245,6 +259,11 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, str
player.x += acceleration * cos(player.angle);
player.y += acceleration * sin(player.angle);
}
+ if(map[(int)(player.x + sideAcceleration * cos(player.angle + M_PI_2))][(int)(player.y + sideAcceleration * sin(player.angle + M_PI_2))].type == 0)
+ {
+ player.x += sideAcceleration * cos(player.angle + M_PI_2);
+ player.y += sideAcceleration * sin(player.angle + M_PI_2);
+ }
if(acceleration > 0.0)
acceleration -= 0.1;
else if(acceleration < 0.0)
@@ -252,6 +271,13 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, str
if(acceleration < 0.01 && acceleration > -0.01)
acceleration = 0.0;
+ if(sideAcceleration > 0.0)
+ sideAcceleration -= 0.1;
+ else if(sideAcceleration < 0.0)
+ sideAcceleration += 0.1;
+ if(sideAcceleration < 0.01 && sideAcceleration > -0.01)
+ sideAcceleration = 0.0;
+
/* --- RENDERING --- */
SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255);
SDL_RenderFillRect(renderer, &floor);
@@ -292,7 +318,7 @@ bool gameLoop(int map_w, int map_h, SDL_Renderer *renderer, SDL_Event event, str
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) * 60) + 640, (player.y + sin(ray[i].angle) * ray[i].distance) * 60);
+ 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_SetRenderDrawColor(renderer, 0, 0, 0, 255);
}
@@ -337,9 +363,11 @@ int main()
window = SDL_CreateWindow("Doom", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640 + 480, 480, SDL_WINDOW_OPENGL);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
+ SDL_SetRelativeMouseMode(SDL_TRUE);
+
while(!quit)
{
- quit = gameLoop(map_w, map_h, renderer, event, map);
+ quit = gameLoop(map_w, map_h, renderer, event, window, map);
}
SDL_DestroyRenderer(renderer);