From a24f7acec5a2b582d9710eaa059ea374bfb5dd7f Mon Sep 17 00:00:00 2001 From: Weston Salinas Date: Wed, 1 Mar 2023 17:05:41 -0600 Subject: [PATCH] Added Crouching Functionality - Added crouch to Right C button - Removed movement being from other c buttons - Added a new player flag for "crouched" --- src/physics/collision_object.c | 6 ++++ src/physics/collision_object.h | 1 + src/player/player.c | 52 +++++++++++++++++++++++++++++++--- src/player/player.h | 1 + 4 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/physics/collision_object.c b/src/physics/collision_object.c index cae8029..ebf04fb 100644 --- a/src/physics/collision_object.c +++ b/src/physics/collision_object.c @@ -17,6 +17,12 @@ void collisionObjectInit(struct CollisionObject* object, struct ColliderTypeData object->manifoldIds = 0; } +void collisionObjectReInit(struct CollisionObject* object, struct ColliderTypeData *collider, struct RigidBody* body, float mass, int collisionLayers) { + object->collider = collider; + object->body = body; + collisionObjectUpdateBB(object); +} + int collisionObjectIsActive(struct CollisionObject* object) { return object->body && ((object->body->flags & (RigidBodyIsKinematic | RigidBodyIsSleeping)) == 0); } diff --git a/src/physics/collision_object.h b/src/physics/collision_object.h index 6e9e4b2..87d724b 100644 --- a/src/physics/collision_object.h +++ b/src/physics/collision_object.h @@ -39,6 +39,7 @@ int collisionObjectIsActive(struct CollisionObject* object); int collisionObjectShouldGenerateConctacts(struct CollisionObject* object); void collisionObjectInit(struct CollisionObject* object, struct ColliderTypeData *collider, struct RigidBody* body, float mass, int collisionLayers); +void collisionObjectReInit(struct CollisionObject* object, struct ColliderTypeData *collider, struct RigidBody* body, float mass, int collisionLayers); void collisionObjectCollideWithQuad(struct CollisionObject* object, struct CollisionObject* quad, struct ContactSolver* contactSolver); void collisionObjectCollideWithQuadSwept(struct CollisionObject* object, struct Vector3* objectPrevPos, struct Box3D* sweptBB, struct CollisionObject* quadObject, struct ContactSolver* contactSolver); diff --git a/src/player/player.c b/src/player/player.c index f6ee813..5211bac 100644 --- a/src/player/player.c +++ b/src/player/player.c @@ -56,6 +56,22 @@ struct ColliderTypeData gPlayerColliderData = { &gCollisionCylinderCallbacks, }; +struct CollisionCylinder gCrouchingPlayerCollider = { + 0.25f, + 0.40f, + gPlayerColliderEdgeVectors, + sizeof(gPlayerColliderEdgeVectors) / sizeof(*gPlayerColliderEdgeVectors), + gPlayerColliderFaces, +}; + +struct ColliderTypeData gCrouchingPlayerColliderData = { + CollisionShapeTypeCylinder, + &gCrouchingPlayerCollider, + 0.0f, + 0.6f, + &gCollisionCylinderCallbacks, +}; + void playerRender(void* data, struct DynamicRenderDataList* renderList, struct RenderState* renderState) { struct Player* player = (struct Player*)data; @@ -446,18 +462,45 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) { struct Vector3 targetVelocity = gZeroVec; + float camera_y_modifier = 0.0; + if (player->flags & PlayerCrouched){ + camera_y_modifier = -0.25; + } + else{ + camera_y_modifier = 0.0; + } + if (!isDead) { - if (controllerGetButton(0, L_CBUTTONS | L_JPAD)) { + if (controllerGetButton(0, L_JPAD)) { vector3AddScaled(&targetVelocity, &right, -PLAYER_SPEED, &targetVelocity); - } else if (controllerGetButton(0, R_CBUTTONS | R_JPAD)) { + } else if (controllerGetButton(0, R_JPAD)) { vector3AddScaled(&targetVelocity, &right, PLAYER_SPEED, &targetVelocity); } - if (controllerGetButton(0, U_CBUTTONS | U_JPAD)) { + if (controllerGetButton(0, U_JPAD)) { vector3AddScaled(&targetVelocity, &forward, -PLAYER_SPEED, &targetVelocity); - } else if (controllerGetButton(0, D_CBUTTONS | D_JPAD)) { + } else if (controllerGetButton(0, D_JPAD)) { vector3AddScaled(&targetVelocity, &forward, PLAYER_SPEED, &targetVelocity); } + + // if player isnt crouched, crouch + if (!(player->flags & PlayerCrouched) && (controllerGetButtonDown(0, R_CBUTTONS))){ + player->flags |= PlayerCrouched; + camera_y_modifier = -0.25; + collisionSceneRemoveDynamicObject(&player->collisionObject); + collisionObjectReInit(&player->collisionObject, &gCrouchingPlayerColliderData, &player->body, 1.0f, PLAYER_COLLISION_LAYERS); + collisionSceneAddDynamicObject(&player->collisionObject); + collisionObjectUpdateBB(&player->collisionObject); + } + //if player crouched, uncrouch + else if ((player->flags & PlayerCrouched) && (controllerGetButtonDown(0, R_CBUTTONS))){ + player->flags &= ~PlayerCrouched; + camera_y_modifier = 0.0; + collisionSceneRemoveDynamicObject(&player->collisionObject); + collisionObjectReInit(&player->collisionObject, &gPlayerColliderData, &player->body, 1.0f, PLAYER_COLLISION_LAYERS); + collisionSceneAddDynamicObject(&player->collisionObject); + collisionObjectUpdateBB(&player->collisionObject); + } } targetVelocity.y = player->body.velocity.y; @@ -559,6 +602,7 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) { int didPassThroughPortal = rigidBodyCheckPortals(&player->body); player->lookTransform.position = player->body.transform.position; + player->lookTransform.position.y += camera_y_modifier; player->lookTransform.rotation = player->body.transform.rotation; quatIdent(&player->body.transform.rotation); diff --git a/src/player/player.h b/src/player/player.h index 81da799..40297da 100644 --- a/src/player/player.h +++ b/src/player/player.h @@ -21,6 +21,7 @@ enum PlayerFlags { PlayerHasSecondPortalGun = (1 << 2), PlayerIsDead = (1 << 3), PlayerIsUnderwater = (1 << 4), + PlayerCrouched = (1 << 5), }; struct Player {