Initial commit
This commit is contained in:
495
engines/hpl1/penumbra-overture/PlayerMoveStates.h
Normal file
495
engines/hpl1/penumbra-overture/PlayerMoveStates.h
Normal file
@@ -0,0 +1,495 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2006-2010 - Frictional Games
|
||||
*
|
||||
* This file is part of Penumbra Overture.
|
||||
*/
|
||||
|
||||
#ifndef GAME_PLAYER_MOVE_STATES_H
|
||||
#define GAME_PLAYER_MOVE_STATES_H
|
||||
|
||||
class cPlayer;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// BASE STATE
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
iPlayerMoveState::iPlayerMoveState(cPlayer *apPlayer, cInit *apInit) {
|
||||
mpPlayer = apPlayer;
|
||||
mpInit = apInit;
|
||||
|
||||
mpGameConfig = mpInit->mpGameConfig;
|
||||
mpHeadMove = mpPlayer->GetHeadMove();
|
||||
|
||||
// Speed setup
|
||||
mfForwardSpeed = 3.0f;
|
||||
mfBackwardSpeed = 1.5f;
|
||||
mfSidewaySpeed = 2.0f;
|
||||
|
||||
mfForwardAcc = 6.0f;
|
||||
mfForwardDeacc = 12.0f;
|
||||
mfSidewayAcc = 6.0f;
|
||||
mfSidewayDeacc = 12.0f;
|
||||
|
||||
mbActive = false;
|
||||
|
||||
// Head move setup
|
||||
mfMaxHeadMove = 0.05f;
|
||||
mfMinHeadMove = -0.06f;
|
||||
mfHeadMoveSpeed = 0.38f;
|
||||
mfHeadMoveBackSpeed = 0.23f;
|
||||
|
||||
mfHeightAdd = 0;
|
||||
mfHeightAddSpeed = 1.5f;
|
||||
|
||||
mfSpeedMul = 1;
|
||||
|
||||
// FootStep multiplier
|
||||
mfFootStepMul = 1.0f;
|
||||
|
||||
msStepType = "walk";
|
||||
}
|
||||
|
||||
void iPlayerMoveState::SetupBody() {
|
||||
iCharacterBody *pCharBody = mpPlayer->GetCharacterBody();
|
||||
float fMul = mpPlayer->GetSpeedMul() * mpPlayer->GetHealthSpeedMul();
|
||||
|
||||
pCharBody->SetMaxPositiveMoveSpeed(eCharDir_Forward, mfForwardSpeed * fMul);
|
||||
pCharBody->SetMaxNegativeMoveSpeed(eCharDir_Forward, -mfBackwardSpeed * fMul);
|
||||
|
||||
pCharBody->SetMaxPositiveMoveSpeed(eCharDir_Right, mfSidewaySpeed * fMul);
|
||||
pCharBody->SetMaxNegativeMoveSpeed(eCharDir_Right, -mfSidewaySpeed * fMul);
|
||||
|
||||
pCharBody->SetMoveAcc(eCharDir_Forward, mfForwardAcc);
|
||||
pCharBody->SetMoveDeacc(eCharDir_Forward, mfForwardDeacc);
|
||||
pCharBody->SetMoveAcc(eCharDir_Right, mfSidewayAcc);
|
||||
pCharBody->SetMoveDeacc(eCharDir_Right, mfSidewayDeacc);
|
||||
}
|
||||
|
||||
void iPlayerMoveState::InitState(iPlayerMoveState *apPrevState) {
|
||||
if (apPrevState) {
|
||||
apPrevState->LeaveState(apPrevState);
|
||||
apPrevState->mbActive = false;
|
||||
}
|
||||
|
||||
EnterState(apPrevState);
|
||||
|
||||
// Set up body
|
||||
SetupBody();
|
||||
|
||||
mpHeadMove->mfMaxHeadMove = mfMaxHeadMove;
|
||||
mpHeadMove->mfMinHeadMove = mfMinHeadMove;
|
||||
mpHeadMove->mfHeadMoveSpeed = mfHeadMoveSpeed;
|
||||
mpHeadMove->mfHeadMoveBackSpeed = mfHeadMoveBackSpeed;
|
||||
mpHeadMove->mfFootStepMul = mfFootStepMul;
|
||||
}
|
||||
|
||||
void iPlayerMoveState::Start() {
|
||||
if (mbActive == false) {
|
||||
mbActive = true;
|
||||
|
||||
// Set up body
|
||||
iCharacterBody *pCharBody = mpPlayer->GetCharacterBody();
|
||||
float fMul = mpPlayer->GetSpeedMul();
|
||||
|
||||
pCharBody->SetMaxPositiveMoveSpeed(eCharDir_Forward, mfForwardSpeed * fMul);
|
||||
pCharBody->SetMaxNegativeMoveSpeed(eCharDir_Forward, -mfBackwardSpeed * fMul);
|
||||
|
||||
pCharBody->SetMaxPositiveMoveSpeed(eCharDir_Right, mfSidewaySpeed * fMul);
|
||||
pCharBody->SetMaxNegativeMoveSpeed(eCharDir_Right, -mfSidewaySpeed * fMul);
|
||||
|
||||
pCharBody->SetMoveAcc(eCharDir_Forward, mfForwardAcc);
|
||||
pCharBody->SetMoveDeacc(eCharDir_Forward, mfForwardDeacc);
|
||||
pCharBody->SetMoveAcc(eCharDir_Right, mfSidewayAcc);
|
||||
pCharBody->SetMoveDeacc(eCharDir_Right, mfSidewayDeacc);
|
||||
|
||||
mpHeadMove->mfMaxHeadMove = mfMaxHeadMove;
|
||||
mpHeadMove->mfMinHeadMove = mfMinHeadMove;
|
||||
mpHeadMove->mfHeadMoveSpeed = mfHeadMoveSpeed;
|
||||
mpHeadMove->mfHeadMoveBackSpeed = mfHeadMoveBackSpeed;
|
||||
mpHeadMove->mfFootStepMul = mfFootStepMul;
|
||||
|
||||
mpHeadMove->Start();
|
||||
}
|
||||
}
|
||||
|
||||
void iPlayerMoveState::Stop() {
|
||||
mpHeadMove->Stop();
|
||||
|
||||
mbActive = false;
|
||||
}
|
||||
|
||||
void iPlayerMoveState::Update(float afTimeStep) {
|
||||
// Update height add
|
||||
float fPlayerHeightAdd = mpPlayer->GetHeightAdd();
|
||||
if (fPlayerHeightAdd < mfHeightAdd) {
|
||||
fPlayerHeightAdd += mfHeightAddSpeed * afTimeStep;
|
||||
if (fPlayerHeightAdd > mfHeightAdd)
|
||||
fPlayerHeightAdd = mfHeightAdd;
|
||||
}
|
||||
|
||||
if (fPlayerHeightAdd > mfHeightAdd) {
|
||||
fPlayerHeightAdd -= mfHeightAddSpeed * afTimeStep;
|
||||
if (fPlayerHeightAdd < mfHeightAdd)
|
||||
fPlayerHeightAdd = mfHeightAdd;
|
||||
}
|
||||
mpPlayer->SetHeightAdd(fPlayerHeightAdd);
|
||||
|
||||
OnUpdate(afTimeStep);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// WALK STATE
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class cPlayerMoveState_Walk : public iPlayerMoveState {
|
||||
public:
|
||||
cPlayerMoveState_Walk(cPlayer *apPlayer, cInit *apInit) : iPlayerMoveState(apPlayer, apInit) {
|
||||
mfForwardSpeed = mpGameConfig->GetFloat("Movement_Walk", "ForwardSpeed", 0);
|
||||
mfBackwardSpeed = mpGameConfig->GetFloat("Movement_Walk", "BackwardSpeed", 0);
|
||||
mfSidewaySpeed = mpGameConfig->GetFloat("Movement_Walk", "SidewaySpeed", 0);
|
||||
|
||||
mfForwardAcc = mpGameConfig->GetFloat("Movement_Walk", "ForwardAcc", 0);
|
||||
mfForwardDeacc = mpGameConfig->GetFloat("Movement_Walk", "ForwardDeacc", 0);
|
||||
mfSidewayAcc = mpGameConfig->GetFloat("Movement_Walk", "SidewayAcc", 0);
|
||||
mfSidewayDeacc = mpGameConfig->GetFloat("Movement_Walk", "SidewayDeacc", 0);
|
||||
|
||||
// Head move setup
|
||||
mfMaxHeadMove = mpGameConfig->GetFloat("Movement_Walk", "MaxHeadMove", 0);
|
||||
mfMinHeadMove = mpGameConfig->GetFloat("Movement_Walk", "MinHeadMove", 0);
|
||||
mfHeadMoveSpeed = mpGameConfig->GetFloat("Movement_Walk", "HeadMoveSpeed", 0);
|
||||
mfHeadMoveBackSpeed = 0.23f;
|
||||
|
||||
// FootStep multiplier
|
||||
mfFootStepMul = 1.0f;
|
||||
|
||||
msStepType = "walk";
|
||||
|
||||
mType = ePlayerMoveState_Walk;
|
||||
}
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// RUN STATE
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class cPlayerMoveState_Run : public iPlayerMoveState {
|
||||
public:
|
||||
cPlayerMoveState_Run(cPlayer *apPlayer, cInit *apInit) : iPlayerMoveState(apPlayer, apInit) {
|
||||
mfForwardSpeed = mpGameConfig->GetFloat("Movement_Run", "ForwardSpeed", 0);
|
||||
mfBackwardSpeed = mpGameConfig->GetFloat("Movement_Run", "BackwardSpeed", 0);
|
||||
mfSidewaySpeed = mpGameConfig->GetFloat("Movement_Run", "SidewaySpeed", 0);
|
||||
|
||||
mfForwardAcc = mpGameConfig->GetFloat("Movement_Run", "ForwardAcc", 0);
|
||||
mfForwardDeacc = mpGameConfig->GetFloat("Movement_Run", "ForwardDeacc", 0);
|
||||
mfSidewayAcc = mpGameConfig->GetFloat("Movement_Run", "SidewayAcc", 0);
|
||||
mfSidewayDeacc = mpGameConfig->GetFloat("Movement_Run", "SidewayDeacc", 0);
|
||||
|
||||
// Head move setup
|
||||
mfMaxHeadMove = mpGameConfig->GetFloat("Movement_Run", "MaxHeadMove", 0);
|
||||
mfMinHeadMove = mpGameConfig->GetFloat("Movement_Run", "MinHeadMove", 0);
|
||||
mfHeadMoveSpeed = mpGameConfig->GetFloat("Movement_Run", "HeadMoveSpeed", 0);
|
||||
mfHeadMoveBackSpeed = 0.23f;
|
||||
|
||||
// FootStep multiplier
|
||||
mfFootStepMul = 1.0f;
|
||||
|
||||
msStepType = "run";
|
||||
|
||||
mType = ePlayerMoveState_Run;
|
||||
}
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// STILL STATE
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class cPlayerMoveState_Still : public iPlayerMoveState {
|
||||
public:
|
||||
cPlayerMoveState_Still(cPlayer *apPlayer, cInit *apInit) : iPlayerMoveState(apPlayer, apInit) {
|
||||
mfForwardSpeed = 0.0f;
|
||||
mfBackwardSpeed = 0.0f;
|
||||
mfSidewaySpeed = 0.0f;
|
||||
|
||||
mfForwardAcc = 0.0f;
|
||||
mfForwardDeacc = 6.0f;
|
||||
mfSidewayAcc = 0.0f;
|
||||
mfSidewayDeacc = 6.0f;
|
||||
|
||||
// Head move setup
|
||||
mfMaxHeadMove = 0.03f;
|
||||
mfMinHeadMove = -0.03f;
|
||||
mfHeadMoveSpeed = 0.12f;
|
||||
mfHeadMoveBackSpeed = 0.23f;
|
||||
|
||||
// FootStep multiplier
|
||||
mfFootStepMul = 0.6f;
|
||||
|
||||
msStepType = "walk";
|
||||
|
||||
mType = ePlayerMoveState_Still;
|
||||
}
|
||||
|
||||
void EnterState(iPlayerMoveState *apPrevState) {
|
||||
if (apPrevState) {
|
||||
mfHeightAdd = apPrevState->mfHeightAdd;
|
||||
mfHeightAddSpeed = apPrevState->mfHeightAddSpeed;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// JUMP STATE
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class cPlayerMoveState_Jump : public iPlayerMoveState {
|
||||
public:
|
||||
bool mbFirstUpdate;
|
||||
float mfStartForce;
|
||||
float mfMaxForward;
|
||||
float mfMaxSide;
|
||||
|
||||
float mfDefaultFowardSpeed;
|
||||
float mfDefaultSidewaySpeed;
|
||||
|
||||
cPlayerMoveState_Jump(cPlayer *apPlayer, cInit *apInit) : iPlayerMoveState(apPlayer, apInit) {
|
||||
mfForwardSpeed = mpGameConfig->GetFloat("Movement_Jump", "ForwardSpeed", 0);
|
||||
mfDefaultFowardSpeed = mfForwardSpeed;
|
||||
mfBackwardSpeed = mpGameConfig->GetFloat("Movement_Jump", "BackwardSpeed", 0);
|
||||
mfSidewaySpeed = mpGameConfig->GetFloat("Movement_Jump", "SidewaySpeed", 0);
|
||||
mfDefaultSidewaySpeed = mfSidewaySpeed;
|
||||
|
||||
mfForwardAcc = mpGameConfig->GetFloat("Movement_Jump", "ForwardAcc", 0);
|
||||
mfForwardDeacc = mpGameConfig->GetFloat("Movement_Jump", "ForwardDeacc", 0);
|
||||
mfSidewayAcc = mpGameConfig->GetFloat("Movement_Jump", "SidewayAcc", 0);
|
||||
mfSidewayDeacc = mpGameConfig->GetFloat("Movement_Jump", "SidewayDeacc", 0);
|
||||
|
||||
// Head move setup
|
||||
mfMaxHeadMove = 0.00f;
|
||||
mfMinHeadMove = 0.00f;
|
||||
mfHeadMoveSpeed = 0.0f;
|
||||
mfHeadMoveBackSpeed = 0.33f;
|
||||
|
||||
// mfHeightAdd =-0.3f;
|
||||
// mfHeightAddSpeed = 1.2f;
|
||||
|
||||
// FootStep multiplier
|
||||
mfFootStepMul = 0.0f;
|
||||
|
||||
msStepType = "run";
|
||||
|
||||
mfStartForce = mpInit->mpGameConfig->GetFloat("Player", "JumpStartForce", 1);
|
||||
|
||||
mType = ePlayerMoveState_Jump;
|
||||
}
|
||||
|
||||
void EnterState(iPlayerMoveState *apPrevState) {
|
||||
iCharacterBody *pBody = mpPlayer->GetCharacterBody();
|
||||
|
||||
if (apPrevState)
|
||||
mPrevMoveState = apPrevState->mType;
|
||||
else
|
||||
mPrevMoveState = ePlayerMoveState_Walk;
|
||||
|
||||
float fForce = mfStartForce;
|
||||
if (mPrevMoveState == ePlayerMoveState_Crouch) {
|
||||
fForce *= 0.5f;
|
||||
mfForwardSpeed = mfDefaultFowardSpeed * 0.6f;
|
||||
mfSidewaySpeed = mfDefaultSidewaySpeed * 0.6f;
|
||||
} else {
|
||||
mfForwardSpeed = mfDefaultFowardSpeed;
|
||||
mfSidewaySpeed = mfDefaultSidewaySpeed;
|
||||
}
|
||||
|
||||
// Set the current move speed as force speed.
|
||||
cVector3f vVel = 0;
|
||||
cVector3f vForward = pBody->GetMoveMatrix().GetForward() * -1.0f;
|
||||
cVector3f vRight = pBody->GetMoveMatrix().GetRight();
|
||||
|
||||
vVel += vForward * pBody->GetMoveSpeed(eCharDir_Forward);
|
||||
vVel += vRight * pBody->GetMoveSpeed(eCharDir_Right);
|
||||
|
||||
pBody->AddForceVelocity(vVel);
|
||||
|
||||
pBody->SetMoveSpeed(eCharDir_Forward, 0);
|
||||
pBody->SetMoveSpeed(eCharDir_Right, 0);
|
||||
|
||||
// Add jump force
|
||||
pBody->AddForce(cVector3f(0, fForce * mpPlayer->GetDefaultMass(), 0));
|
||||
|
||||
mbFirstUpdate = true;
|
||||
|
||||
// Get the maximum speed allowed.
|
||||
if (mPrevMoveState == ePlayerMoveState_Still || mPrevMoveState == ePlayerMoveState_Walk) {
|
||||
mfMaxForward = mpPlayer->GetMoveStateData(ePlayerMoveState_Walk)->mfForwardSpeed;
|
||||
mfMaxSide = mpPlayer->GetMoveStateData(ePlayerMoveState_Walk)->mfSidewaySpeed;
|
||||
} else {
|
||||
mfMaxForward = apPrevState->mfForwardSpeed;
|
||||
mfMaxSide = apPrevState->mfSidewaySpeed;
|
||||
}
|
||||
}
|
||||
|
||||
void LeaveState(iPlayerMoveState *apNextState) {
|
||||
iCharacterBody *pBody = mpPlayer->GetCharacterBody();
|
||||
|
||||
pBody->AddForceVelocity(pBody->GetForceVelocity() * -0.7f);
|
||||
}
|
||||
|
||||
void OnUpdate(float afTimeStep) {
|
||||
iCharacterBody *pBody = mpPlayer->GetCharacterBody();
|
||||
|
||||
if (mbFirstUpdate) {
|
||||
mbFirstUpdate = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Check so that speed is correct
|
||||
cVector3f vForceVel = pBody->GetForceVelocity();
|
||||
float fSpeed = vForceVel.Length();
|
||||
|
||||
if (fSpeed > mfMaxForward) {
|
||||
// float fNeg = fSpeed - mfMaxForward;
|
||||
|
||||
float fForwardSpeed = pBody->GetMoveSpeed(eCharDir_Forward);
|
||||
/*if(fForwardSpeed>0){
|
||||
fForwardSpeed -= fNeg;
|
||||
if(fForwardSpeed<0)fForwardSpeed =0;
|
||||
}
|
||||
else {
|
||||
fForwardSpeed += fNeg;
|
||||
if(fForwardSpeed>0)fForwardSpeed =0;
|
||||
}*/
|
||||
pBody->SetMoveSpeed(eCharDir_Forward, fForwardSpeed);
|
||||
}
|
||||
|
||||
// Skip sideways here, it is sucha strange way to jump anyway.
|
||||
|
||||
// Check if the jumpbutton is down.
|
||||
if (mpPlayer->GetJumpButtonDown() &&
|
||||
mpPlayer->GetJumpCount() < mpPlayer->GetMaxJumpCount()) {
|
||||
float fMul = 0.4f + 0.5f * (1 - mpPlayer->GetJumpCount() / mpPlayer->GetMaxJumpCount());
|
||||
|
||||
pBody->AddForce(cVector3f(0, -pBody->GetCustomGravity().y * pBody->GetMass() * fMul, 0));
|
||||
} else if (pBody->GetForceVelocity().y > 0) {
|
||||
// Add some extra gravity
|
||||
pBody->AddForce(cVector3f(0, -20.0f * pBody->GetMass(), 0));
|
||||
}
|
||||
|
||||
// check if the body is on ground, and if so end jump.
|
||||
if (pBody->IsOnGround() && pBody->GetForceVelocity().y == 0) {
|
||||
mpPlayer->ChangeMoveState(mPrevMoveState);
|
||||
} else if (mpPlayer->GetLandedFromJump()) {
|
||||
mpPlayer->SetLandedFromJump(false);
|
||||
mpPlayer->ChangeMoveState(mPrevMoveState);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// CROUCH STATE
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class cPlayerMoveState_Crouch : public iPlayerMoveState {
|
||||
public:
|
||||
bool mbFirstUpdate;
|
||||
|
||||
cPlayerMoveState_Crouch(cPlayer *apPlayer, cInit *apInit) : iPlayerMoveState(apPlayer, apInit) {
|
||||
mfForwardSpeed = mpGameConfig->GetFloat("Movement_Crouch", "ForwardSpeed", 0);
|
||||
mfBackwardSpeed = mpGameConfig->GetFloat("Movement_Crouch", "BackwardSpeed", 0);
|
||||
mfSidewaySpeed = mpGameConfig->GetFloat("Movement_Crouch", "SidewaySpeed", 0);
|
||||
|
||||
mfForwardAcc = mpGameConfig->GetFloat("Movement_Crouch", "ForwardAcc", 0);
|
||||
mfForwardDeacc = mpGameConfig->GetFloat("Movement_Crouch", "ForwardDeacc", 0);
|
||||
mfSidewayAcc = mpGameConfig->GetFloat("Movement_Crouch", "SidewayAcc", 0);
|
||||
mfSidewayDeacc = mpGameConfig->GetFloat("Movement_Crouch", "SidewayDeacc", 0);
|
||||
|
||||
// Head move setup
|
||||
mfMaxHeadMove = mpGameConfig->GetFloat("Movement_Crouch", "MaxHeadMove", 0);
|
||||
mfMinHeadMove = mpGameConfig->GetFloat("Movement_Crouch", "MinHeadMove", 0);
|
||||
mfHeadMoveSpeed = mpGameConfig->GetFloat("Movement_Crouch", "HeadMoveSpeed", 0);
|
||||
mfHeadMoveBackSpeed = 0.23f;
|
||||
|
||||
mfHeightAdd = -(mpPlayer->GetSize().y - mpPlayer->GetCrouchHeight());
|
||||
mfHeightAddSpeed = 1.8f;
|
||||
|
||||
// FootStep multiplier
|
||||
mfFootStepMul = 1.0f;
|
||||
|
||||
msStepType = "sneak";
|
||||
|
||||
mType = ePlayerMoveState_Crouch;
|
||||
}
|
||||
|
||||
void EnterState(iPlayerMoveState *apPrevState) {
|
||||
iCharacterBody *pBody = mpPlayer->GetCharacterBody();
|
||||
|
||||
cVector3f vFeetPos = pBody->GetPosition() - cVector3f(0, pBody->GetShape()->GetSize().y / 2, 0);
|
||||
pBody->SetActiveSize(1);
|
||||
pBody->SetPosition(vFeetPos + cVector3f(0, pBody->GetShape()->GetSize().y / 2, 0));
|
||||
// pBody->SetGravityActive(false);
|
||||
}
|
||||
|
||||
void LeaveState(iPlayerMoveState *apNextState) {
|
||||
iCharacterBody *pBody = mpPlayer->GetCharacterBody();
|
||||
|
||||
cVector3f vFeetPos = pBody->GetPosition() - cVector3f(0, pBody->GetShape()->GetSize().y / 2, 0);
|
||||
pBody->SetActiveSize(0);
|
||||
pBody->SetPosition(vFeetPos + cVector3f(0, pBody->GetShape()->GetSize().y / 2, 0));
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// Check if the player will fit with the newer size
|
||||
cInit *pInit = mpPlayer->GetInit();
|
||||
iPhysicsWorld *pWorld = pInit->mpGame->GetScene()->GetWorld3D()->GetPhysicsWorld();
|
||||
|
||||
pBody->SetPosition(pBody->GetPosition() + cVector3f(0, 0.005f, 0));
|
||||
|
||||
// Check with both bodies. This removes some bugs.
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
iCollideShape *pShape = pBody->GetExtraBody(i)->GetShape();
|
||||
|
||||
cVector3f vNewPos = pBody->GetPosition();
|
||||
/*bool bCollide = */ pWorld->CheckShapeWorldCollision(&vNewPos, pShape,
|
||||
cMath::MatrixTranslate(pBody->GetPosition()),
|
||||
pBody->GetBody(), false, true);
|
||||
|
||||
/*Log("Collide when leaving crouch: %d. NewPos: %s OldPos: %s\n",bCollide,
|
||||
vNewPos.ToString().c_str(),
|
||||
pBody->GetPosition().ToString().c_str());*/
|
||||
|
||||
// If the body is pushed down, then something is colliding from above.
|
||||
// if so, set crouch mode again.
|
||||
if (vNewPos != pBody->GetPosition()) {
|
||||
pBody->SetPosition(pBody->GetPosition() - cVector3f(0, 0.005f, 0));
|
||||
mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pBody->SetPosition(pBody->GetPosition() - cVector3f(0, 0.005f, 0));
|
||||
}
|
||||
|
||||
void OnUpdate(float afTimeStep) {
|
||||
}
|
||||
};
|
||||
|
||||
#endif // GAME_PLAYER_MOVE_STATES_H
|
||||
Reference in New Issue
Block a user