summaryrefslogtreecommitdiff
path: root/spritesheet.c
diff options
context:
space:
mode:
Diffstat (limited to 'spritesheet.c')
-rw-r--r--spritesheet.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/spritesheet.c b/spritesheet.c
new file mode 100644
index 0000000..dcf4780
--- /dev/null
+++ b/spritesheet.c
@@ -0,0 +1,62 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* spritesheet.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: kdx <kdx @student.42angouleme.fr +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/10/12 09:43:47 by kdx #+# #+# */
+/* Updated: 2022/10/12 10:25:23 by kdx ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft/libft.h"
+#include "spritesheet.h"
+#include "sprite.h"
+#include "map.h"
+
+static t_sprite *load_sprite(t_sily *sily, char *path)
+{
+ return (sprite_load(sily, path, TSIZE, TSIZE));
+}
+
+t_spritesheet *spritesheet_load(t_sily *sily, const char *pattern,
+ size_t frames)
+{
+ t_spritesheet *sheet;
+ size_t i;
+ char *path;
+ char *path_x;
+
+ if (frames > 10 || ft_strchr(pattern, 'X') == NULL)
+ return (NULL);
+ path = ft_strdup(pattern);
+ if (path == NULL)
+ return (NULL);
+ path_x = ft_strchr(path, 'X');
+ if (ft_alloc(&sheet, sizeof(t_spritesheet)))
+ return (ft_free(path));
+ i = -1;
+ while (++i < frames)
+ {
+ *path_x = '0' + i;
+ sheet->frame[sheet->frame_count] = load_sprite(sily, path);
+ if (sheet->frame[sheet->frame_count] == NULL)
+ ft_free(path);
+ if (sheet->frame[sheet->frame_count++] == NULL)
+ return (spritesheet_destroy(sily, sheet));
+ }
+ ft_free(path);
+ return (sheet);
+}
+
+void *spritesheet_destroy(t_sily *sily, t_spritesheet *sheet)
+{
+ if (sheet != NULL)
+ {
+ while (sheet->frame_count-- > 0)
+ sprite_destroy(sily, sheet->frame[sheet->frame_count]);
+ ft_free(sheet);
+ }
+ return (NULL);
+}