From 058a8043ff29da1e49bfd3adac73c86e5646fa87 Mon Sep 17 00:00:00 2001 From: westonCoder Date: Tue, 17 Oct 2023 19:02:21 -0500 Subject: [PATCH] Made Player Movement Match Moving Platforms - store the velocity of a moving object that player is anchored to and apply that to player movement - player now keeps up with horizontal movement while jumping on moving platform Fixes #300 --- src/player/player.c | 22 +++++++++++++++++++++- src/player/player.h | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/player/player.c b/src/player/player.c index 6a8338b..2095942 100644 --- a/src/player/player.c +++ b/src/player/player.c @@ -162,6 +162,8 @@ void playerInit(struct Player* player, struct Location* startLocation, struct Ve player->body.transform = player->lookTransform; player->anchoredTo = NULL; + player->lastAnchorToPosition = gZeroVec; + player->lastAnchorToVelocity = gZeroVec; collisionObjectUpdateBB(&player->collisionObject); @@ -531,6 +533,9 @@ struct SKAnimationClip* playerDetermineNextClip(struct Player* player, float* bl #define FOOTING_CAST_DISTANCE (PLAYER_HEAD_HEIGHT + 0.2f) void playerUpdateFooting(struct Player* player, float maxStandDistance) { + if (player->anchoredTo){ + player->lastAnchorToPosition = player->anchoredTo->transform.position; + } player->anchoredTo = NULL; struct Vector3 castOffset; @@ -653,7 +658,11 @@ void playerUpdate(struct Player* player) { int isDead = playerIsDead(player); if (!isDead && (player->flags & PlayerFlagsGrounded) && controllerActionGet(ControllerActionJump)) { - player->body.velocity.y = JUMP_IMPULSE; + player->body.velocity.y += JUMP_IMPULSE; + if (!vector3IsZero(&player->lastAnchorToVelocity) && player->anchoredTo != NULL){ + player->body.velocity.x += player->lastAnchorToVelocity.x; + player->body.velocity.z += player->lastAnchorToVelocity.z; + } player->flags |= PlayerJustJumped; hudResolvePrompt(&gScene.hud, CutscenePromptTypeJump); } @@ -728,6 +737,10 @@ void playerUpdate(struct Player* player) { } targetVelocity.y = player->body.velocity.y; + if (!vector3IsZero(&player->lastAnchorToVelocity) && !(player->flags & PlayerFlagsGrounded) && !(player->anchoredTo)){ + targetVelocity.x += player->lastAnchorToVelocity.x/FIXED_DELTA_TIME; + targetVelocity.z += player->lastAnchorToVelocity.z/FIXED_DELTA_TIME; + } float velocityDot = vector3Dot(&player->body.velocity, &targetVelocity); int isAccelerating = velocityDot > 0.0f; @@ -774,6 +787,13 @@ void playerUpdate(struct Player* player) { vector3Sub(&player->body.transform.position, &player->lastAnchorPoint, &player->body.transform.position); } + if (!vector3IsZero(&player->lastAnchorToPosition) && player->anchoredTo){ + vector3Sub(&player->anchoredTo->transform.position, &player->lastAnchorToPosition, &player->lastAnchorToVelocity); + } + else if (!(player->anchoredTo) && (player->flags & PlayerFlagsGrounded)){ + player->lastAnchorToVelocity = gZeroVec; + } + struct Box3D sweptBB = player->collisionObject.boundingBox; collisionObjectUpdateBB(&player->collisionObject); box3DUnion(&sweptBB, &player->collisionObject.boundingBox, &sweptBB); diff --git a/src/player/player.h b/src/player/player.h index e80363a..04f6fda 100644 --- a/src/player/player.h +++ b/src/player/player.h @@ -44,6 +44,8 @@ struct Player { float yawVelocity; enum PlayerFlags flags; struct RigidBody* anchoredTo; + struct Vector3 lastAnchorToPosition; + struct Vector3 lastAnchorToVelocity; struct Vector3 relativeAnchor; struct Vector3 lastAnchorPoint; short flyingSoundLoopId;