camera follow player + lerp
parent
51c31d9777
commit
2ddf1e48fd
|
@ -3,6 +3,8 @@
|
||||||
#include "entity_view.h"
|
#include "entity_view.h"
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
|
|
||||||
|
#define CAMERA_LERP_FACTOR 0.06
|
||||||
|
|
||||||
static camera main_camera;
|
static camera main_camera;
|
||||||
|
|
||||||
void camera_reset(void) {
|
void camera_reset(void) {
|
||||||
|
@ -13,11 +15,13 @@ void camera_reset(void) {
|
||||||
void camera_update(void) {
|
void camera_update(void) {
|
||||||
switch (main_camera.mode) {
|
switch (main_camera.mode) {
|
||||||
case CAMERA_MODE_FOLLOW: {
|
case CAMERA_MODE_FOLLOW: {
|
||||||
entity_view *view = entity_view_get(game_world_view_get_active(), main_camera.ent_id);
|
world_view *world = game_world_view_get_active();
|
||||||
|
if (!world) break;
|
||||||
|
entity_view *view = entity_view_get(&world->entities, main_camera.ent_id);
|
||||||
if (!view) break;
|
if (!view) break;
|
||||||
|
|
||||||
main_camera.x = view->x;
|
main_camera.x = zpl_lerp(main_camera.x, view->x, CAMERA_LERP_FACTOR);
|
||||||
main_camera.y = view->y;
|
main_camera.y = zpl_lerp(main_camera.y, view->y, CAMERA_LERP_FACTOR);
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
|
|
|
@ -71,6 +71,16 @@ world_view *game_world_view_get_active(void) {
|
||||||
return active_viewer;
|
return active_viewer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void game_world_view_set_active_by_idx(uint16_t idx) {
|
||||||
|
ZPL_ASSERT(idx >= 0 && idx < zpl_buffer_count(world_viewers));
|
||||||
|
game_world_view_set_active(&world_viewers[idx]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void game_world_view_set_active(world_view *view) {
|
||||||
|
active_viewer = view;
|
||||||
|
camera_set_follow(view->owner_id);
|
||||||
|
}
|
||||||
|
|
||||||
void flecs_dash_init() {
|
void flecs_dash_init() {
|
||||||
ECS_IMPORT(world_ecs(), FlecsDash);
|
ECS_IMPORT(world_ecs(), FlecsDash);
|
||||||
ECS_IMPORT(world_ecs(), FlecsSystemsCivetweb);
|
ECS_IMPORT(world_ecs(), FlecsSystemsCivetweb);
|
||||||
|
@ -131,6 +141,7 @@ void game_update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void game_render() {
|
void game_render() {
|
||||||
|
camera_update();
|
||||||
platform_render();
|
platform_render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,4 +12,6 @@ void game_update();
|
||||||
void game_render();
|
void game_render();
|
||||||
|
|
||||||
world_view *game_world_view_get_active(void);
|
world_view *game_world_view_get_active(void);
|
||||||
world_view *game_world_view_get(uint16_t idx);
|
world_view *game_world_view_get(uint16_t idx);
|
||||||
|
void game_world_view_set_active_by_idx(uint16_t idx);
|
||||||
|
void game_world_view_set_active(world_view *view);
|
||||||
|
|
|
@ -37,5 +37,6 @@ int32_t pkt_01_welcome_handler(pkt_header *header) {
|
||||||
|
|
||||||
zpl_printf("[INFO] initializing read-only world view ...\n");
|
zpl_printf("[INFO] initializing read-only world view ...\n");
|
||||||
world_view_init(view, table.ent_id, table.block_size, table.chunk_size, table.world_size);
|
world_view_init(view, table.ent_id, table.block_size, table.chunk_size, table.world_size);
|
||||||
|
game_world_view_set_active(view);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue