mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 22:47:37 -04:00
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:
parent
d4de0ccccc
commit
a24f7acec5
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ enum PlayerFlags {
|
|||
PlayerHasSecondPortalGun = (1 << 2),
|
||||
PlayerIsDead = (1 << 3),
|
||||
PlayerIsUnderwater = (1 << 4),
|
||||
PlayerCrouched = (1 << 5),
|
||||
};
|
||||
|
||||
struct Player {
|
||||
|
|
Loading…
Reference in a new issue