Esempio n. 1
0
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;
	}
}
Esempio n. 2
0
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));
    }
}
Esempio n. 3
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;
        }
    }
}
Esempio n. 4
0
void Creature::jump(int height, int duration)
{
    if(!m_jumpOffset.isNull())
        return;

    m_jumpTimer.restart();
    m_jumpHeight = height;
    m_jumpDuration = duration;

    updateJump();
}
Esempio n. 5
0
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);
}