Temporary movement code.
This commit is contained in:
parent
fce08ed793
commit
d27b5773ca
3 changed files with 37 additions and 13 deletions
|
@ -62,7 +62,7 @@ namespace cloonel {
|
||||||
void GameplaySceneClassic::Prepare() {
|
void GameplaySceneClassic::Prepare() {
|
||||||
std::unique_ptr<MoverSine> moverSine(new MoverSine());
|
std::unique_ptr<MoverSine> moverSine(new MoverSine());
|
||||||
std::unique_ptr<Character> player(new Character("resources/graphics/player.png", SDLObject(), ushort2(80, 120)));
|
std::unique_ptr<Character> player(new Character("resources/graphics/player.png", SDLObject(), ushort2(80, 120)));
|
||||||
std::unique_ptr<MoverLeftRight> moverLeftRight(new MoverLeftRight());
|
std::unique_ptr<MoverLeftRight> moverLeftRight(new MoverLeftRight(1.5f, 5.0f, 40.0f));
|
||||||
|
|
||||||
player->Prepare();
|
player->Prepare();
|
||||||
moverSine->RegisterPlaceable(player.get());
|
moverSine->RegisterPlaceable(player.get());
|
||||||
|
|
|
@ -18,27 +18,49 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "moverleftright.hpp"
|
#include "moverleftright.hpp"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
namespace cloonel {
|
namespace cloonel {
|
||||||
|
namespace {
|
||||||
|
float Clamp ( float parValue, float parMin, float parMax ) __attribute__((pure));
|
||||||
|
float Clamp ( float parValue, float parMin, float parMax ) {
|
||||||
|
assert(parMin <= parMax);
|
||||||
|
return std::max(parMin, std::min(parMax, parValue));
|
||||||
|
}
|
||||||
|
} //unnamed namespace
|
||||||
|
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
MoverLeftRight::MoverLeftRight() :
|
MoverLeftRight::MoverLeftRight (float parMaxVelocity, float parMass, float parForce) :
|
||||||
m_movement(0.0f),
|
//TODO: mass does not belong to here
|
||||||
m_velocity(320.0f),
|
m_velocity(0.0f),
|
||||||
m_step(0.0f)
|
m_maxVelocity(parMaxVelocity),
|
||||||
|
m_invMass(1.0f / parMass),
|
||||||
|
m_force(parForce),
|
||||||
|
m_movementTarget(0.0f)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
void MoverLeftRight::ApplyMotion (float parDelta) {
|
void MoverLeftRight::ApplyMotion (float parDelta) {
|
||||||
m_step = m_velocity * parDelta * m_movement;
|
//TODO: implement a movement that is more mathematically correct and
|
||||||
|
//that feels nice.
|
||||||
|
|
||||||
|
//const float forceDirection = std::abs(m_movementTarget) * 2.0f - 1.0f;
|
||||||
|
const float notMoving = 1.0f - std::abs(m_movementTarget);
|
||||||
|
const float friction = 1.757f * m_velocity * notMoving * parDelta;
|
||||||
|
m_velocity += m_movementTarget * m_force * m_invMass * parDelta - std::copysign(friction, m_velocity);
|
||||||
|
m_velocity = Clamp(m_velocity, -m_maxVelocity, m_maxVelocity);
|
||||||
|
if (m_movementTarget == 0.0f and std::abs(m_velocity) < 0.1f)
|
||||||
|
m_velocity = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
float2 MoverLeftRight::GetOffset() const {
|
float2 MoverLeftRight::GetOffset() const {
|
||||||
return float2(m_step, 0.0f);
|
return float2(m_velocity, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
|
@ -46,13 +68,13 @@ namespace cloonel {
|
||||||
void MoverLeftRight::SetMovement (MovementDirectionType parDirection) {
|
void MoverLeftRight::SetMovement (MovementDirectionType parDirection) {
|
||||||
switch (parDirection) {
|
switch (parDirection) {
|
||||||
case MovementDirection_Left:
|
case MovementDirection_Left:
|
||||||
m_movement = -1.0f;
|
m_movementTarget = -1.0f;
|
||||||
break;
|
break;
|
||||||
case MovementDirection_Right:
|
case MovementDirection_Right:
|
||||||
m_movement = 1.0f;
|
m_movementTarget = 1.0f;
|
||||||
break;
|
break;
|
||||||
case MovementDirection_Still:
|
case MovementDirection_Still:
|
||||||
m_movement = 0.0f;
|
m_movementTarget = 0.0f;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace cloonel {
|
||||||
MovementDirection_Still
|
MovementDirection_Still
|
||||||
};
|
};
|
||||||
|
|
||||||
MoverLeftRight ( void );
|
MoverLeftRight ( float parMaxVelocity, float parMass, float parForce );
|
||||||
virtual ~MoverLeftRight ( void ) noexcept = default;
|
virtual ~MoverLeftRight ( void ) noexcept = default;
|
||||||
|
|
||||||
void SetMovement ( MovementDirectionType parDirection );
|
void SetMovement ( MovementDirectionType parDirection );
|
||||||
|
@ -40,9 +40,11 @@ namespace cloonel {
|
||||||
virtual float2 GetOffset ( void ) const;
|
virtual float2 GetOffset ( void ) const;
|
||||||
virtual void ApplyMotion ( float parDelta );
|
virtual void ApplyMotion ( float parDelta );
|
||||||
|
|
||||||
float m_movement;
|
|
||||||
float m_velocity;
|
float m_velocity;
|
||||||
float m_step;
|
float m_maxVelocity;
|
||||||
|
float m_invMass;
|
||||||
|
float m_force;
|
||||||
|
float m_movementTarget;
|
||||||
};
|
};
|
||||||
} //namespace cloonel
|
} //namespace cloonel
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue