void Footholdtree::limitmoves(PhysicsObject& phobj, float dpfmult) const { float nextx = phobj.fx + phobj.hspeed * dpfmult; float nexty = phobj.fy + phobj.vspeed * dpfmult; if (nextx != phobj.fx) { vector2d<int32_t> vertical = vector2d<int32_t>(static_cast<int32_t>(phobj.fy - 40), static_cast<int32_t>(phobj.fy - 10)); float wall = getwall(phobj.fhid, phobj.hspeed < 0.0f, vertical); if ((phobj.hspeed < 0) ? nextx < wall : nextx > wall) { phobj.hspeed = 0.0f; } } if (nexty > phobj.fy) { float ground = getfh(phobj.fhid).resolvex(nextx); if (nexty >= ground && ground >= phobj.fy) { phobj.vspeed = 0.0f; phobj.fy = ground; } } }
void Footholdtree::limitmoves(PhysicsObject& phobj) const { if (phobj.hmobile()) { double crntx = phobj.crntx(); double nextx = phobj.nextx(); bool left = phobj.hspeed < 0.0f; double wall = getwall(phobj.fhid, left, phobj.nexty()); bool collision = left ? crntx >= wall && nextx <= wall : crntx <= wall && nextx >= wall; if (!collision && phobj.flagset(PhysicsObject::TURNATEDGES)) { wall = getedge(phobj.fhid, left); collision = left ? crntx >= wall && nextx <= wall : crntx <= wall && nextx >= wall; } if (collision) { phobj.limitx(wall); phobj.clearflag(PhysicsObject::TURNATEDGES); } } if (phobj.vmobile()) { double crnty = phobj.crnty(); double nexty = phobj.nexty(); auto ground = Range<double>( getfh(phobj.fhid).resolvex(phobj.crntx()), getfh(phobj.fhid).resolvex(phobj.nextx()) ); bool collision = crnty <= ground.first() && nexty >= ground.second(); if (collision) { phobj.limity(ground.second()); limitmoves(phobj); } else { if (nexty < borders.first()) { phobj.limity(borders.first()); } else if (nexty > borders.second()) { phobj.limity(borders.second()); } } } }