manque even, mlx fonction et definition map
This commit is contained in:
parent
f7f92cbaa8
commit
bdd7e86f3c
2 changed files with 125 additions and 67 deletions
181
algo.c
181
algo.c
|
@ -6,7 +6,7 @@
|
||||||
/* By: greg <greg@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/03 17:42:13 by greg ### ########.fr */
|
/* Updated: 2024/10/03 18:59:06 by greg ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
@ -23,6 +23,8 @@ static int initalgo(t_ray *ray)
|
||||||
ray->planeY = 0.66; // FOV de 66 degres
|
ray->planeY = 0.66; // FOV de 66 degres
|
||||||
ray->currtime = 0;
|
ray->currtime = 0;
|
||||||
ray->oldtime = 0;
|
ray->oldtime = 0;
|
||||||
|
ray->movespeed = 0.1;
|
||||||
|
ray->rotspeed = 0.1;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,78 +49,135 @@ int algo()
|
||||||
x = 0;
|
x = 0;
|
||||||
width = 640;
|
width = 640;
|
||||||
height = 480;
|
height = 480;
|
||||||
while (x < w)
|
while (x < width)
|
||||||
{
|
{
|
||||||
// position et direction du rayon
|
// position et direction du rayon
|
||||||
ray.cameraX = 2 * x / width - 1;
|
ray.cameraX = 2 * x / width - 1;
|
||||||
ray.raydirX = ray.dirX + ray.planeX * ray.cameraX;
|
ray.raydirX = ray.dirX + ray.planeX * ray.cameraX;
|
||||||
ray.raydirY = ray.dirY + ray.planeY * ray.cameraX;
|
ray.raydirY = ray.dirY + ray.planeY * ray.cameraX;
|
||||||
|
|
||||||
mapX = (int)ray.posX;
|
mapX = (int)ray.posX;
|
||||||
mapY = (int)ray.posY;
|
mapY = (int)ray.posY;
|
||||||
|
|
||||||
ray.deltadistX = (ray.raydirX == 0) ? 1e30 : fabs(1 / ray.raydirX);
|
ray.deltadistX = (ray.raydirX == 0) ? 1e30 : fabs(1 / ray.raydirX);
|
||||||
ray.deltadistY = (ray.raydirY == 0) ? 1e30 : fabs(1 / ray.raydirY);
|
ray.deltadistY = (ray.raydirY == 0) ? 1e30 : fabs(1 / ray.raydirY);
|
||||||
|
|
||||||
hit = 0;
|
hit = 0;
|
||||||
|
|
||||||
//calculate step and initial sideDist
|
//calculate step and initial sideDist
|
||||||
if (ray.raydirX < 0)
|
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;
|
ray.stepX = -1;
|
||||||
mapX += ray.stepX;
|
ray.sidedistX = (ray.posX - mapX) * ray.deltadistX;
|
||||||
side = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ray.sidedistY += ray.deltadistY;
|
ray.stepX = 1;
|
||||||
mapY += ray.stepY;
|
ray.sidedistX = (mapX + 1.0 - ray.posX) * ray.deltadistX;
|
||||||
side = 1;
|
|
||||||
}
|
}
|
||||||
//Check if ray has hit a wall
|
if (ray.raydirY < 0)
|
||||||
if(worldMap[mapX][mapY] == 1)
|
{
|
||||||
hit = 1;
|
ray.stepY = -1;
|
||||||
}
|
ray.sidedistY = (ray.posY - mapY) * ray.deltadistY;
|
||||||
if(side == 0)
|
}
|
||||||
ray.perpwalldist = (ray.sidedistX - ray.deltadistX);
|
else
|
||||||
else
|
{
|
||||||
ray.perpwalldist = (ray.sidedistY - ray.deltadistY);
|
ray.stepY = 1;
|
||||||
//Calculate height of line to draw on screen
|
ray.sidedistY = (mapY + 1.0 - ray.posY) * ray.deltadistY;
|
||||||
int lineHeight = (int)(height / ray.perpwalldist);
|
}
|
||||||
lineHeight = (int)(height / ray.perpwalldist);
|
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
|
//calculate lowest and highest pixel to fill in current stripe
|
||||||
int drawStart;
|
int drawStart;
|
||||||
drawStart = -lineHeight / 2 + height / 2;
|
drawStart = -lineHeight / 2 + height / 2;
|
||||||
if(drawStart < 0)
|
if(drawStart < 0)
|
||||||
drawStart = 0;
|
drawStart = 0;
|
||||||
int drawEnd;
|
int drawEnd;
|
||||||
if(drawEnd >= height)
|
if(drawEnd >= height)
|
||||||
drawEnd = height - 1;
|
drawEnd = height - 1;
|
||||||
|
|
||||||
|
/*mlx fontction color
|
||||||
|
|
||||||
|
give x and y sides different brightness
|
||||||
|
if (side == 1) {color = color / 2;}
|
||||||
|
|
||||||
|
//draw the pixels of the stripe as a vertical line
|
||||||
|
verLine(x, drawStart, drawEnd, color); */
|
||||||
|
|
||||||
|
|
||||||
|
//timing for input to dissociate speed from speed processor (same speed on all pc)
|
||||||
|
ray.oldtime = ray.currtime;
|
||||||
|
ray.currtime = getTicks();
|
||||||
|
// put image to window
|
||||||
|
// destroy old image
|
||||||
|
|
||||||
|
|
||||||
|
// hook event
|
||||||
|
|
||||||
|
readKeys();
|
||||||
|
//move forward if no wall in front of you
|
||||||
|
if (keyDown(move_up))
|
||||||
|
{
|
||||||
|
if(worldMap[(ray.posX + ray.dirX * ray.movespeed)][(int)(ray.posY)] == 0)
|
||||||
|
ray.posX += ray.dirX * ray.movespeed;
|
||||||
|
if(worldMap[(ray.posX)][((int)ray.posY + (int)ray.dirY * (int)ray.movespeed)] == 0)
|
||||||
|
ray.posY += ray.dirY * ray.movespeed;
|
||||||
|
}
|
||||||
|
//move backwards if no wall behind you
|
||||||
|
if (keyDown(moove_down))
|
||||||
|
{
|
||||||
|
if(worldMap[(ray.posX - ray.dirX * ray.movespeed)][(int)(ray.posY)] == 0)
|
||||||
|
ray.posX -= ray.dirX * ray.movespeed;
|
||||||
|
if(worldMap[(ray.posX)][((int)ray.posY - (int)ray.dirY * (int)ray.movespeed)] == 0)
|
||||||
|
ray.posY -= ray.dirY * ray.movespeed;
|
||||||
|
}
|
||||||
|
//rotate to the right
|
||||||
|
if (keyDown(moove_right))
|
||||||
|
{
|
||||||
|
//both camera direction and camera plane must be rotated
|
||||||
|
ray.oldDirX = ray.dirX;
|
||||||
|
ray.dirX = ray.dirX * cos(-ray.rotspeed) - ray.dirY * sin(-ray.rotspeed);
|
||||||
|
ray.dirY = ray.oldDirX * sin(-ray.rotspeed) + ray.dirY * cos(-ray.rotspeed);
|
||||||
|
ray.oldPlaneX = ray.planeX;
|
||||||
|
ray.planeX = ray.planeX * cos(-ray.rotspeed) - ray.planeY * sin(-ray.rotspeed);
|
||||||
|
ray.planeY = ray.oldPlaneX * sin(-ray.rotspeed) + ray.planeY * cos(-ray.rotspeed);
|
||||||
|
}
|
||||||
|
//rotate to the left
|
||||||
|
if (keyDown(moove_left))
|
||||||
|
{
|
||||||
|
//both camera direction and camera plane must be rotated
|
||||||
|
ray.oldDirX = ray.dirX;
|
||||||
|
ray.dirX = ray.dirX * cos(ray.rotspeed) - ray.dirY * sin(ray.rotspeed);
|
||||||
|
ray.dirY = ray.oldDirX * sin(ray.rotspeed) + ray.dirY * cos(ray.rotspeed);
|
||||||
|
ray.oldPlaneX = ray.planeX;
|
||||||
|
ray.planeX = ray.planeX * cos(ray.rotspeed) - ray.planeY * sin(ray.rotspeed);
|
||||||
|
ray.planeY = ray.oldPlaneX * sin(ray.rotspeed) + ray.planeY * cos(ray.rotspeed);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
|
|
11
algo.h
11
algo.h
|
@ -6,7 +6,7 @@
|
||||||
/* By: greg <greg@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/03 17:26:27 by greg ### ########.fr */
|
/* Updated: 2024/10/03 18:59:43 by greg ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
@ -27,10 +27,6 @@ typedef struct s_ray
|
||||||
// orientation cam on map
|
// orientation cam on map
|
||||||
double planeX;
|
double planeX;
|
||||||
double planeY;
|
double planeY;
|
||||||
// current frame
|
|
||||||
double currtime;
|
|
||||||
// last frame
|
|
||||||
double oldtime;
|
|
||||||
// camera pos
|
// camera pos
|
||||||
double cameraX;
|
double cameraX;
|
||||||
// direction rayon
|
// direction rayon
|
||||||
|
@ -47,7 +43,10 @@ typedef struct s_ray
|
||||||
// step direction (can be -1 or +1)
|
// step direction (can be -1 or +1)
|
||||||
int stepX;
|
int stepX;
|
||||||
int stepY;
|
int stepY;
|
||||||
//wall hit?
|
double movespeed;
|
||||||
|
double rotspeed;
|
||||||
|
double oldDirX;
|
||||||
|
double oldPlaneX;
|
||||||
} t_ray;
|
} t_ray;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue