void AvatarEntity::update(const float elapsedTime) { //Para actualizar el estado del avatar, miraremos primero en que estado estamos //Y despues llamamos a las funciones que actualizan segun el estado updateState(); switch(m_state) { case IDLE: updateIdle(elapsedTime); break; case PUNCH: updatePunch(elapsedTime); break; case JAB: updateJab(elapsedTime); break; case KICK: updateKick(elapsedTime); break; case LOWER: updateLower(elapsedTime); break; case MOVE: updateMove(elapsedTime); break; case JUMP: updateJump(elapsedTime); break; case DEFENSE: updateDefense(elapsedTime); break; } }
void ImageSection::updateJump(size_t pos) { if (updatedJumpPos.find(pos) != updatedJumpPos.end()) { return; } updatedJumpPos.insert(pos); uint32_t distance = *((uint32_t *)(content + pos)); uint32_t delta = posComp.delta(pos + 4, distance); *((uint32_t *)(content + pos)) = delta; if (pos + delta + 5 > size) { throw std::runtime_error("Short jump distance out of bounds."); } //std::cerr << "updated jump on " << std::hex << (pos + 80) << std::dec << " " << distance << " -> " << delta << "\n"; if (content[pos + delta + 4] == doubleSkipPrefix) { //std::cerr << "double-skip\n"; updateJump(pos + delta + 5); } else { assert((content[pos + delta + 4] == 2 && content[pos + delta + 5] == 0 && content[pos + delta + 6] == 6) || (content[pos + delta + 4] == 2 && content[pos + delta + 5] == 0 && content[pos + delta + 6] == 4) || (content[pos + delta + 4] == 8 && content[pos + delta + 5] == 5 && content[pos + delta + 6] == 0) || (content[pos + delta + 4] == 9 && content[pos + delta + 5] == 0 && content[pos + delta + 6] == 2) || (content[pos + delta + 4] == 4 && content[pos + delta + 5] == 0 && content[pos + delta + 6] == 0)); } }
void ImageSection::updateShortHops() { updatedJumpPos.clear(); for (size_t i = 0; i < size; ++i) { Jump jump = detectJump(i); switch (jump.type) { case Jump::Jump1Arg: updateJump(jump.arg1Pos); break; case Jump::Jump2Arg: updateJump(jump.arg1Pos); updateJump(jump.arg2Pos); break; default: break; } } }
void Creature::jump(int height, int duration) { if(!m_jumpOffset.isNull()) return; m_jumpTimer.restart(); m_jumpHeight = height; m_jumpDuration = duration; updateJump(); }
void Creature::updateJump() { int t = m_jumpTimer.ticksElapsed(); double a = -4 * m_jumpHeight / (m_jumpDuration * m_jumpDuration); double b = +4 * m_jumpHeight / (m_jumpDuration); double height = a*t*t + b*t; int roundHeight = stdext::round(height); int halfJumpDuration = m_jumpDuration / 2; // schedules next update if(m_jumpTimer.ticksElapsed() < m_jumpDuration) { m_jumpOffset = PointF(height, height); int diff = 0; if(m_jumpTimer.ticksElapsed() < halfJumpDuration) diff = 1; else if(m_jumpTimer.ticksElapsed() > halfJumpDuration) diff = -1; int nextT, i = 1; do { nextT = stdext::round((-b + std::sqrt(std::max<int>(b*b + 4*a*(roundHeight+diff*i), 0.0)) * diff) / (2*a)); ++i; if(nextT < halfJumpDuration) diff = 1; else if(nextT > halfJumpDuration) diff = -1; } while(nextT - m_jumpTimer.ticksElapsed() == 0 && i < 3); auto self = static_self_cast<Creature>(); g_dispatcher.scheduleEvent([self] { self->updateJump(); }, nextT - m_jumpTimer.ticksElapsed()); } else m_jumpOffset = PointF(0, 0); }