Mirai's Miscellaneous Misadventures
M36 / core / cameras.c
#include <mimimi/cameras.h>
#include <mimimi/behaviors.h>
#include <mimimi/allocators.h>
#include <mimimi/geometry.h>
struct mimimi_camera_data
{
struct mimimi_allocator *allocator;
struct mimimi_behavior *behavior;
struct mimimi_position *camera;
struct mimimi_position *position;
int x, y;
};
static void mimimi_camera_behave(void *data)
{
struct mimimi_camera_data *camera_data = data;
camera_data->camera->x *= 3;
camera_data->camera->y *= 3;
camera_data->camera->x += camera_data->position->x + camera_data->x;
camera_data->camera->y += camera_data->position->y + camera_data->y;
camera_data->camera->x /= 4;
camera_data->camera->y /= 4;
}
static void mimimi_camera_finish(void *data)
{
struct mimimi_camera_data *camera_data = data;
mimimi_deallocate(camera_data->allocator, camera_data->behavior);
mimimi_deallocate(camera_data->allocator, camera_data);
}
struct mimimi_behavior *mimimi_camera(struct mimimi_position *camera, struct mimimi_position *position, int x, int y, struct mimimi_allocator *allocator)
{
struct mimimi_camera_data *data = mimimi_allocate(allocator, sizeof *data);
data->allocator = allocator;
data->camera = camera;
data->position = position;
data->x = x;
data->y = y;
camera->x = position->x + x;
camera->y = position->y + y;
data->behavior = mimimi_allocate(allocator, sizeof *data->behavior);
data->behavior->behave = &mimimi_camera_behave;
data->behavior->finish = &mimimi_camera_finish;
data->behavior->data = data;
return data->behavior;
}