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;
|
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) {
|
int collisionObjectIsActive(struct CollisionObject* object) {
|
||||||
return object->body && ((object->body->flags & (RigidBodyIsKinematic | RigidBodyIsSleeping)) == 0);
|
return object->body && ((object->body->flags & (RigidBodyIsKinematic | RigidBodyIsSleeping)) == 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ int collisionObjectIsActive(struct CollisionObject* object);
|
||||||
int collisionObjectShouldGenerateConctacts(struct CollisionObject* object);
|
int collisionObjectShouldGenerateConctacts(struct CollisionObject* object);
|
||||||
|
|
||||||
void collisionObjectInit(struct CollisionObject* object, struct ColliderTypeData *collider, struct RigidBody* body, float mass, int collisionLayers);
|
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 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);
|
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,
|
&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) {
|
void playerRender(void* data, struct DynamicRenderDataList* renderList, struct RenderState* renderState) {
|
||||||
struct Player* player = (struct Player*)data;
|
struct Player* player = (struct Player*)data;
|
||||||
|
|
||||||
|
@ -446,18 +462,45 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) {
|
||||||
|
|
||||||
struct Vector3 targetVelocity = gZeroVec;
|
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 (!isDead) {
|
||||||
if (controllerGetButton(0, L_CBUTTONS | L_JPAD)) {
|
if (controllerGetButton(0, L_JPAD)) {
|
||||||
vector3AddScaled(&targetVelocity, &right, -PLAYER_SPEED, &targetVelocity);
|
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);
|
vector3AddScaled(&targetVelocity, &right, PLAYER_SPEED, &targetVelocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (controllerGetButton(0, U_CBUTTONS | U_JPAD)) {
|
if (controllerGetButton(0, U_JPAD)) {
|
||||||
vector3AddScaled(&targetVelocity, &forward, -PLAYER_SPEED, &targetVelocity);
|
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);
|
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;
|
targetVelocity.y = player->body.velocity.y;
|
||||||
|
@ -559,6 +602,7 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) {
|
||||||
int didPassThroughPortal = rigidBodyCheckPortals(&player->body);
|
int didPassThroughPortal = rigidBodyCheckPortals(&player->body);
|
||||||
|
|
||||||
player->lookTransform.position = player->body.transform.position;
|
player->lookTransform.position = player->body.transform.position;
|
||||||
|
player->lookTransform.position.y += camera_y_modifier;
|
||||||
player->lookTransform.rotation = player->body.transform.rotation;
|
player->lookTransform.rotation = player->body.transform.rotation;
|
||||||
quatIdent(&player->body.transform.rotation);
|
quatIdent(&player->body.transform.rotation);
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ enum PlayerFlags {
|
||||||
PlayerHasSecondPortalGun = (1 << 2),
|
PlayerHasSecondPortalGun = (1 << 2),
|
||||||
PlayerIsDead = (1 << 3),
|
PlayerIsDead = (1 << 3),
|
||||||
PlayerIsUnderwater = (1 << 4),
|
PlayerIsUnderwater = (1 << 4),
|
||||||
|
PlayerCrouched = (1 << 5),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Player {
|
struct Player {
|
||||||
|
|
Loading…
Reference in a new issue