コード例 #1
0
float CEntity::getPlayListLength()
{
	// Accumul all the time
	float time = 0;
	for(size_t i = 0; i < _PlayListAnimation.size(); ++i)
		time += getAnimLength(_PlayListAnimation[i]);
	return time;
}
コード例 #2
0
void animationSequence::add(animation* animationProvider, unsigned int lengthMs) {
	offsets->insert(offsets->end(), getAnimLength());
	animations->insert(animations->end(), animationProvider);

	setAnimLength(getAnimLength() + lengthMs);
}
コード例 #3
0
ファイル: actor.cpp プロジェクト: carriercomm/freeablo
    void Actor::update(bool noclip, size_t ticksPassed)
    {
        if(mLevel)
        {
            size_t animDivisor = mAnimTimeMap[getAnimState()];
            if(animDivisor == 0)
            {
                animDivisor=12;
            }
            bool advanceAnims  = !(ticksPassed % (World::ticksPerSecond/animDivisor));

            if(advanceAnims)
            {
                auto currentAnim = getCurrentAnim();

                if(mAnimPlaying)
                {
                    if(mFrame < currentAnim->getAnimLength())
                        mFrame++;

                    if(mFrame >= currentAnim->getAnimLength())
                    {
                        mAnimPlaying = false;
                        mFrame--;
                    }
                }
                else {
                    if(!isDead())
                        mFrame = (mFrame + 1) % currentAnim->getAnimLength();
                    else if(mFrame < currentAnim->getAnimLength() -1)
                        mFrame++;
                }

                #ifndef NDEBUG
                    assert(mFrame < getCurrentAnim()->getAnimLength());
                #endif
            }

            if(mPos.current() != mDestination)
            {
                std::pair<float, float> vector = Misc::getVec(mPos.current(), mDestination);
                Actor * actor;
                actor = World::get()->getActorAt(mDestination.first, mDestination.second);
                if (canIAttack(actor))
                {
                        mPos.mDirection = Misc::getVecDir(vector);
                        mPos.update();
                        mPos.mDist = 0;

                        attack(actor);
                }
                else if(mPos.mDist == 0 && !mAnimPlaying)
                {

                    auto nextPos = Position(mPos.current().first, mPos.current().second, Misc::getVecDir(vector));
                    nextPos.mMoving = true;
                    World& world = *World::get();

                    FAWorld::Actor* actorAtNext = world.getActorAt(nextPos.next().first, nextPos.next().second);

                    if((noclip || (mLevel->getTile(nextPos.next().first, nextPos.next().second).passable() &&
                                                       (actorAtNext == NULL || actorAtNext == this))) && !mAnimPlaying)
                    {
                        if(!mPos.mMoving && !mAnimPlaying)
                        {
                            mPos.mMoving = true;
                            setAnimation(AnimState::walk);
                        }
                    }

                    else if(!mAnimPlaying)
                    {
                        mPos.mMoving = false;
                        mDestination = mPos.current();
                        setAnimation(AnimState::idle);

                    }
                    mPos.mDirection = Misc::getVecDir(vector);
                }
            }
            else if(mPos.mMoving && mPos.mDist == 0 && !mAnimPlaying)
            {
                mPos.mMoving = false;
                setAnimation(AnimState::idle);

            }

            if (!mIsDead && !mPos.mMoving && !mAnimPlaying && mAnimState != AnimState::idle)
                setAnimation(AnimState::idle);
            else if (!mIsDead && mPos.mMoving && !mAnimPlaying && mAnimState != AnimState::walk)
                setAnimation(AnimState::walk);

            if(!mAnimPlaying)
                mPos.update();
        }
    }