Mirai's Miscellaneous Misadventures
M41 / core / cameras.c
1
2
3
4#include <mimimi/cameras.h>
5#include <mimimi/behaviors.h>
6#include <mimimi/allocators.h>
7#include <mimimi/geometry.h>
8
9struct mimimi_camera_data
10{
11 struct mimimi_allocator *allocator;
12 struct mimimi_behavior *behavior;
13 struct mimimi_position *camera;
14 struct mimimi_position *position;
15 int x, y;
16};
17
18static void mimimi_camera_behave(void *data)
19{
20 struct mimimi_camera_data *camera_data = data;
21
22 camera_data->camera->x *= 3;
23 camera_data->camera->y *= 3;
24 camera_data->camera->x += camera_data->position->x + camera_data->x;
25 camera_data->camera->y += camera_data->position->y + camera_data->y;
26 camera_data->camera->x /= 4;
27 camera_data->camera->y /= 4;
28}
29
30static void mimimi_camera_finish(void *data)
31{
32 struct mimimi_camera_data *camera_data = data;
33 mimimi_deallocate(camera_data->allocator, camera_data->behavior);
34 mimimi_deallocate(camera_data->allocator, camera_data);
35}
36
37struct mimimi_behavior *mimimi_camera(struct mimimi_position *camera, struct mimimi_position *position, int x, int y, struct mimimi_allocator *allocator)
38{
39 struct mimimi_camera_data *data = mimimi_allocate(allocator, sizeof *data);
40 data->allocator = allocator;
41 data->camera = camera;
42 data->position = position;
43
44 data->x = x;
45 data->y = y;
46
47 camera->x = position->x + x;
48 camera->y = position->y + y;
49
50 data->behavior = mimimi_allocate(allocator, sizeof *data->behavior);
51 data->behavior->behave = &mimimi_camera_behave;
52 data->behavior->finish = &mimimi_camera_finish;
53 data->behavior->data = data;
54
55 return data->behavior;
56}