sprites render
This commit is contained in:
parent
495ba620af
commit
64d1ff7ee9
4
Makefile
4
Makefile
@ -6,13 +6,13 @@
|
|||||||
# By: houtworm <codam@houtworm.net> +#+ #
|
# By: houtworm <codam@houtworm.net> +#+ #
|
||||||
# +#+ #
|
# +#+ #
|
||||||
# Created: 2023/10/26 10:46:29 by houtworm #+# #+# #
|
# Created: 2023/10/26 10:46:29 by houtworm #+# #+# #
|
||||||
# Updated: 2023/11/02 04:04:36 by houtworm ######## odam.nl #
|
# Updated: 2023/11/02 18:31:43 by houtworm ######## odam.nl #
|
||||||
# #
|
# #
|
||||||
# **************************************************************************** #
|
# **************************************************************************** #
|
||||||
|
|
||||||
NAME =cub3d
|
NAME =cub3d
|
||||||
CC =gcc
|
CC =gcc
|
||||||
FC =-Wall -Werror -Wextra -Wunreachable-code -Ofast -g #-fsanitize=address
|
FC =-Wall -Werror -Wextra -Wunreachable-code -flto -Ofast -march=native #-g #-fsanitize=address
|
||||||
HEAD =-I ./include -I $(MLX)/include
|
HEAD =-I ./include -I $(MLX)/include
|
||||||
RM =rm -rf
|
RM =rm -rf
|
||||||
LIB =libft/libft.a getnextline/get_next_line.a mlx/build/libmlx42.a -ldl -lglfw -pthread -lm
|
LIB =libft/libft.a getnextline/get_next_line.a mlx/build/libmlx42.a -ldl -lglfw -pthread -lm
|
||||||
|
@ -19,6 +19,11 @@ Cub3D is a simple raycasting game using the mlx library
|
|||||||
- Moving Enemies?
|
- Moving Enemies?
|
||||||
- Weapon Sprite that fires?
|
- Weapon Sprite that fires?
|
||||||
- Zoom with right mouse button?
|
- Zoom with right mouse button?
|
||||||
|
- Weapon pickups
|
||||||
|
- HP system
|
||||||
|
- Timer
|
||||||
|
- Score system
|
||||||
|
- End level screen
|
||||||
- Skybox?
|
- Skybox?
|
||||||
- Sounds?
|
- Sounds?
|
||||||
- Music?
|
- Music?
|
||||||
@ -46,6 +51,8 @@ Cub3D is a simple raycasting game using the mlx library
|
|||||||
- Player can Run
|
- Player can Run
|
||||||
- Map sizes up to 1 Megabyte (1000x1000)
|
- Map sizes up to 1 Megabyte (1000x1000)
|
||||||
- Vertical Aiming
|
- Vertical Aiming
|
||||||
|
- Fullscreen
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
## Bugs
|
## Bugs
|
||||||
|
14
cub3d.h
14
cub3d.h
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 10:46:35 by houtworm #+# #+# */
|
/* Created: 2023/10/26 10:46:35 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/02 04:18:39 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/03 22:43:10 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -21,6 +21,13 @@
|
|||||||
# include "mlx/include/MLX42/MLX42.h"
|
# include "mlx/include/MLX42/MLX42.h"
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
|
|
||||||
|
typedef struct s_sprite
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int type;
|
||||||
|
} t_sprite;
|
||||||
|
|
||||||
typedef struct s_varlist
|
typedef struct s_varlist
|
||||||
{
|
{
|
||||||
mlx_t *mlx;
|
mlx_t *mlx;
|
||||||
@ -32,6 +39,10 @@ typedef struct s_varlist
|
|||||||
mlx_texture_t *southtext;
|
mlx_texture_t *southtext;
|
||||||
mlx_texture_t *westtext;
|
mlx_texture_t *westtext;
|
||||||
mlx_texture_t *barreltext;
|
mlx_texture_t *barreltext;
|
||||||
|
mlx_texture_t *hlamptext;
|
||||||
|
mlx_texture_t *slamptext;
|
||||||
|
t_sprite *sprite;
|
||||||
|
int spritecount;
|
||||||
int fpsrefresh;
|
int fpsrefresh;
|
||||||
int w;
|
int w;
|
||||||
int h;
|
int h;
|
||||||
@ -87,6 +98,7 @@ void cursorhook(double x, double y, void *param);
|
|||||||
void ft_raycast(t_varlist *vl);
|
void ft_raycast(t_varlist *vl);
|
||||||
// draw.c
|
// draw.c
|
||||||
void ft_drawline(int x, t_varlist *vl, int drawstart, int drawend);
|
void ft_drawline(int x, t_varlist *vl, int drawstart, int drawend);
|
||||||
|
void ft_drawsprites(t_varlist *vl);
|
||||||
// error.c
|
// error.c
|
||||||
int ft_errorexit(char *reason, char *function, int code);
|
int ft_errorexit(char *reason, char *function, int code);
|
||||||
#endif
|
#endif
|
||||||
|
102
src/draw.c
102
src/draw.c
@ -6,12 +6,112 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */
|
/* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/01 14:39:54 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/03 22:45:06 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "../cub3d.h"
|
#include "../cub3d.h"
|
||||||
|
|
||||||
|
mlx_texture_t *ft_selectsprite(t_varlist *vl, int type)
|
||||||
|
{
|
||||||
|
mlx_texture_t *sprite;
|
||||||
|
|
||||||
|
if (type == 1)
|
||||||
|
sprite = vl->barreltext;
|
||||||
|
else if (type == 2)
|
||||||
|
sprite = vl->hlamptext;
|
||||||
|
else if (type == 3)
|
||||||
|
sprite = vl->hlamptext;
|
||||||
|
else if (type == 4)
|
||||||
|
sprite = vl->slamptext;
|
||||||
|
else
|
||||||
|
ft_errorexit("what?", "what?", 1);
|
||||||
|
return (sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_drawsprites(t_varlist *vl)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double spritex;
|
||||||
|
double spritey;
|
||||||
|
mlx_texture_t *sprite;
|
||||||
|
double invdet;
|
||||||
|
double transformx;
|
||||||
|
double transformy;
|
||||||
|
int udiv;
|
||||||
|
int vdiv;
|
||||||
|
double vmove;
|
||||||
|
int spritescreenx;
|
||||||
|
int vmovescreen;
|
||||||
|
int spriteheight;
|
||||||
|
int spritewidth;
|
||||||
|
int drawstarty;
|
||||||
|
int drawstartx;
|
||||||
|
int drawendy;
|
||||||
|
int drawendx;
|
||||||
|
int texx;
|
||||||
|
int texy;
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int d;
|
||||||
|
uint32_t color;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (vl->spritecount > i)
|
||||||
|
{
|
||||||
|
spritex = vl->sprite[i].x - vl->posx;
|
||||||
|
spritey = vl->sprite[i].y - vl->posy;
|
||||||
|
sprite = ft_selectsprite(vl, vl->sprite[i].type);
|
||||||
|
invdet = 1.0 / (vl->planex * vl->diry - vl->dirx * vl->planey);
|
||||||
|
transformx = invdet * (vl->diry * spritex - vl->dirx * spritey);
|
||||||
|
transformy = invdet * (-vl->planey * spritex + vl->planex * spritey);
|
||||||
|
spritescreenx = (vl->w / 2) * (int)(1 + transformx / transformy);
|
||||||
|
udiv = 1;
|
||||||
|
vdiv = 1;
|
||||||
|
vmove = 0.0;
|
||||||
|
vmovescreen = (int)(vmove / transformy) + vl->hoffset + 0 / transformy;
|
||||||
|
spriteheight = abs((int)(vl->h / (transformy))) / vdiv;
|
||||||
|
drawstarty = -spriteheight / 2 + vl->h / 2 + vmovescreen;
|
||||||
|
if (drawstarty < 0)
|
||||||
|
drawstarty = 0;
|
||||||
|
drawendy = spriteheight / 2 + vl->h / 2 + vmovescreen;
|
||||||
|
if (drawendy >= vl->h)
|
||||||
|
drawendy = vl->h - 1;
|
||||||
|
spritewidth = abs((int)(vl->h / transformy)) / udiv;
|
||||||
|
drawstartx = -spritewidth / 2 + spritescreenx;
|
||||||
|
if (drawstartx < 0)
|
||||||
|
drawstartx = 0;
|
||||||
|
drawendx = spritewidth / 2 + spritescreenx;
|
||||||
|
if (drawendx >= vl->w)
|
||||||
|
drawendx = vl->w - 1;
|
||||||
|
x = drawstartx;
|
||||||
|
while (x < drawendx)
|
||||||
|
{
|
||||||
|
texx = (int)(256 * (x - (-spritewidth / 2 + spritescreenx)) * 64 / spritewidth) / 256;
|
||||||
|
if (transformy > 0 && x > 0 && x < vl->w)
|
||||||
|
{
|
||||||
|
y = drawstarty;
|
||||||
|
while (y < drawendy)
|
||||||
|
{
|
||||||
|
d = (y - vmovescreen) * 256 - vl->h * 128 + spriteheight * 128;
|
||||||
|
texy = (d * 64) / spriteheight / 256;
|
||||||
|
uint8_t *texel;
|
||||||
|
texel = &sprite->pixels[(sprite->width * texy + texx) * sprite->bytes_per_pixel];
|
||||||
|
color = texel[0] << 24 | texel[1] << 16 | texel[2] << 8 | texel[3];
|
||||||
|
if (color != 0x980088FF)
|
||||||
|
mlx_put_pixel(vl->img, x, y, color);
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void ft_selecttexture(t_varlist *vl)
|
void ft_selecttexture(t_varlist *vl)
|
||||||
{
|
{
|
||||||
if (vl->side == 0)
|
if (vl->side == 0)
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 16:49:12 by houtworm #+# #+# */
|
/* Created: 2023/10/26 16:49:12 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/02 04:28:53 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/03 22:42:48 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -18,6 +18,8 @@ t_varlist initvarlist(void)
|
|||||||
|
|
||||||
vl.w = 800;
|
vl.w = 800;
|
||||||
vl.h = 600;
|
vl.h = 600;
|
||||||
|
vl.sprite = ft_calloc(4096, 8);
|
||||||
|
vl.spritecount = 0;
|
||||||
vl.hoffset = 0;
|
vl.hoffset = 0;
|
||||||
vl.ccolor = 0;
|
vl.ccolor = 0;
|
||||||
vl.fcolor = 0;
|
vl.fcolor = 0;
|
||||||
@ -26,6 +28,8 @@ t_varlist initvarlist(void)
|
|||||||
vl.southtext = NULL;
|
vl.southtext = NULL;
|
||||||
vl.westtext = NULL;
|
vl.westtext = NULL;
|
||||||
vl.barreltext = mlx_load_png("./assets/barrel.png");
|
vl.barreltext = mlx_load_png("./assets/barrel.png");
|
||||||
|
vl.hlamptext = mlx_load_png("./assets/hlamp.png");
|
||||||
|
vl.slamptext = mlx_load_png("./assets/slamp.png");
|
||||||
vl.mlx = mlx_init(vl.w, vl.h, "Cub3D", true);
|
vl.mlx = mlx_init(vl.w, vl.h, "Cub3D", true);
|
||||||
if (!vl.mlx)
|
if (!vl.mlx)
|
||||||
ft_errorexit("MLX failed to init", "initvarlist", 1);
|
ft_errorexit("MLX failed to init", "initvarlist", 1);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */
|
/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/02 03:57:40 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/03 22:41:58 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -36,6 +36,7 @@ void mainloop(void *param)
|
|||||||
mlx_delete_image(vl->mlx, vl->fps);
|
mlx_delete_image(vl->mlx, vl->fps);
|
||||||
vl->img = mlx_new_image(vl->mlx, vl->w, vl->h);
|
vl->img = mlx_new_image(vl->mlx, vl->w, vl->h);
|
||||||
ft_raycast(vl);
|
ft_raycast(vl);
|
||||||
|
ft_drawsprites(vl);
|
||||||
ft_frametime(vl);
|
ft_frametime(vl);
|
||||||
ft_movementkeys(vl);
|
ft_movementkeys(vl);
|
||||||
if (!vl->img || (mlx_image_to_window(vl->mlx, vl->img, 0, 0) < 0))
|
if (!vl->img || (mlx_image_to_window(vl->mlx, vl->img, 0, 0) < 0))
|
||||||
|
19
src/map.c
19
src/map.c
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 17:33:50 by houtworm #+# #+# */
|
/* Created: 2023/10/26 17:33:50 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/02 03:56:15 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/03 21:54:07 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -48,6 +48,15 @@ char ft_setplayerpos(t_varlist *vl, char dir, int y, int x)
|
|||||||
return ('0');
|
return ('0');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char ft_addsprite(t_varlist *vl, int x, int y, int type)
|
||||||
|
{
|
||||||
|
vl->sprite[vl->spritecount].x = x;
|
||||||
|
vl->sprite[vl->spritecount].y = y;
|
||||||
|
vl->sprite[vl->spritecount].type = type;
|
||||||
|
vl->spritecount++;
|
||||||
|
return ('0');
|
||||||
|
}
|
||||||
|
|
||||||
char **ft_getmap(t_varlist *vl, int fd)
|
char **ft_getmap(t_varlist *vl, int fd)
|
||||||
{
|
{
|
||||||
int y;
|
int y;
|
||||||
@ -91,13 +100,13 @@ char **ft_getmap(t_varlist *vl, int fd)
|
|||||||
else if (line[x] == 'D')
|
else if (line[x] == 'D')
|
||||||
map[y][x] = 'D';
|
map[y][x] = 'D';
|
||||||
else if (line[x] == 'C')
|
else if (line[x] == 'C')
|
||||||
map[y][x] = 'C';
|
map[y][x] = ft_addsprite(vl, x, y, 2);
|
||||||
else if (line[x] == 'B')
|
else if (line[x] == 'B')
|
||||||
map[y][x] = 'B';
|
map[y][x] = ft_addsprite(vl, x, y, 1);
|
||||||
else if (line[x] == 'X')
|
else if (line[x] == 'X')
|
||||||
map[y][x] = 'X';
|
map[y][x] = ft_addsprite(vl, x, y, 3);
|
||||||
else if (line[x] == 'K')
|
else if (line[x] == 'K')
|
||||||
map[y][x] = 'K';
|
map[y][x] = ft_addsprite(vl, x, y, 4);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ft_putstr("Invalid character on the map\n Valid options are\n");
|
ft_putstr("Invalid character on the map\n Valid options are\n");
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: djonker <codam@houtworm.net> +#+ */
|
/* By: djonker <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/27 14:36:42 by djonker #+# #+# */
|
/* Created: 2023/10/27 14:36:42 by djonker #+# #+# */
|
||||||
/* Updated: 2023/10/31 15:30:06 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/03 22:08:37 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user