Compare commits

..

7 Commits

15 changed files with 164 additions and 126 deletions

1
.ccls
View File

@ -5,3 +5,4 @@ gcc
-Isrc/ecs/components/headers -Isrc/ecs/components/headers
-Icore/src/headers -Icore/src/headers
-Iassets/asset_builder/src/headers -Iassets/asset_builder/src/headers
-DASSET_FILE_NAME="$(make print-ASSET_OUTPUT)"

View File

@ -45,3 +45,7 @@ clean:
.PHONY: run .PHONY: run
run: all run: all
$(Q)./$(SOURCE_OUTPUT) $(Q)./$(SOURCE_OUTPUT)
.PHONY: print-%
print-% :
@echo $($*)

View File

@ -1,6 +1,7 @@
ASSETS := \ ASSETS := \
player_sheets/player_idle_sheet.png \ player_sheets/player_idle_sheet.png \
player_sheets/player_walk_sheet.png player_sheets/player_walk_sheet.png \
tileset/tileset.png
ASSETS := $(addprefix $(ASSETS_DIR)/,$(ASSETS)) ASSETS := $(addprefix $(ASSETS_DIR)/,$(ASSETS))

View File

@ -6,8 +6,8 @@ ASSET_BUILDER_SOURCES := \
# Compiler and flags # Compiler and flags
ASSET_BUILDER_CC = gcc ASSET_BUILDER_CC = gcc
ASSET_BUILDER_CFLAGS = -std=c17 -pedantic -O3 $(shell pkg-config --cflags libpng) # RELEASE ASSET_BUILDER_CFLAGS = --std=c17 --pedantic -O3 $(shell pkg-config --cflags libpng) # RELEASE
#ASSET_BUILDER_CFLAGS = -std=c17 --pedantic -O0 -g $(shell pkg-config --cflags libpng) \ #ASSET_BUILDER_CFLAGS = --std=c17 --pedantic -O1 -g $(shell pkg-config --cflags libpng) \
-Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \ -Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \
-Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \ -Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \
-Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \ -Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \
@ -17,6 +17,8 @@ ASSET_BUILDER_CFLAGS = -std=c17 -pedantic -O3 $(shell pkg-config --cflags libpng
-Wold-style-definition # DEVELOPEMENT -Wold-style-definition # DEVELOPEMENT
ASSET_BUILDER_INCLUDE_DIRS = $(ASSET_BUILDER_DIR)/headers ASSET_BUILDER_INCLUDE_DIRS = $(ASSET_BUILDER_DIR)/headers
ASSET_BUILDER_INCLUDE_DIRS := $(addprefix -I, $(ASSET_BUILDER_INCLUDE_DIRS))
ASSET_BUILDER_LDFLAGS = $(shell pkg-config --libs libpng) ASSET_BUILDER_LDFLAGS = $(shell pkg-config --libs libpng)
# Deduce objects # Deduce objects
@ -47,7 +49,7 @@ $(BUILD_DIR)/$(ASSET_BUILDER_DIR)/%.o: $(ASSET_BUILDER_DIR)/%.c
$(eval CURRENT_ASSET_BUILDER_FILE := $(shell echo $$(($(CURRENT_ASSET_BUILDER_FILE)+1)))) $(eval CURRENT_ASSET_BUILDER_FILE := $(shell echo $$(($(CURRENT_ASSET_BUILDER_FILE)+1))))
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_ASSET_BUILDER_FILE)*100/$(TOTAL_ASSET_BUILDER_FILES))))) $(eval PERCENTAGE := $(shell echo $$(($(CURRENT_ASSET_BUILDER_FILE)*100/$(TOTAL_ASSET_BUILDER_FILES)))))
@echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)" @echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
$(Q)$(SRC_CC) $(SRC_CFLAGS) $(ASSET_BUILDER_INCLUDE_DIRS:%=-I%) -MMD -MP -c $< -o $@ $(Q)$(SRC_CC) $(ASSET_BUILDER_CFLAGS) $(ASSET_BUILDER_INCLUDE_DIRS) -MMD -MP -c $< -o $@
# Print ending message # Print ending message
asset_builder_end: $(ASSET_BUILDER_OUTPUT) asset_builder_end: $(ASSET_BUILDER_OUTPUT)

View File

@ -6,7 +6,7 @@
#include "errors.h" #include "errors.h"
int parse_png_for_header(const char *input_file_name, asset_header_def_t *asset_header_def); int parse_png_for_header(const char *input_file_name, asset_header_def_t *asset_header_def);
int parse_png_for_content(const char *input_file_name, FILE *output_file); int parse_png_for_content_and_write(const char *input_file_name, FILE *output_file);
int parse_file_for_header(const char *input_file_name, asset_header_def_t *asset_header_def) int parse_file_for_header(const char *input_file_name, asset_header_def_t *asset_header_def)
{ {
@ -29,19 +29,16 @@ int parse_file_for_header(const char *input_file_name, asset_header_def_t *asset
int write_header_to_file(asset_file_header_t *asset_file_header, FILE *output_file) int write_header_to_file(asset_file_header_t *asset_file_header, FILE *output_file)
{ {
size_t ret = fwrite(&asset_file_header->assets_number, sizeof(size_t), 1, output_file); if(fwrite(&asset_file_header->assets_number, sizeof(size_t), 1, output_file) != 1)
if(ret != 1)
return WRITE_FAILED; return WRITE_FAILED;
for(size_t i = 0; i < asset_file_header->assets_number; i++) for(size_t i = 0; i < asset_file_header->assets_number; i++)
{ {
size_t name_length = strlen(asset_file_header->assets_header_def[i].name) + 1; size_t name_length = strlen(asset_file_header->assets_header_def[i].name) + 1;
ret = fwrite(asset_file_header->assets_header_def[i].name, sizeof(unsigned char), name_length, output_file); if(fwrite(asset_file_header->assets_header_def[i].name, sizeof(unsigned char), name_length, output_file) != name_length)
if(ret != name_length)
return WRITE_FAILED; return WRITE_FAILED;
ret = fwrite(&asset_file_header->assets_header_def[i].start, sizeof(size_t), 1, output_file); if(fwrite(&asset_file_header->assets_header_def[i].start, sizeof(size_t), 1, output_file) != 1)
if(ret != 1)
return WRITE_FAILED; return WRITE_FAILED;
} }
@ -61,7 +58,7 @@ int parse_file_for_content_and_write(const char *input_file_name, FILE *output_f
if(!strcmp(file_name_ext, "png")) if(!strcmp(file_name_ext, "png"))
{ {
return parse_png_for_content(input_file_name, output_file); return parse_png_for_content_and_write(input_file_name, output_file);
} }
return EXTENSION_UNSUPPORTED; return EXTENSION_UNSUPPORTED;
@ -73,13 +70,16 @@ int parse_png_for_header(const char *file_name, asset_header_def_t *asset_header
FILE *input_file = fopen(file_name, "rb"); FILE *input_file = fopen(file_name, "rb");
if(!input_file) if(!input_file)
{
return OPEN_FAILED; return OPEN_FAILED;
}
// Check png autenticity. // Check png autenticity.
unsigned char sig[8]; unsigned char sig[8];
fread(sig, 1, 8, input_file); if(fread(sig, sizeof(unsigned char), 8, input_file) != 8)
{
fclose(input_file);
return READ_FAILED;
}
if(!png_check_sig(sig, 8)) if(!png_check_sig(sig, 8))
{ {
fclose(input_file); fclose(input_file);
@ -134,7 +134,7 @@ int parse_png_for_header(const char *file_name, asset_header_def_t *asset_header
// Fill asset def. // Fill asset def.
asset_header_def->start = 0; asset_header_def->start = 0;
asset_header_def->end = height * width * 3; asset_header_def->end = height * width * sizeof(uint16_t) + sizeof(size_t) * 2;
png_destroy_read_struct(&png_ptr, &info_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(input_file); fclose(input_file);
@ -142,19 +142,23 @@ int parse_png_for_header(const char *file_name, asset_header_def_t *asset_header
return NO_ERROR; return NO_ERROR;
} }
int parse_png_for_content(const char *input_file_name, FILE *output_file) int parse_png_for_content_and_write(const char *input_file_name, FILE *output_file)
{ {
FILE *input_file = fopen(input_file_name, "rb"); FILE *input_file = fopen(input_file_name, "rb");
if(!input_file) if(!input_file)
{ {
fclose(input_file);
return OPEN_FAILED; return OPEN_FAILED;
} }
// Check png autenticity. // Check png autenticity.
unsigned char sig[8]; unsigned char sig[8];
fread(sig, 1, 8, input_file); if(fread(sig, sizeof(unsigned char), 8, input_file) != 8)
{
fclose(input_file);
return READ_FAILED;
}
if(!png_check_sig(sig, 8)) if(!png_check_sig(sig, 8))
{ {
fclose(input_file); fclose(input_file);
@ -187,16 +191,14 @@ int parse_png_for_content(const char *input_file_name, FILE *output_file)
size_t row_length = png_get_rowbytes(png_ptr, info_ptr); size_t row_length = png_get_rowbytes(png_ptr, info_ptr);
// Write image size. // Write image size.
size_t ret = fwrite(&width, sizeof(size_t), 1, output_file); if(fwrite(&width, sizeof(size_t), 1, output_file) != 1)
if(!ret)
{ {
png_destroy_read_struct(&png_ptr, &info_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(input_file); fclose(input_file);
return WRITE_FAILED; return WRITE_FAILED;
} }
ret = fwrite(&height, sizeof(size_t), 1, output_file); if(fwrite(&height, sizeof(size_t), 1, output_file) != 1)
if(!ret)
{ {
png_destroy_read_struct(&png_ptr, &info_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(input_file); fclose(input_file);
@ -216,28 +218,33 @@ int parse_png_for_content(const char *input_file_name, FILE *output_file)
{ {
for(size_t j = 0; j < row_length; j += 4) for(size_t j = 0; j < row_length; j += 4)
{ {
if(pixels[i * row_length + j + 3] < 128) uint8_t r, g, b;
if(pixels[i * row_length + j + 3])
{ {
pixels[i * row_length + j] = 0xFF; r = pixels[i * row_length + j] >> 3;
pixels[i * row_length + j + 1] = 0x00; g = pixels[i * row_length + j + 1] >> 2;
pixels[i * row_length + j + 2] = 0xFF; b = pixels[i * row_length + j + 2] >> 3;
} }
else if(pixels[i * row_length + j + 3] < 255) else
{ {
pixels[i * row_length + j] = 0x80; r = 0x1F;
pixels[i * row_length + j + 1] = 0x00; g = 0x00;
pixels[i * row_length + j + 2] = 0x80; b = 0x1F;
} }
uint16_t pixel = ((r) << 11) | ((g) << 6) | b;
ret = fwrite(&pixels[i * row_length + j], sizeof(png_byte), 3, output_file); // printf("\033[48;2;%d;%d;%dm ", r << 3, g << 2, b << 3);
if(ret != 3)
if(fwrite(&pixel, sizeof(uint16_t), 1, output_file) != 1)
{ {
png_destroy_read_struct(&png_ptr, &info_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(input_file); fclose(input_file);
return WRITE_FAILED; return WRITE_FAILED;
} }
} }
// puts("\033[m");
} }
png_destroy_read_struct(&png_ptr, &info_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL);

View File

@ -6,3 +6,42 @@ void print_error(const char *content)
{ {
printf("\033[31merror\033[m: %s\n", content); printf("\033[31merror\033[m: %s\n", content);
} }
void print_error_description(error_t error)
{
switch(error)
{
case NO_EXTENSION:
print_error("file does not have an extension."); break;
case EXTENSION_UNSUPPORTED:
print_error("extension not yet supported."); break;
case OPEN_FAILED:
print_error("failed to open file."); break;
case READ_FAILED:
print_error("failed to read the input file."); break;
case WRITE_FAILED:
print_error("failed to write to output file."); break;
case BAD_SIGNATURE:
print_error("file not valid."); break;
case MEMORY_ALLOC_FAILED:
print_error("memory allocation failed."); break;
case PNG_BIT_DEPTH_UNSUPPORTED:
print_error("png bit depth not supported."); break;
case PNG_COLOR_TYPE_UNSUPPORTED:
print_error("png color type not supported."); break;
case NO_ERROR:
return;
default:
print_error("unknown error"); break;
}
}

View File

@ -6,6 +6,7 @@ typedef enum error_t {
NO_EXTENSION, NO_EXTENSION,
EXTENSION_UNSUPPORTED, EXTENSION_UNSUPPORTED,
OPEN_FAILED, OPEN_FAILED,
READ_FAILED,
WRITE_FAILED, WRITE_FAILED,
BAD_SIGNATURE, BAD_SIGNATURE,
MEMORY_ALLOC_FAILED, MEMORY_ALLOC_FAILED,
@ -17,4 +18,6 @@ typedef enum error_t {
void print_error(const char *content); void print_error(const char *content);
void print_error_description(error_t error);
#endif // ERROR_H #endif // ERROR_H

View File

@ -6,11 +6,16 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int exit_status = EXIT_SUCCESS;
FILE *output_asset_file = NULL;
// Verify arguments minimum number. // Verify arguments minimum number.
if(argc < 3) if(argc < 3)
{ {
puts("\033[33musage\033[m: asset_builder output_file input_file [input_file_2 ...]"); puts("\033[33musage\033[m: asset_builder output_file input_file [input_file_2 ...]");
return EXIT_FAILURE; exit_status = EXIT_FAILURE;
goto end;
} }
// Header size and content. // Header size and content.
@ -18,6 +23,13 @@ int main(int argc, char *argv[])
asset_file_header.assets_number = argc - 2; asset_file_header.assets_number = argc - 2;
asset_file_header.header_size = sizeof(size_t) + sizeof(size_t) * asset_file_header.assets_number; asset_file_header.header_size = sizeof(size_t) + sizeof(size_t) * asset_file_header.assets_number;
asset_file_header.assets_header_def = malloc(asset_file_header.assets_number * sizeof(asset_header_def_t)); asset_file_header.assets_header_def = malloc(asset_file_header.assets_number * sizeof(asset_header_def_t));
if(!asset_file_header.assets_header_def)
{
print_error("memory allocation failed.");
exit_status = EXIT_FAILURE;
goto end;
}
// Set assets name. // Set assets name.
for(size_t i = 0; i < asset_file_header.assets_number; i++) for(size_t i = 0; i < asset_file_header.assets_number; i++)
@ -30,22 +42,23 @@ int main(int argc, char *argv[])
const char *file_name_dot = strrchr(file_name, '.'); const char *file_name_dot = strrchr(file_name, '.');
const char *file_name_ext = file_name_dot ? file_name_dot + 1 : file_name; const char *file_name_ext = file_name_dot ? file_name_dot + 1 : file_name;
size_t asset_name_length = strlen(file_base_name) - strlen(file_name_ext) - 1; size_t asset_name_length = strlen(file_base_name) - strlen(file_name_ext);
asset_file_header.assets_header_def[i].name = malloc(asset_name_length); asset_file_header.assets_header_def[i].name = malloc(asset_name_length);
strncpy(asset_file_header.assets_header_def[i].name, file_base_name, asset_name_length); asset_file_header.assets_header_def[i].name[asset_name_length - 1] = '\0';
strncpy(asset_file_header.assets_header_def[i].name, file_base_name, asset_name_length - 1);
// Update header size. // Update header size.
asset_file_header.header_size += asset_name_length + 1; asset_file_header.header_size += asset_name_length;
} }
// Parse input files to create header structure and fill output file. // Parse input files to create header structure and fill output file.
FILE *output_asset_file = fopen(argv[1], "wb"); output_asset_file = fopen(argv[1], "wb");
if(!output_asset_file) if(!output_asset_file)
{ {
print_error("could not create output file."); print_error("could not create output file.");
return EXIT_FAILURE; exit_status = EXIT_FAILURE;
goto end;
} }
for(size_t i = 0; i < asset_file_header.assets_number; i++) for(size_t i = 0; i < asset_file_header.assets_number; i++)
@ -54,39 +67,14 @@ int main(int argc, char *argv[])
if(ret) if(ret)
{ {
switch(ret) print_error_description(ret);
{
case NO_EXTENSION:
print_error("file does not have an extension."); break;
case EXTENSION_UNSUPPORTED: exit_status = EXIT_FAILURE;
print_error("extension not yet supported."); break; goto end;
case OPEN_FAILED:
print_error("failed to open file."); break;
case BAD_SIGNATURE:
print_error("file not valid."); break;
case MEMORY_ALLOC_FAILED:
print_error("memory allocation failed."); break;
case PNG_BIT_DEPTH_UNSUPPORTED:
print_error("png bit depth not supported."); break;
case PNG_COLOR_TYPE_UNSUPPORTED:
print_error("png color type not supported."); break;
default:
print_error("unknown error"); break;
}
fclose(output_asset_file);
return EXIT_FAILURE;
} }
// Calculate absolute position of assets in the file. // Calculate absolute position of assets in the file.
if(i) asset_file_header.assets_header_def[i].start = asset_file_header.assets_header_def[i - 1].end + 1; if(i) asset_file_header.assets_header_def[i].start = asset_file_header.assets_header_def[i - 1].end;
else asset_file_header.assets_header_def[0].start = asset_file_header.header_size; else asset_file_header.assets_header_def[0].start = asset_file_header.header_size;
asset_file_header.assets_header_def[i].end += asset_file_header.assets_header_def[i].start; asset_file_header.assets_header_def[i].end += asset_file_header.assets_header_def[i].start;
} }
@ -94,8 +82,8 @@ int main(int argc, char *argv[])
if(write_header_to_file(&asset_file_header, output_asset_file)) if(write_header_to_file(&asset_file_header, output_asset_file))
{ {
print_error("can't write to output file."); print_error("can't write to output file.");
fclose(output_asset_file); exit_status = EXIT_FAILURE;
return EXIT_FAILURE; goto end;
} }
for(size_t i = 0; i < asset_file_header.assets_number; i++) for(size_t i = 0; i < asset_file_header.assets_number; i++)
@ -104,40 +92,24 @@ int main(int argc, char *argv[])
if(ret) if(ret)
{ {
switch(ret) print_error_description(ret);
{
case NO_EXTENSION:
print_error("file does not have an extension."); break;
case EXTENSION_UNSUPPORTED: exit_status = EXIT_FAILURE;
print_error("extension not yet supported."); break; goto end;
case OPEN_FAILED:
print_error("failed to open file."); break;
case WRITE_FAILED:
print_error("failed to write to output file."); break;
case BAD_SIGNATURE:
print_error("file not valid."); break;
case MEMORY_ALLOC_FAILED:
print_error("memory allocation failed."); break;
case PNG_BIT_DEPTH_UNSUPPORTED:
print_error("png bit depth not supported."); break;
case PNG_COLOR_TYPE_UNSUPPORTED:
print_error("png color type not supported."); break;
default:
print_error("unknown error"); break;
}
fclose(output_asset_file);
return EXIT_FAILURE;
} }
} }
return EXIT_SUCCESS; end:
if(asset_file_header.assets_header_def)
{
for(size_t i = 0; i < asset_file_header.assets_number; i++)
free(asset_file_header.assets_header_def[i].name);
free(asset_file_header.assets_header_def);
}
if(output_asset_file)
fclose(output_asset_file);
return exit_status;
} }

View File

@ -4,15 +4,16 @@ stdenv.mkDerivation {
nativeBuildInputs = [ nativeBuildInputs = [
gnumake gnumake
gcc gcc
gdb
pkg-config pkg-config
valgrind
]; ];
buildInputs = [ buildInputs = [
SDL2 SDL2
SDL2_image
libpng libpng
]; ];
# shellHook = '' shellHook = ''
# export LD_LIBRARY_PATH=${pkgs.SDL2}/lib:${pkgs.SDL2_image}/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=${pkgs.SDL2}/lib:${pkgs.sdl3}/lib:${pkgs.libpng}/lib:$LD_LIBRARY_PATH
# export PKG_CONFIG_PATH=${pkgs.SDL2}/lib/pkgconfig:${pkgs.SDL2_image}/lib/pkgconfig:$PKG_CONFIG_PATH export PKG_CONFIG_PATH=${pkgs.SDL2}/lib/pkgconfig:${pkgs.libpng}/lib/pkgconfig:$PKG_CONFIG_PATH
# ''; '';
} }

View File

@ -10,8 +10,8 @@ SOURCES := \
# Compiler and flags # Compiler and flags
SRC_CC = gcc SRC_CC = gcc
#SRC_CFLAGS = -std=c17 -pedantic -O3 # RELEASE #SRC_CFLAGS = --std=c17 --pedantic -O3 # RELEASE
SRC_CFLAGS = -std=c17 --pedantic -O0 -g \ SRC_CFLAGS = --std=c17 --pedantic -O1 -g \
-Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \ -Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \
-Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \ -Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \
-Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \ -Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \
@ -20,7 +20,9 @@ SRC_CFLAGS = -std=c17 --pedantic -O0 -g \
-Wfloat-equal -Wstrict-aliasing=2 -Wredundant-decls \ -Wfloat-equal -Wstrict-aliasing=2 -Wredundant-decls \
-Wold-style-definition # DEVELOPEMENT -Wold-style-definition # DEVELOPEMENT
SRC_INCLUDE_DIRS = $(SOURCE_DIR)/headers $(SOURCE_DIR)/ecs/headers $(SOURCE_DIR)/ecs/components/headers $(CORE_DIR)/$(CORE_SRC_DIR)/headers SRC_INCLUDE_DIRS = $(SOURCE_DIR)/headers $(SOURCE_DIR)/ecs/headers $(SOURCE_DIR)/ecs/components/headers $(CORE_DIR)/headers
SRC_INCLUDE_DIRS := $(addprefix -I, $(SRC_INCLUDE_DIRS))
SRC_LDFLAGS = SRC_LDFLAGS =
# Deduce objects # Deduce objects
@ -44,14 +46,14 @@ count_src_build:
# Link game target # Link game target
$(SOURCE_OUTPUT): $(SOURCE_OBJECTS) $(CORE_OUTPUT) $(SOURCE_OUTPUT): $(SOURCE_OBJECTS) $(CORE_OUTPUT)
@echo -e "[100%] $(YELLOW)Linking $(notdir $(SOURCE_OUTPUT))$(RESET)" @echo -e "[100%] $(YELLOW)Linking $(notdir $(SOURCE_OUTPUT))$(RESET)"
$(Q)$(SRC_CC) $(SOURCE_OBJECTS) -L./$(BUILD_DIR) $(CORE_OUTPUT) $(CORE_DEPS_FLAGS) -o $@ $(SRC_LDFLAGS) $(Q)$(SRC_CC) $(SOURCE_OBJECTS) -L./$(BUILD_DIR) $(CORE_OUTPUT) -o $@ $(SRC_LDFLAGS) $(CORE_DEPS_FLAGS)
# Build .o files # Build .o files
$(BUILD_DIR)/$(SOURCE_DIR)/%.o: $(SOURCE_DIR)/%.c $(BUILD_DIR)/$(SOURCE_DIR)/%.o: $(SOURCE_DIR)/%.c
$(eval CURRENT_SRC_FILE := $(shell echo $$(($(CURRENT_SRC_FILE)+1)))) $(eval CURRENT_SRC_FILE := $(shell echo $$(($(CURRENT_SRC_FILE)+1))))
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_SRC_FILE)*100/$(TOTAL_SRC_FILES))))) $(eval PERCENTAGE := $(shell echo $$(($(CURRENT_SRC_FILE)*100/$(TOTAL_SRC_FILES)))))
@echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)" @echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
$(Q)$(SRC_CC) $(SRC_CFLAGS) $(SRC_INCLUDE_DIRS:%=-I%) -MMD -MP -c $< -o $@ $(Q)$(SRC_CC) $(SRC_CFLAGS) $(SRC_INCLUDE_DIRS) -MMD -MP -c $< -o $@
# Print ending message # Print ending message
src_end: $(SOURCE_OUTPUT) src_end: $(SOURCE_OUTPUT)

View File

@ -7,18 +7,18 @@
typedef struct animation_system_data_t { typedef struct animation_system_data_t {
sprite_component_data_t *sprite_component_data; sprite_component_data_t *sprite_component_data;
bool play :1;
bool loop :1;
bool reverse :1;
float frame_delay_ms;
float frame_timer_ms;
elem_t *actual_frame; elem_t *actual_frame;
size_t actual_frame_nb; size_t actual_frame_nb;
size_t nb_frames; size_t nb_frames;
linked_list_t frames; linked_list_t frames;
float frame_delay_ms;
float frame_timer_ms;
bool play :1;
bool loop :1;
bool reverse :1;
} animation_system_data_t; } animation_system_data_t;
void animation_system_init(component_t *component, va_list args); void animation_system_init(component_t *component, va_list args);

View File

@ -15,6 +15,9 @@ void player_system_init(component_t *component, va_list args __attribute__((unus
system_data->transform_component_data = system_data->sprite_component_data->transform_component_data; system_data->transform_component_data = system_data->sprite_component_data->transform_component_data;
system_data->state = PLAYER_IDLE; system_data->state = PLAYER_IDLE;
asset_manager_load_asset(&game.asset_manager, "player_idle_sheet", ASSET_TEXTURE);
asset_manager_load_asset(&game.asset_manager, "player_walk_sheet", ASSET_TEXTURE);
} }
// Only for this file // Only for this file
@ -84,5 +87,7 @@ void player_system_update(component_t *component)
void player_system_destroy(component_t *component) void player_system_destroy(component_t *component)
{ {
asset_manager_let_go_asset(&game.asset_manager, "player_idle_sheet");
asset_manager_let_go_asset(&game.asset_manager, "player_walk_sheet");
free(component->component_data); free(component->component_data);
} }

View File

@ -19,12 +19,10 @@ typedef void (*component_init_t)(component_t *component, va_list args);
typedef void (*component_update_t)(component_t *component); typedef void (*component_update_t)(component_t *component);
// Component draw function. It is called in the main loop to draw the component on screen. This function is not necessary. // Component draw function. It is called in the main loop to draw the component on screen. This function is not necessary.
typedef void (*component_draw_t)(component_t *component); typedef void (*component_draw_t)(component_t *component);
// Component deleter function. It is called when the component is removed. It should free the data in the component data but not the component data itself. // Component deleter function. It is called when the component is removed. It should free the data in the component data but not the component itself.
typedef void (*component_deleter_t)(component_t *component); typedef void (*component_deleter_t)(component_t *component);
typedef struct component_t { typedef struct component_t {
component_type_t component_type;
component_init_t component_init; component_init_t component_init;
component_update_t component_update; component_update_t component_update;
component_draw_t component_draw; component_draw_t component_draw;
@ -34,6 +32,9 @@ typedef struct component_t {
component_deleter_t component_deleter; component_deleter_t component_deleter;
struct entity_t *entity; struct entity_t *entity;
component_type_t component_type;
} component_t; } component_t;
component_t *create_component(component_type_t component_type); component_t *create_component(component_type_t component_type);

View File

@ -5,8 +5,8 @@
#include <vector2d.h> #include <vector2d.h>
typedef struct events_t { typedef struct events_t {
bool keys[MAX_KEYCODES];
vector2d_t cursor_pos; vector2d_t cursor_pos;
bool keys[MAX_KEYCODES];
} events_t; } events_t;
#endif // EVENTS_H #endif // EVENTS_H

View File

@ -18,12 +18,12 @@
* @param delta_time_ms Frame time * @param delta_time_ms Frame time
*/ */
typedef struct game_t { typedef struct game_t {
events_t events;
asset_manager_t asset_manager; asset_manager_t asset_manager;
entity_manager_t entity_manager; entity_manager_t entity_manager;
events_t events;
bool is_running;
float delta_time_ms; float delta_time_ms;
bool is_running;
} game_t; } game_t;
// Global game instance // Global game instance