1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
void Item::move(const Time& elapsedTime)
{
pl::Time remainingToCalculate = elapsedTime;
if (!m_map->is1PxNextToHitboxOnBottom(*this) || m_speed.getComponents() != Vector2f(0.f, 0.f) || m_acceleration.getComponents() != Vector2f(0.f, 0.f))
{
while (remainingToCalculate > pl::Time::Zero)
{
//Set vertical acceleration if the air
if (m_map->is1PxNextToHitboxOnBottom(*this))
{
m_speed.setYComponent(0.f);
m_acceleration.setYComponent(0.f);
}
else
m_acceleration.setYComponent(VERTICAL_ACCELERATION_PX_PER_SECOND);
//Set horizontal speed
if (!m_acceleration.getYComponent()) //if on the ground
{
if (m_speed.getXComponent() < 0.f && MRUA1D::getEndSpeed(m_speed.getXComponent(), elapsedTime, SPEED_TO_ZERO_PX_PER_SECOND) < 0.f)
m_speed.setXComponent(MRUA1D::getEndSpeed(m_speed.getXComponent(), elapsedTime, SPEED_TO_ZERO_PX_PER_SECOND));
else if (m_speed.getXComponent() > 0.f && MRUA1D::getEndSpeed(m_speed.getXComponent(), elapsedTime, -SPEED_TO_ZERO_PX_PER_SECOND) > 0.f)
m_speed.setXComponent(MRUA1D::getEndSpeed(m_speed.getXComponent(), elapsedTime, -SPEED_TO_ZERO_PX_PER_SECOND));
else
m_speed.setXComponent(0.f);
}
if (m_map->is1PxNextToHitboxOnTop(*this) && m_speed.getYComponent() < 0.f)
m_speed.setYComponent(0.f);
if (m_map->is1PxNextToHitboxOnLeft(*this) && m_speed.getXComponent() <= 0.f)
m_speed.setXComponent(0.f);
else if (m_map->is1PxNextToHitboxOnRight(*this) && m_speed.getXComponent() >= 0.f)
m_speed.setXComponent(0.f);
Vector2f initialPosition = getPosition();
setPosition(MRUA2D::getNextPosition(getPosition(), m_speed.getYComponent(), m_speed.getXComponent(), remainingToCalculate, m_acceleration.getYComponent(), 0));
pl::Time calculated = remainingToCalculate;
while (m_map->isTouchingHitbox(*this))
{
calculated = pl::microseconds(calculated.asMicroseconds() / 2);
setPosition(MRUA2D::getNextPosition(initialPosition, m_speed.getYComponent(), m_speed.getXComponent(), calculated, m_acceleration.getYComponent(), 0));
}
m_speed.setYComponent(MRUA1D::getEndSpeed(m_speed.getYComponent(), calculated, m_acceleration.getYComponent()));
remainingToCalculate -= calculated;
}
}
} |
Partager