コード例 #1
0
    /// <summary>
    /// 根据ChangeValue的值获取对应的值并返回
    /// </summary>
    /// <param name="changeValue"></param>
    /// <returns></returns>
    private float GetValueByChangeValue(ParaChangeValue changeValue)
    {
        float value = 0;

        if (changeValue.argType == 0)
        {
            value = changeValue.arg0;
        }
        else if (changeValue.argType == 1)
        {
            Vector2 playerPos = new Vector2(Global.PlayerPos.x, Global.PlayerPos.y);
            Vector2 bulletPos = _bullet.GetPosition();
            float   angle     = MathUtil.GetAngleBetweenXAxis(playerPos - bulletPos);
            value = angle;
        }
        else if (changeValue.argType == 2)
        {
            Vector2 targetPos = new Vector2(changeValue.arg0, changeValue.arg1);
            Vector2 bulletPos = _bullet.GetPosition();
            float   angle     = MathUtil.GetAngleBetweenXAxis(targetPos - bulletPos);
            value = angle;
        }
        if (changeValue.offset != 0)
        {
            value += MTRandom.GetNextFloat(-changeValue.offset, changeValue.offset);
        }
        return(value);
    }
コード例 #2
0
ファイル: LuaLib.cs プロジェクト: LostTemple1990/BarrageDemo
    public static int GetRandomFloat(ILuaState luaState)
    {
        float begin = (float)luaState.ToNumber(-2);
        float end   = (float)luaState.ToNumber(-1);

        luaState.PushNumber(MTRandom.GetNextFloat(begin, end));
        return(1);
    }
コード例 #3
0
    public override void Start()
    {
        SCEffect effect;
        float    angle = MTRandom.GetNextFloat(0, 360);

        for (int i = 0; i < MaxEffectCount; i++)
        {
            effect = new SCEffect();
            effect.Init(angle + i * 45, i);
            _effectList.Add(effect);
        }
        // 音效
        SoundManager.GetInstance().Play("se_masterspark", 0.1f, false, true);
    }
コード例 #4
0
    private GravitationParas CreateGravitationParas(IAffectedMovableObject affectedObj)
    {
        // 偏移计算
        float velocityOffset = _velocityOffset == 0 ? 0 : MTRandom.GetNextFloat(-_velocityOffset, _velocityOffset);
        float acceOffset     = _acceOffset == 0 ? 0 : MTRandom.GetNextFloat(-_acceOffset, _acceOffset);
        // 计算实际的额外运动参数
        float v = _velocity + velocityOffset;
        float acce = _acce + acceOffset;
        float vAngle = _vAngle, accAngle = _accAngle;

        // 中心吸力
        if (_fieldType == GravitationType.Centripetal)
        {
            Vector2 affectObjectPos = affectedObj.GetPosition();
            Vector2 fieldPos        = _curPos;
            float   angle           = MathUtil.GetAngleBetweenXAxis(fieldPos - affectObjectPos);
            vAngle   = angle;
            accAngle = angle;
        }
        // 中心斥力
        else if (_fieldType == GravitationType.Centrifugal)
        {
            Vector2 affectObjectPos = affectedObj.GetPosition();
            Vector2 fieldPos        = _curPos;
            float   angle           = MathUtil.GetAngleBetweenXAxis(affectObjectPos - fieldPos);
            vAngle   = angle;
            accAngle = angle;
        }
        // 只有普通立场才计算偏移
        if (_fieldType == GravitationType.Normal)
        {
            float vAngleOffset   = _vAngleOffset == 0 ? 0 : MTRandom.GetNextFloat(-_vAngleOffset, _vAngleOffset);
            float accAngleOffset = _accAngleOffset == 0 ? 0 : MTRandom.GetNextFloat(-_accAngleOffset, _accAngleOffset);
            // 计算速度方向以及加速度方向
            vAngle   += vAngleOffset;
            accAngle += accAngleOffset;
        }

        GravitationParas paras = new GravitationParas
        {
            velocity = v,
            vAngle   = vAngle,
            acce     = acce,
            accAngle = accAngle,
        };

        return(paras);
    }
コード例 #5
0
    /// <summary>
    /// 掉落物品
    /// </summary>
    /// <param name="itemDatas">结构 type,count</param>
    /// <para>举例: 1,5,2,3,5,6</para>
    /// <para>即生成type=1的5个,type=2的3个,type=5的6个</para>
    /// <param name="centerX"></param>
    /// <param name="centerY"></param>
    /// <param name="halfWidth"></param>
    /// <param name="halfHeight"></param>
    public void DropItems(List <int> itemDatas, float centerX, float centerY, float halfWidth, float halfHeight)
    {
        float    beginX = centerX - halfWidth;
        float    endX   = centerX + halfWidth;
        float    beginY = centerY - halfHeight;
        float    endY   = centerY + halfHeight;
        ItemType itemType;
        int      itemCount;

        for (int i = 0, len = itemDatas.Count; i < len; i += 2)
        {
            itemType  = (ItemType)itemDatas[i];
            itemCount = itemDatas[i + 1];
            for (int j = 0; j < itemCount; j++)
            {
                CreateItemByItemType(itemType, MTRandom.GetNextFloat(beginX, endX), MTRandom.GetNextFloat(beginY, endY));
            }
        }
    }
コード例 #6
0
    /// <summary>
    /// 敌机在duration的持续时间内进行移动
    /// <para>移动的目标地点以及方式在之前设置的范围、振幅、模式里面</para>
    /// </summary>
    /// <param name="duration"></param>
    public virtual void DoWander(int duration)
    {
        // 记录移动方向是否有效的数组
        List <int> availableDir = new List <int>();
        int        dir;
        float      minX, maxX, minY, maxY, toX, toY;
        // 根据dirMode计算重新计算边界
        Vector2 playerPos = Global.PlayerPos;

        // 向左
        if (_curPos.x - _wanderAmplitudeX.x >= _wanderRangeX.x)
        {
            availableDir.Add(0);
        }
        if (_curPos.x + _wanderAmplitudeX.x <= _wanderRangeX.y)
        {
            availableDir.Add(1);
        }
        if (availableDir.Count == 0)
        {
            toX = _curPos.x;
        }
        else
        {
            dir = MTRandom.GetNextInt(0, 1);
            if (_dirMode == DirectionMode.MoveXTowardsPlayer || _dirMode == DirectionMode.MoveTowardsPlayer)
            {
                //往左移动
                if (playerPos.x < _curPos.x)
                {
                    dir = 0;
                }
                else
                {
                    dir = 1;
                }
                if (availableDir.IndexOf(dir) == -1)
                {
                    dir = 1 - dir;
                }
            }
            else
            {
                dir = MTRandom.GetNextInt(0, availableDir.Count - 1);
            }
            // 左移动,计算左移动的最大值和最小值
            if (dir == 0)
            {
                maxX = _curPos.x - _wanderAmplitudeX.x;
                minX = _curPos.x - _wanderAmplitudeX.y < _wanderRangeX.x ? _wanderRangeX.x : _curPos.x - _wanderAmplitudeX.y;
            }
            else
            {
                minX = _curPos.x + _wanderAmplitudeX.x;
                maxX = _curPos.x + _wanderAmplitudeX.y > _wanderRangeX.y ? _wanderRangeX.y : _curPos.x + _wanderAmplitudeX.y;
            }
            toX = MTRandom.GetNextFloat(minX, maxX);
        }
        // 计算Y的范围 0 = 下, 1 = 上
        availableDir.Clear();
        // 往下
        if (_curPos.y - _wanderAmplitudeY.x >= _wanderRangeY.x)
        {
            availableDir.Add(0);
        }
        // 往上
        if (_curPos.y + _wanderAmplitudeY.x <= _wanderRangeY.y)
        {
            availableDir.Add(1);
        }
        if (availableDir.Count == 0)
        {
            toY = _curPos.y;
        }
        else
        {
            if (_dirMode == DirectionMode.MoveYTowardsPlayer || _dirMode == DirectionMode.MoveTowardsPlayer)
            {
                //往下移动
                if (playerPos.y < _curPos.y)
                {
                    dir = 0;
                }
                else
                {
                    dir = 1;
                }
                if (availableDir.IndexOf(dir) == -1)
                {
                    dir = 1 - dir;
                }
            }
            else
            {
                dir = MTRandom.GetNextInt(0, availableDir.Count - 1);
            }
            // 向下移动
            if (dir == 0)
            {
                maxY = _curPos.y - _wanderAmplitudeY.x;
                minY = _curPos.y - _wanderAmplitudeY.y < _wanderRangeY.x ? _wanderRangeY.x : _curPos.y - _wanderAmplitudeY.y;
            }
            else
            {
                minY = _curPos.y + _wanderAmplitudeY.x;
                maxY = _curPos.y + _wanderAmplitudeY.y > _wanderRangeY.y ? _wanderRangeY.y : _curPos.y + _wanderAmplitudeY.y;
            }
            toY = MTRandom.GetNextFloat(minY, maxY);
        }
        MoveTo(toX, toY, duration, _wanderMode);
        //Logger.Log("wander from " + _curPos + " to " + new Vector2(toX, toY));
    }