Пример #1
0
    /// <summary>
    /// 根据投掷物的创建参数, 创建投掷物.
    /// <para>按如下步骤处理子弹的分布:</para>
    /// <para>1 根据子弹的类型, 调整子弹方向, 并将个别类型的子弹的目标点缩放到子弹射程的最远点.</para>
    /// <para>2 依次应用分布参数.</para>
    /// 3 根据上述结果, 创建子弹.
    /// </summary>
    private static ErrorCode createProjectiles(ProjectileCreateParam param)
    {
        // 获取子弹分布.
        ArrayList distributionContainer = new ArrayList();

        // 处理子弹的飞行方向.
        param.TargetPosition = BulletAdjuster.AdjustBulletDirection(param.BulletRes, param.User,
                                                                    param.StartPosition, param.TargetPosition);

        // 调整个别类型的子弹的终点, 到子弹的最大射程.
        param.TargetPosition = BulletAdjuster.AdjustBulletTargetPosition(param.BulletRes, param.StartPosition, param.TargetPosition);

        // 根据子弹的分布, 调整子弹的起始/终点位置, 以及延迟等.
        ErrorCode err = computeBulletDistribution(distributionContainer, param);

        if (err != ErrorCode.Succeeded)
        {
            return(err);
        }

        // 产生子弹.
        foreach (BulletDistributionResultDef distribution in distributionContainer)
        {
            BulletInitParam initParam = new BulletInitParam()
            {
                resID          = (uint)param.BulletRes.resID,
                startPosition  = distribution.StartPosition,
                targetPosition = distribution.TargetPosition,
                firerAttr      = new AttackerAttr(param.User, param.SkillResID),
                createDelay    = distribution.Delay,
            };

            Bullet bullet = BulletFactory.Instance.Allocate(param.BulletRes.type);
            if (bullet != null && bullet.Init(initParam))
            {
                SceneManager.Instance.GetCurScene().AddSprte(bullet);
            }
        }

        return(err);
    }
Пример #2
0
    /// <summary>
    /// 计算子弹的分布.
    /// </summary>
    private static ErrorCode computeBulletDistribution(ArrayList result,
                                                       ProjectileCreateParam param)
    {
        DistributeHandler handler = null;

        switch (param.DistributionType)
        {
        case BulletDistributionType.ByAngle:
            handler = distributeByAngle;
            break;

        case BulletDistributionType.ByRandomOffset:
            handler = distributeByRandomOffset;
            break;

        case BulletDistributionType.ByData:
            handler = distributeByData;
            break;

        default:
            break;
        }

        DistributionComputeParam computeParam = new DistributionComputeParam()
        {
            distributionArgument = param.DistributionArgument,
            startPosition        = param.StartPosition,
            targetPosition       = param.TargetPosition
        };

        ErrorCode err = ErrorCode.ConfigError;

        if (handler != null)
        {
            err = handler(result, computeParam);
        }

        ErrorHandler.Parse(err, "failed to compute bullet distribution");
        return(err);
    }
Пример #3
0
    /// <summary>
    /// 创建投掷物.
    /// </summary>
    public static ErrorCode createProjectiles(BattleUnit user, uint skillResID, uint projResID, Vector3 targetPosition)
    {
        ProjectileSettingsTableItem projSettings = DataManager.ProjectileSettingsTable[projResID] as ProjectileSettingsTableItem;

        for (uint i = 0; i < ProjectileSettingsTableItem.ProjectileCount; ++i)
        {
            ProjectileItem item = projSettings.items[i];

            if (item.bulletResID == uint.MaxValue)
            {
                break;
            }

            BulletTableItem bulletRes = DataManager.BulletTable[item.bulletResID] as BulletTableItem;

            // 枪口特效.
            if (item.bindpointEffect != uint.MaxValue)
            {
                SkillClientBehaviour.AddEffect2Object(user, item.bindpointEffect, item.initBindpoint);
            }

            ProjectileCreateParam param = new ProjectileCreateParam()
            {
                User                 = user,
                StartPosition        = user.GetBonePositionByName(item.initBindpoint),
                TargetPosition       = targetPosition,
                DistributionType     = item.distributionType,
                DistributionArgument = item.distributionArgument,
                BulletRes            = bulletRes,
                SkillResID           = skillResID
            };

            createProjectiles(param);
        }

        return(ErrorCode.Succeeded);
    }