Jumpy jump
This commit is contained in:
parent
f8e68b95b2
commit
a90f33d20e
|
@ -65,7 +65,7 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustom
|
|||
|
||||
this->previousPosition = Oyster::Math::Float3(0,0,0);
|
||||
this->moveDir = Oyster::Math::Float3(0,0,0);
|
||||
this->moveSpeed = 100;
|
||||
this->moveSpeed = 20;
|
||||
this->previousMoveSpeed = Oyster::Math::Float3(0,0,0);
|
||||
|
||||
}
|
||||
|
@ -84,66 +84,86 @@ void Player::BeginFrame()
|
|||
//weapon->Update(0.002f);
|
||||
Object::BeginFrame();
|
||||
|
||||
//Oyster::Math::Float3 previousFall = this->previousMoveSpeed*-this->rigidBody->GetState().centerPos.GetNormalized();
|
||||
//Oyster::Math::Float3 currentFall = this->rigidBody->GetLinearVelocity()*-this->rigidBody->GetState().centerPos.GetNormalized();
|
||||
Oyster::Math::Float maxSpeed = 30;
|
||||
|
||||
if(this->moveDir != Oyster::Math::Float3::null && this->playerState != PLAYER_STATE_JUMPING)
|
||||
{
|
||||
Oyster::Math::Float3 velocity = this->rigidBody->GetLinearVelocity();
|
||||
Oyster::Math::Float3 lostVelocity = (this->previousMoveSpeed - velocity).GetMagnitude()*this->moveDir;
|
||||
this->rigidBody->SetLinearVelocity(velocity + lostVelocity - this->moveDir*this->moveSpeed );
|
||||
}
|
||||
else
|
||||
{
|
||||
Oyster::Math::Float4x4 xform;
|
||||
xform = this->rigidBody->GetState().GetOrientation();
|
||||
|
||||
if(this->rigidBody->GetLamda() == 1.0f)
|
||||
{
|
||||
this->playerState = PLAYER_STATE_WALKING;
|
||||
}
|
||||
/* Handle turning */
|
||||
/*if (left)
|
||||
m_turnAngle -= dt * m_turnVelocity;
|
||||
if (right)
|
||||
m_turnAngle += dt * m_turnVelocity;*/
|
||||
|
||||
if(this->moveDir != Oyster::Math::Float3::null)
|
||||
{
|
||||
Oyster::Math::Float3 velocity = this->rigidBody->GetLinearVelocity();
|
||||
this->rigidBody->SetLinearVelocity(velocity - this->moveDir*this->moveSpeed );
|
||||
}
|
||||
}
|
||||
//xform.setRotation (btQuaternion (btVector3(0.0, 1.0, 0.0), m_turnAngle));
|
||||
|
||||
this->moveDir = Oyster::Math::Float3::null;
|
||||
Oyster::Math::Float3 linearVelocity = this->rigidBody->GetLinearVelocity();
|
||||
Oyster::Math::Float speed = this->rigidBody->GetLinearVelocity().GetLength();
|
||||
|
||||
Oyster::Math::Float3 forwardDir = xform.v[2];
|
||||
Oyster::Math::Float3 rightDir = xform.v[0];
|
||||
forwardDir.Normalize();
|
||||
rightDir.Normalize();
|
||||
Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0);
|
||||
Oyster::Math::Float walkSpeed = this->moveSpeed*0.2;
|
||||
|
||||
if (key_forward > 0.001)
|
||||
{
|
||||
key_forward -= gameInstance->GetFrameTime(); // fixed timer
|
||||
this->moveDir += this->rigidBody->GetState().GetOrientation().v[2].GetNormalized().xyz;
|
||||
key_forward -= gameInstance->GetFrameTime();
|
||||
walkDirection += forwardDir;
|
||||
walkDirection.Normalize();
|
||||
}
|
||||
if (key_backward > 0.001)
|
||||
{
|
||||
key_backward -= gameInstance->GetFrameTime();
|
||||
this->moveDir -= this->rigidBody->GetState().GetOrientation().v[2].GetNormalized().xyz;
|
||||
walkDirection -= forwardDir;
|
||||
walkDirection.Normalize();
|
||||
}
|
||||
if (key_strafeRight > 0.001)
|
||||
{
|
||||
key_strafeRight -= gameInstance->GetFrameTime();
|
||||
Oyster::Math::Float3 forward = this->rigidBody->GetState().GetOrientation().v[2];
|
||||
Oyster::Math::Float3 up = this->rigidBody->GetState().centerPos;
|
||||
this->moveDir -= (up).Cross(forward).GetNormalized();
|
||||
walkDirection -= rightDir;
|
||||
walkDirection.Normalize();
|
||||
}
|
||||
if (key_strafeLeft > 0.001)
|
||||
{
|
||||
key_strafeLeft -= gameInstance->GetFrameTime();
|
||||
Oyster::Math::Float3 forward = this->rigidBody->GetState().GetOrientation().v[2];
|
||||
Oyster::Math::Float3 up = this->rigidBody->GetState().centerPos;
|
||||
this->moveDir += (up).Cross(forward).GetNormalized();
|
||||
walkDirection += rightDir;
|
||||
walkDirection.Normalize();
|
||||
maxSpeed = 40;
|
||||
}
|
||||
|
||||
if(this->moveDir != Oyster::Math::Float3::null)
|
||||
|
||||
if (key_forward <= 0.001 && key_backward <= 0.001 && key_strafeRight <= 0.001 && key_strafeLeft <= 0.001 && key_jump <= 0.001 && this->rigidBody->GetLambda() < 0.7f)
|
||||
{
|
||||
this->moveDir.Normalize();
|
||||
this->rigidBody->SetLinearVelocity(this->moveDir*this->moveSpeed + this->rigidBody->GetLinearVelocity());
|
||||
/* Dampen when on the ground and not being moved by the player */
|
||||
linearVelocity *= 0.2;
|
||||
this->rigidBody->SetLinearVelocity (linearVelocity);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (speed < maxSpeed && this->rigidBody->GetLambda() < 1.0f)
|
||||
{
|
||||
Oyster::Math::Float3 velocity = linearVelocity + walkDirection * walkSpeed;
|
||||
this->rigidBody->SetLinearVelocity(velocity);
|
||||
}
|
||||
else if(speed < maxSpeed)
|
||||
{
|
||||
Oyster::Math::Float3 velocity = linearVelocity + (walkDirection * walkSpeed)*0.2f;
|
||||
this->rigidBody->SetLinearVelocity(velocity);
|
||||
}
|
||||
}
|
||||
|
||||
this->previousMoveSpeed = this->rigidBody->GetLinearVelocity();
|
||||
this->previousPosition = this->rigidBody->GetState().centerPos;
|
||||
|
||||
if (key_jump > 0.001)
|
||||
{
|
||||
this->key_jump -= this->gameInstance->GetFrameTime();
|
||||
if(this->rigidBody->GetLambda() < 1.0f)
|
||||
{
|
||||
Oyster::Math::Float3 up = this->rigidBody->GetState().GetOrientation().v[1].GetNormalized();
|
||||
this->rigidBody->ApplyImpulse(up*this->rigidBody->GetState().mass*20);
|
||||
this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING;
|
||||
}
|
||||
}
|
||||
|
||||
this->weapon->Update(0.01f);
|
||||
}
|
||||
|
@ -226,12 +246,7 @@ void Player::Rotate(const Oyster::Math3D::Float3 lookDir, const Oyster::Math3D::
|
|||
|
||||
void Player::Jump()
|
||||
{
|
||||
if(this->rigidBody->GetLamda() < 1.0f)
|
||||
{
|
||||
Oyster::Math::Float3 up = this->rigidBody->GetState().GetOrientation().v[1].GetNormalized();
|
||||
this->rigidBody->ApplyImpulse(up *1500);
|
||||
this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING;
|
||||
}
|
||||
this->key_jump = KEY_TIMER;
|
||||
}
|
||||
|
||||
bool Player::IsWalking()
|
||||
|
|
|
@ -69,7 +69,7 @@ void SimpleRigidBody::SetState( const SimpleRigidBody::State &state )
|
|||
|
||||
void SimpleRigidBody::ApplyImpulse(Float3 impulse)
|
||||
{
|
||||
this->rigidBody->applyImpulse(btVector3(impulse.x, impulse.y, impulse.z), btVector3(0.0f, 0.0f, 0.0f));
|
||||
this->rigidBody->applyCentralImpulse(btVector3(impulse.x, impulse.y, impulse.z));
|
||||
}
|
||||
|
||||
void SimpleRigidBody::SetCollisionShape(btCollisionShape* shape)
|
||||
|
@ -350,7 +350,7 @@ void SimpleRigidBody::SetCustomTag( void *ref )
|
|||
void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld)
|
||||
{
|
||||
btTransform xform;
|
||||
this->rigidBody->getMotionState()->getWorldTransform (xform);
|
||||
xform = this->rigidBody->getWorldTransform ();
|
||||
btVector3 down = -xform.getBasis()[1];
|
||||
btVector3 forward = xform.getBasis()[2];
|
||||
down.normalize ();
|
||||
|
@ -359,7 +359,14 @@ void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld)
|
|||
this->raySource[0] = xform.getOrigin();
|
||||
this->raySource[1] = xform.getOrigin();
|
||||
|
||||
this->rayTarget[0] = this->raySource[0] + down * this->state.reach.y * btScalar(1.1);
|
||||
Float angle = acos(Float3(0, 1, 0).Dot(this->state.centerPos.GetNormalized()));
|
||||
down.setZ(-down.z());
|
||||
down.setX(-down.x());
|
||||
btVector3 targetPlus = down * this->state.reach.y * btScalar(1.1);
|
||||
|
||||
|
||||
|
||||
this->rayTarget[0] = this->raySource[0] + targetPlus;
|
||||
this->rayTarget[1] = this->raySource[1] + forward * this->state.reach.y * btScalar(1.1);
|
||||
|
||||
class ClosestNotMe : public btCollisionWorld::ClosestRayResultCallback
|
||||
|
@ -392,13 +399,15 @@ void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld)
|
|||
if (rayCallback.hasHit())
|
||||
{
|
||||
this->rayLambda[i] = rayCallback.m_closestHitFraction;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
this->rayLambda[i] = 1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float SimpleRigidBody::GetLamda() const
|
||||
float SimpleRigidBody::GetLambda() const
|
||||
{
|
||||
return this->rayLambda[0];
|
||||
}
|
|
@ -67,7 +67,7 @@ namespace Oyster
|
|||
|
||||
void PreStep(const btCollisionWorld* collisionWorld);
|
||||
|
||||
float GetLamda() const;
|
||||
float GetLambda() const;
|
||||
|
||||
private:
|
||||
|
||||
|
|
|
@ -180,7 +180,7 @@ namespace Oyster
|
|||
********************************************************/
|
||||
virtual void SetCustomTag( void *ref ) = 0;
|
||||
|
||||
virtual float GetLamda() const = 0;
|
||||
virtual float GetLambda() const = 0;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue