From c02b8cfab07197b0b37960debfe5c3499e816ff8 Mon Sep 17 00:00:00 2001 From: outfrost Date: Wed, 15 Jul 2020 05:13:58 +0200 Subject: [PATCH] Preparation for player obstacle detection --- src/game/level.c | 32 +++++++++++++++++--------------- src/game/level.h | 15 +++++++++++++++ src/game/player.c | 20 ++++++++++++++++++++ 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/game/level.c b/src/game/level.c index 0544ba8..c814e4e 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -21,16 +21,14 @@ static Block blockWall01 = { .type = BLOCKTYPE_OBSTACLE, static Transform playerSpawnTransform; static void buildLevelFromImage(const TgaImage* image); -static inline Block* getBlockFromGrid(BlockGrid grid, size_t x, size_t z); -static inline void setBlockInGrid(BlockGrid grid, size_t x, size_t z, Block* block); void initLevel() { playerSpawnTransform = identity(); - translate(&playerSpawnTransform, (Vector) { .x = -BLOCKGRID_CELL_SIZE, - .y = 0.0f, - .z = -BLOCKGRID_CELL_SIZE }); + translate(&playerSpawnTransform, (Vector) { -BLOCKGRID_CELL_SIZE, + 0.0f, + -BLOCKGRID_CELL_SIZE }); blockWall01.solid = importSolid("assets/wall01.3ds"); @@ -41,9 +39,10 @@ void initLevel() { for (size_t z = 0; z < levelGrid.depth; ++z) { for (size_t x = 0; x < levelGrid.width; ++x) { Scene* blockScene = newScene(); - translate(&blockScene->transform, (Vector) { .x = x * BLOCKGRID_CELL_SIZE, - .y = 0.0f, - .z = z * BLOCKGRID_CELL_SIZE }); + translate(&blockScene->transform, (Vector) { + (x * BLOCKGRID_CELL_SIZE) + (BLOCKGRID_CELL_SIZE * 0.5f), + 0.0f, + (z * BLOCKGRID_CELL_SIZE) + (BLOCKGRID_CELL_SIZE * 0.5f) }); blockScene->solid = getBlockFromGrid(levelGrid, x, z)->solid; insertChildScene(levelScene, blockScene); } @@ -87,9 +86,10 @@ static void buildLevelFromImage(const TgaImage* image) { case 0xFF00FFFF: block = &blockEmpty; playerSpawnTransform = identity(); - translate(&playerSpawnTransform, (Vector) { .x = x * BLOCKGRID_CELL_SIZE, - .y = 0.0f, - .z = z * BLOCKGRID_CELL_SIZE }); + translate(&playerSpawnTransform, (Vector) { + (x * BLOCKGRID_CELL_SIZE) + (BLOCKGRID_CELL_SIZE * 0.5f), + 0.0f, + (z * BLOCKGRID_CELL_SIZE) + (BLOCKGRID_CELL_SIZE * 0.5f) }); break; default: block = &blockEmpty; @@ -102,10 +102,12 @@ static void buildLevelFromImage(const TgaImage* image) { levelGrid = newGrid; } -static inline Block* getBlockFromGrid(BlockGrid grid, size_t x, size_t z) { - return grid.blocks[(z * grid.width) + x]; +static inline size_t nonNegative(long n) { + return n < 0 ? 0u : n; } -static inline void setBlockInGrid(BlockGrid grid, size_t x, size_t z, Block* block) { - grid.blocks[(z * grid.width) + x] = block; +GridLocation gridLocationFromTransform(Transform transform) { + Vector scaledPos = scaleVector(translationOf(transform), 1.0f / BLOCKGRID_CELL_SIZE); + return (GridLocation) { .x = nonNegative(scaledPos.x), + .z = nonNegative(scaledPos.z) }; } diff --git a/src/game/level.h b/src/game/level.h index 097b73a..3ce8241 100644 --- a/src/game/level.h +++ b/src/game/level.h @@ -15,6 +15,7 @@ enum BlockType { typedef enum BlockType BlockType; typedef struct Block Block; typedef struct BlockGrid BlockGrid; +typedef struct GridLocation GridLocation; struct Block { BlockType type; @@ -27,9 +28,23 @@ struct BlockGrid { Block** blocks; }; +struct GridLocation { + size_t x; + size_t z; +}; + extern BlockGrid levelGrid; void initLevel(); void startLevel(); +GridLocation gridLocationFromTransform(Transform transform); + +static inline Block* getBlockFromGrid(BlockGrid grid, size_t x, size_t z) { + return grid.blocks[(z * grid.width) + x]; +} + +static inline void setBlockInGrid(BlockGrid grid, size_t x, size_t z, Block* block) { + grid.blocks[(z * grid.width) + x] = block; +} #endif // LEVEL_H_ diff --git a/src/game/player.c b/src/game/player.c index 432341c..f5dcac7 100644 --- a/src/game/player.c +++ b/src/game/player.c @@ -3,6 +3,8 @@ #include "engine/asset.h" #include "engine/render.h" +#include "level.h" + static const float movementSpeed = 2.5f; Scene* playerCharacter; @@ -65,6 +67,24 @@ void stopMovement(Direction direction) { static void movePlayer(Vector direction, float delta) { direction = clampMagnitude(direction, 1.0f); Vector displacement = scaleVector(direction, delta * movementSpeed); + + + //GridLocation location = gridLocationFromTransform(playerCharacter->transform); + + if (displacement.x >= 0) { + // need to test +X edge + } + if (displacement.x <= 0) { + // need to test -X edge + } + if (displacement.z >= 0) { + // need to test +Z edge + } + if (displacement.z <= 0) { + // need to test -Z edge + } + + translate(&playerCharacter->transform, displacement); } -- 2.44.0