Added Crouching Functionality

- Added crouch to Right C button
- Removed movement being from other c buttons
- Added a new player flag for "crouched"
This commit is contained in:
Weston Salinas 2023-03-01 17:05:41 -06:00
parent d4de0ccccc
commit a24f7acec5
4 changed files with 56 additions and 4 deletions

View file

@ -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);
}

View file

@ -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);

View file

@ -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);

View file

@ -21,6 +21,7 @@ enum PlayerFlags {
PlayerHasSecondPortalGun = (1 << 2),
PlayerIsDead = (1 << 3),
PlayerIsUnderwater = (1 << 4),
PlayerCrouched = (1 << 5),
};
struct Player {