]> git.lizzy.rs Git - nothing.git/blob - src/platforms.c
Merge pull request #14 from tsoding/joystick
[nothing.git] / src / platforms.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <string.h>
5
6 #include <SDL2/SDL.h>
7
8 #include "./platforms.h"
9
10 struct platforms_t {
11     struct rect_t *rects;
12     size_t rects_size;
13 };
14
15 struct platforms_t *create_platforms(const struct rect_t *rects, size_t rects_size)
16 {
17     assert(rects);
18
19     struct platforms_t *platforms = malloc(sizeof(struct platforms_t));
20
21     if (platforms == NULL) {
22         goto platforms_malloc_fail;
23     }
24
25     platforms->rects = malloc(sizeof(struct rect_t) * rects_size);
26
27     if (platforms->rects == NULL) {
28         goto platforms_rects_malloc_fail;
29     }
30
31     platforms->rects = memcpy(platforms->rects, rects, sizeof(struct rect_t) * rects_size);
32     platforms->rects_size = rects_size;
33
34     return platforms;
35
36 platforms_rects_malloc_fail:
37     free(platforms);
38 platforms_malloc_fail:
39     return NULL;
40 }
41
42 void destroy_platforms(struct platforms_t *platforms)
43 {
44     assert(platforms);
45
46     free(platforms->rects);
47     free(platforms);
48 }
49
50 int render_platforms(const struct platforms_t *platforms,
51                      SDL_Renderer *renderer)
52 {
53     if (SDL_SetRenderDrawColor(renderer, 255, 96, 96, 255) < 0) {
54         return -1;
55     }
56
57     SDL_Rect rect;
58
59     for (size_t i = 0; i < platforms->rects_size; ++i) {
60         rect.x = (int)roundf(platforms->rects[i].x);
61         rect.y = (int)roundf(platforms->rects[i].y);
62         rect.w = (int)roundf(platforms->rects[i].w);
63         rect.h = (int)roundf(platforms->rects[i].h);
64
65         if (SDL_RenderFillRect(renderer, &rect) < 0) {
66             return -1;
67         }
68     }
69
70     return 0;
71 }
72
73 int platforms_rect_object_collide(const struct platforms_t *platforms,
74                                   const struct rect_t *object)
75 {
76     assert(platforms);
77     assert(object);
78
79     for (size_t i = 0; i < platforms->rects_size; ++i) {
80         if (rects_intersect(object, &platforms->rects[i])) {
81             return 1;
82         }
83     }
84
85     return 0;
86 }