Lock camera to the bounds of the world
This commit is contained in:
parent
f6ada44b41
commit
ebcdd779b9
@ -125,6 +125,11 @@ void worldTraveller_gameInit(GameState *state, v2i windowSize)
|
|||||||
CAST(Entity *) calloc(world->maxEntities, sizeof(Entity));
|
CAST(Entity *) calloc(world->maxEntities, sizeof(Entity));
|
||||||
world->texType = texlist_terrain;
|
world->texType = texlist_terrain;
|
||||||
|
|
||||||
|
v2 worldDimensionInTilesf = V2(CAST(f32) worldDimensionInTiles.x,
|
||||||
|
CAST(f32) worldDimensionInTiles.y);
|
||||||
|
world->bounds = getRect(V2(0, 0), v2_scale(worldDimensionInTilesf,
|
||||||
|
CAST(f32) state->tileSize));
|
||||||
|
|
||||||
TexAtlas *const atlas =
|
TexAtlas *const atlas =
|
||||||
asset_getTextureAtlas(assetManager, world->texType);
|
asset_getTextureAtlas(assetManager, world->texType);
|
||||||
|
|
||||||
@ -295,7 +300,7 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
|
|||||||
f32 heroSpeed = CAST(f32)(22.0f * METERS_TO_PIXEL); // m/s^2
|
f32 heroSpeed = CAST(f32)(22.0f * METERS_TO_PIXEL); // m/s^2
|
||||||
if (state->keys[GLFW_KEY_LEFT_SHIFT])
|
if (state->keys[GLFW_KEY_LEFT_SHIFT])
|
||||||
{
|
{
|
||||||
heroSpeed = CAST(f32)(22.0f * 5.0f * METERS_TO_PIXEL);
|
heroSpeed = CAST(f32)(22.0f * 10.0f * METERS_TO_PIXEL);
|
||||||
}
|
}
|
||||||
ddPos = v2_scale(ddPos, heroSpeed);
|
ddPos = v2_scale(ddPos, heroSpeed);
|
||||||
|
|
||||||
@ -373,6 +378,25 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt)
|
|||||||
/* Render entities */
|
/* Render entities */
|
||||||
ASSERT(world->freeEntityIndex < world->maxEntities);
|
ASSERT(world->freeEntityIndex < world->maxEntities);
|
||||||
v4 cameraBounds = getRect(world->cameraPos, renderer->size);
|
v4 cameraBounds = getRect(world->cameraPos, renderer->size);
|
||||||
|
|
||||||
|
// NOTE(doyle): Lock camera if it passes the bounds of the world
|
||||||
|
if (cameraBounds.x <= world->bounds.x)
|
||||||
|
{
|
||||||
|
cameraBounds.x = world->bounds.x;
|
||||||
|
cameraBounds.z = cameraBounds.x + renderer->size.w;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(doyle): Do the Y component when we need it
|
||||||
|
if (cameraBounds.y >= world->bounds.y) cameraBounds.y = world->bounds.y;
|
||||||
|
|
||||||
|
if (cameraBounds.z >= world->bounds.z)
|
||||||
|
{
|
||||||
|
cameraBounds.z = world->bounds.z;
|
||||||
|
cameraBounds.x = cameraBounds.z - renderer->size.w;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cameraBounds.w <= world->bounds.w) cameraBounds.w = world->bounds.w;
|
||||||
|
|
||||||
for (i32 i = 0; i < world->freeEntityIndex; i++)
|
for (i32 i = 0; i < world->freeEntityIndex; i++)
|
||||||
{
|
{
|
||||||
Entity *const entity = &world->entities[i];
|
Entity *const entity = &world->entities[i];
|
||||||
|
@ -22,7 +22,8 @@ typedef struct World
|
|||||||
|
|
||||||
enum TexList texType;
|
enum TexList texType;
|
||||||
|
|
||||||
v2 cameraPos;
|
v2 cameraPos; // In pixels
|
||||||
|
v4 bounds; // In pixels
|
||||||
|
|
||||||
i32 heroIndex;
|
i32 heroIndex;
|
||||||
i32 freeEntityIndex;
|
i32 freeEntityIndex;
|
||||||
|
Loading…
Reference in New Issue
Block a user