first part algo

This commit is contained in:
ReverseSky 2024-10-03 17:54:28 +02:00
parent 8eed6feb6b
commit f7f92cbaa8
3 changed files with 132 additions and 38 deletions

View file

@ -3,16 +3,16 @@
# ::: :::::::: # # ::: :::::::: #
# Makefile :+: :+: :+: # # Makefile :+: :+: :+: #
# +:+ +:+ +:+ # # +:+ +:+ +:+ #
# By: grobledo <grobledo@student.42.fr> +#+ +:+ +#+ # # By: greg <greg@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ # # +#+#+#+#+#+ +#+ #
# Created: 2024/07/29 13:08:42 by greg #+# #+# # # Created: 2024/07/29 13:08:42 by greg #+# #+# #
# Updated: 2024/10/01 18:58:09 by grobledo ### ########.fr # # Updated: 2024/10/03 17:00:43 by greg ### ########.fr #
# # # #
# **************************************************************************** # # **************************************************************************** #
NAME = cub3d NAME = cub3d
SRC = SRC = algo.c
OBJS = ${SRC:.c=.o} OBJS = ${SRC:.c=.o}

139
algo.c
View file

@ -3,50 +3,127 @@
/* ::: :::::::: */ /* ::: :::::::: */
/* algo.c :+: :+: :+: */ /* algo.c :+: :+: :+: */
/* +:+ +:+ +:+ */ /* +:+ +:+ +:+ */
/* By: grobledo <grobledo@student.42.fr> +#+ +:+ +#+ */ /* By: greg <greg@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/10/01 16:24:58 by grobledo #+# #+# */ /* Created: 2024/10/01 16:24:58 by grobledo #+# #+# */
/* Updated: 2024/10/01 18:57:51 by grobledo ### ########.fr */ /* Updated: 2024/10/03 17:42:13 by greg ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "algo.h" #include "algo.h"
int algo(struct) static int initalgo(t_ray *ray)
{ {
double posX; ray->posX = 2;
double posY; //position x et y du joueur sur la map ray->posY = 2;
double dirX; ray->dirX = -1;
double dirY; // orientation du joeur sur la map ray->dirY = 0;
double planeX; ray->planeX = 0;
double planeY;// position de la cam ray->planeY = 0.66; // FOV de 66 degres
double currtime; // temps frame actuelle ray->currtime = 0;
double oldtime; // temps derniere frame ray->oldtime = 0;
return (0);
}
posX = 2;
posY = 2; int algo()
dirX = -1; {
dirY = 0; t_ray ray;
planeX = 0; int x;
planeY = 0.66; // FOV de 66 degres double width;
currtime = 0; int height;
oldtime = 0; // quelle box sur la map on est
int mapX;
int mapY;
// wall hit and if yes in wich direction
int hit;
int side;
initalgo(&ray);
// init image;
x = 0;
width = 640;
height = 480;
while (x < w)
{
// position et direction du rayon
ray.cameraX = 2 * x / width - 1;
ray.raydirX = ray.dirX + ray.planeX * ray.cameraX;
ray.raydirY = ray.dirY + ray.planeY * ray.cameraX;
mapX = (int)ray.posX;
mapY = (int)ray.posY;
ray.deltadistX = (ray.raydirX == 0) ? 1e30 : fabs(1 / ray.raydirX);
ray.deltadistY = (ray.raydirY == 0) ? 1e30 : fabs(1 / ray.raydirY);
hit = 0;
//calculate step and initial sideDist
if (ray.raydirX < 0)
{
ray.stepX = -1;
ray.sidedistX = (ray.posX - mapX) * ray.deltadistX;
}
else
{
ray.stepX = 1;
ray.sidedistX = (mapX + 1.0 - ray.posX) * ray.deltadistX;
}
if (ray.raydirY < 0)
{
ray.stepY = -1;
ray.sidedistY = (ray.posY - mapY) * ray.deltadistY;
}
else
{
ray.stepY = 1;
ray.sidedistY = (mapY + 1.0 - ray.posY) * ray.deltadistY;
}
while(hit == 0)
{
//jump to next map square, either in x-direction, or in y-direction
if(ray.sidedistX < ray.sidedistY)
{
ray.sidedistX += ray.deltadistX;
mapX += ray.stepX;
side = 0;
}
else
{
ray.sidedistY += ray.deltadistY;
mapY += ray.stepY;
side = 1;
}
//Check if ray has hit a wall
if(worldMap[mapX][mapY] == 1)
hit = 1;
}
if(side == 0)
ray.perpwalldist = (ray.sidedistX - ray.deltadistX);
else
ray.perpwalldist = (ray.sidedistY - ray.deltadistY);
//Calculate height of line to draw on screen
int lineHeight = (int)(height / ray.perpwalldist);
lineHeight = (int)(height / ray.perpwalldist);
//calculate lowest and highest pixel to fill in current stripe
int drawStart;
drawStart = -lineHeight / 2 + height / 2;
if(drawStart < 0)
drawStart = 0;
int drawEnd;
if(drawEnd >= height)
drawEnd = height - 1;
}
return (0);
} }
// int initalgo(struct)
// {
// posX = 2;
// posY = 2;
// dirX = -1;
// dirY = 0;
// planeX = 0;
// planeY = 0.66; // FOV de 66 degres
// currtime = 0;
// oldtime = 0;
// return (0);
// }

25
algo.h
View file

@ -3,10 +3,10 @@
/* ::: :::::::: */ /* ::: :::::::: */
/* algo.h :+: :+: :+: */ /* algo.h :+: :+: :+: */
/* +:+ +:+ +:+ */ /* +:+ +:+ +:+ */
/* By: grobledo <grobledo@student.42.fr> +#+ +:+ +#+ */ /* By: greg <greg@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/09/30 15:45:59 by grobledo #+# #+# */ /* Created: 2024/09/30 15:45:59 by grobledo #+# #+# */
/* Updated: 2024/10/01 18:57:39 by grobledo ### ########.fr */ /* Updated: 2024/10/03 17:26:27 by greg ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -16,7 +16,7 @@
#include <unistd.h> #include <unistd.h>
#include <math.h> #include <math.h>
typedef struct s_player typedef struct s_ray
{ {
// pos player on map // pos player on map
double posX; double posX;
@ -31,6 +31,23 @@ typedef struct s_player
double currtime; double currtime;
// last frame // last frame
double oldtime; double oldtime;
} t_player; // camera pos
double cameraX;
// direction rayon
double raydirX;
double raydirY;
// longueur du rayon entre pos actuelle et pos du prochain cote d'une box
double sidedistX;
double sidedistY;
// longueur du rayon entre pos d'un cote d'une box jusqu'a pos du prochain cote d'une box
double deltadistX;
double deltadistY;
// calcul lenght of ray (shortest perpendicular distance between wall and camera plane)
double perpwalldist;
// step direction (can be -1 or +1)
int stepX;
int stepY;
//wall hit?
} t_ray;
#endif #endif