Example #1
0
    /// <summary>
    /// 处理命中时的伤害变化
    /// </summary>
    private void ProcessDirectDamage()
    {
        Assert.Should(m_tempTargeters != null);

        //  直接伤害:直线
        if (BulletTypeUtil.IsLine(Entity.model.bulletType))
        {
            foreach (var tar in m_tempTargeters)
            {
                var pos       = tar.GetCurrentPosition();
                var targeters = FindTargetersLine(pos.x, pos.y, 0.8f);  //  REMARK:这里直线宽度暂时设置为0.8个格子大小(可以适当调整)
                GameDamageManager.ProcessDamageMultiTargeters(targeters, Entity.model, Entity);
            }
        }
        //  直接伤害:扇形(包括360度环形)
        else if (Entity.model.attackAngle > 0)
        {
            foreach (var tar in m_tempTargeters)
            {
                var pos       = tar.GetCurrentPosition();
                var targeters = FindTargetersInAngle(pos.x, pos.y, Entity.model.attackAngle);
                GameDamageManager.ProcessDamageMultiTargeters(targeters, Entity.model, Entity);
            }
        }
        //  直接伤害:其他形状
        else
        {
            GameDamageManager.ProcessDamageMultiTargeters(m_tempTargeters, Entity.model, Entity);
        }
    }
Example #2
0
    /// <summary>
    /// 根据AttackPoint处理发射字段或直接伤害
    /// </summary>
    /// <param name="obj"></param>
    private void view_OnFireBullet(List <Vector3> obj)
    {
        //  全跪了则不处理了o.o
        if (AuxIsAllDead())
        {
            return;
        }

        var bt = Entity.model.bulletType;

        //  在AttackPoint点造成直接伤害
        if (BulletTypeUtil.IsDirectDamage(bt))
        {
            //  处理非循环子弹效果
            if (BulletTypeUtil.IsUnLoopEffect(bt))
            {
                Assert.Should(Entity.model.bulletName != null && Entity.model.bulletName != Constants.EMPTY);
                //  连接类型效果数量是 挂载点数 * 目标数
                var effIdList = new List <int>();
                for (int i = 0; i < obj.Count * m_tempTargeters.Count; i++)
                {
                    effIdList.Add(GameEffectManager.Instance.AddEffect(Entity.model.bulletName, Vector3.zero, false));
                }
                //  初始化效果相关属性
                InitBulletEffectAttribute(bt, obj, effIdList, m_tempTargeters.RubyMap(tar => tar.GetCurrentPositionCenter()));
            }
            ProcessDirectDamage();
        }
        //  在AttackPoint处发射子弹
        else if (BulletTypeUtil.IsFireBullet(bt))
        {
            foreach (var firepos in obj)
            {
                ProcessFireBullet(new Vector2(firepos.x, firepos.z));
            }
        }
        else
        {
            Assert.Should(false, "invalid bullet type...: " + bt);
        }
    }
Example #3
0
    /// <summary>
    /// 处理子弹 - 循环效果类的子弹
    /// </summary>
    private void ProcessBullet_LoopEffect()
    {
        //  不是循环效果类型子弹直接返回
        if (!BulletTypeUtil.IsLoopEffect(Entity.model.bulletType))
        {
            return;
        }

        //  没对应的挂载点则返回
        var effAttackPoint = Entity.effAttachPoint();

        if (effAttackPoint == null)
        {
            return;
        }

        Assert.Should(Entity.model.bulletName != null && Entity.model.bulletName != Constants.EMPTY);

        //  添加循环子弹效果
        var effectName = Entity.model.bulletName;

        //  计算需要的效果数量
        var needEffectCount = 0;

        switch (Entity.model.bulletType)
        {
        case EntityBulletType.LoopEffectLock:
            needEffectCount = effAttackPoint.Count;                             //  朝阳目标的(类似火焰等)需要的数量和挂载点数一致)
            break;

        case EntityBulletType.LoopEffectLink:
            needEffectCount = effAttackPoint.Count * m_tempTargeters.Count;     //  REMARK:连接目标的(需要的熟练是挂在点数和目标数的乘机)
            break;

        default:
            break;
        }

        //  初始化N个效果
        if (m_bulletLoopEffectIdList == null)
        {
            m_bulletLoopEffectIdList = new List <int>();
            for (int i = 0; i < needEffectCount; i++)
            {
                m_bulletLoopEffectIdList.Add(GameEffectManager.Instance.AddEffect(effectName, Vector3.zero, true));
            }
        }
        //  释放多余的效果
        else if (m_bulletLoopEffectIdList.Count > needEffectCount)
        {
            do
            {
                int effId = m_bulletLoopEffectIdList[0];
                m_bulletLoopEffectIdList.RemoveAt(0);
                GameEffectManager.Instance.RemoveEffect(effId);
            } while (m_bulletLoopEffectIdList.Count > needEffectCount);
        }
        //  补齐不足的数量
        else
        {
            int num = needEffectCount - m_bulletLoopEffectIdList.Count;
            for (int i = 0; i < num; i++)
            {
                m_bulletLoopEffectIdList.Add(GameEffectManager.Instance.AddEffect(effectName, Vector3.zero, true));
            }
        }

        //  初始化效果相关属性
        InitBulletEffectAttribute(Entity.model.bulletType, effAttackPoint, m_bulletLoopEffectIdList, m_tempTargeters.RubyMap(tar => tar.GetCurrentPositionCenter()));
    }