コード例 #1
0
ファイル: player.cpp プロジェクト: mekolat/elektrogamesvn
void Player::logic()
{
    switch (mAction)
    {
        case STAND:
        case SIT:
        case DEAD:
        case HURT:
           break;

        case WALK:
            mFrame = (get_elapsed_time(mWalkTime) * 6) / getWalkSpeed();
            if (mFrame >= 6)
                nextStep();
            break;

        case ATTACK:
            int rotation = 0;
            std::string particleEffect = "";
            int frames = 4;

            if (mEquippedWeapon &&
                mEquippedWeapon->getAttackType() == ACTION_ATTACK_BOW)
            {
                frames = 5;
            }

            mFrame = (get_elapsed_time(mWalkTime) * frames) / mAttackSpeed;

            //attack particle effect
            if (mEquippedWeapon)
                particleEffect = mEquippedWeapon->getParticleEffect();

            if (!particleEffect.empty() && mParticleEffects && mFrame == 1)
            {
                switch (mDirection)
                {
                    case DOWN: rotation = 0; break;
                    case LEFT: rotation = 90; break;
                    case UP: rotation = 180; break;
                    case RIGHT: rotation = 270; break;
                    default: break;
                }
                Particle *p;
                p = particleEngine->addEffect("graphics/particles/" +
                                              particleEffect, 0, 0, rotation);
                controlParticle(p);
            }

            if (mFrame >= frames)
                nextStep();

            break;
    }

    Being::logic();
}
コード例 #2
0
ファイル: monster.cpp プロジェクト: mekolat/elektrogamesvn
void Monster::setAction(Action action, int attackType)
{
    SpriteAction currentAction = ACTION_INVALID;
    int rotation = 0;
    std::string particleEffect;

    switch (action)
    {
        case WALK:
            currentAction = ACTION_WALK;
            break;
        case DEAD:
            currentAction = ACTION_DEAD;
            sound.playSfx(getInfo().getSound(MONSTER_EVENT_DIE));
            break;
        case ATTACK:
            currentAction = getInfo().getAttackAction(attackType);
            for (SpriteIterator it = mSprites.begin(); it != mSprites.end(); it++)
                (*it)->reset();

            //attack particle effect
            particleEffect = getInfo().getAttackParticleEffect(attackType);
            if (!particleEffect.empty() && mParticleEffects)
            {
                switch (mSpriteDirection)
                {
                    case DIRECTION_DOWN: rotation = 0; break;
                    case DIRECTION_LEFT: rotation = 90; break;
                    case DIRECTION_UP: rotation = 180; break;
                    case DIRECTION_RIGHT: rotation = 270; break;
                    default: break;
                }
                Particle *p;
                p = particleEngine->addEffect(particleEffect, 0, 0, rotation);
                controlParticle(p);
            }
            break;
        case STAND:
           currentAction = ACTION_STAND;
           break;
        case HURT:
           // Not implemented yet
           break;
        case SIT:
           // Also not implemented yet
           break;
    }

    if (currentAction != ACTION_INVALID)
    {
        for (SpriteIterator it = mSprites.begin(); it != mSprites.end(); it++)
            if (*it)
                (*it)->play(currentAction);
        mAction = action;
    }
}
コード例 #3
0
ファイル: monster.cpp プロジェクト: mekolat/elektrogamesvn
Monster::Monster(int id, int job, Map *map):
    Being(id, job, map)
{
    const MonsterInfo& info = getInfo();

    // Setup Monster sprites
    const std::list<std::string> &sprites = info.getSprites();

    for (std::list<std::string>::const_iterator i = sprites.begin();
         i != sprites.end(); i++)
    {
        std::string file = "graphics/sprites/" + *i;
        mSprites.push_back(AnimatedSprite::load(file));
    }

    // Ensure that something is shown
    if (mSprites.size() == 0)
    {
        mSprites.push_back(AnimatedSprite::load("graphics/sprites/error.xml"));
    }

    if (mParticleEffects)
    {
        const std::list<std::string> &particleEffects = info.getParticleEffects();
        for (std::list<std::string>::const_iterator i = particleEffects.begin();
             i != particleEffects.end(); i++)
        {
            controlParticle(particleEngine->addEffect((*i), 0, 0));
        }
    }

    mNameColor = &guiPalette->getColor(Palette::MONSTER);
    mTextColor = &guiPalette->getColor(Palette::MONSTER);

    Being::setName(getInfo().getName());
}
コード例 #4
0
ファイル: localplayer.cpp プロジェクト: stevecotton/Aethyra
void LocalPlayer::logic()
{
    switch (mAction)
    {
        case STAND:
           break;

        case SIT:
           break;

        case DEAD:
           break;

        case HURT:
           break;

        case WALK:
            mFrame = (get_elapsed_time(mWalkTime) * 6) / mWalkSpeed;
            if (mFrame >= 6)
                nextStep();
            break;

        case ATTACK:
            int rotation = 0;
            std::string particleEffect = "";
            int frames = 4;

            if (mEquippedWeapon &&
                mEquippedWeapon->getAttackType() == ACTION_ATTACK_BOW)
                frames = 5;

            mFrame = (get_elapsed_time(mWalkTime) * frames) / mAttackSpeed;

            //attack particle effect
            if (mEquippedWeapon)
                particleEffect = mEquippedWeapon->getParticleEffect();

            if (!particleEffect.empty() && mParticleEffects && mFrame == 1)
            {
                switch (mDirection)
                {
                    case DOWN:
                        rotation = 0;
                        break;
                    case LEFT:
                        rotation = 90;
                        break;
                    case UP:
                        rotation = 180;
                        break;
                    case RIGHT:
                        rotation = 270;
                        break;
                    default:
                        break;
                }
                Particle *p;
                p = particleEngine->addEffect("graphics/particles/" +
                                              particleEffect, 0, 0, rotation);
                controlParticle(p);
            }

            if (mFrame >= frames)
                nextStep();

            break;
    }

    // Actions are allowed once per second
    if (get_elapsed_time(mLastAction) >= 1000)
        mLastAction = -1;

    // Remove target if its been on a being for more than a minute
    if (get_elapsed_time(mTargetTime) >= 60000)
    {
        mTargetTime = -1;
        setTarget(NULL);
    }

    if (mTarget)
    {
        // Find whether target is in range
        const int rangeX = abs(mTarget->mX - mX);
        const int rangeY = abs(mTarget->mY - mY);
        const int attackRange = getAttackRange();
        const int inRange = rangeX > attackRange || rangeY > attackRange ? 1 : 0;

        mTarget->setTargetAnimation(
            mTargetCursor[inRange][mTarget->getTargetCursorSize()]);

        if (mTarget->mAction == DEAD)
            stopAttack();

        if (mKeepAttacking && mTarget)
            attack(mTarget, true);
    }

    Being::logic();
}