Exemple #1
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);
    }
Exemple #2
0
    private void CollidedByObject(IAffectedMovableObject affectedObject)
    {
        int curTime = STGStageManager.GetInstance().GetFrameSinceStageStart();
        GravitationParas paras;

        if (_affectedObjectDic.TryGetValue(affectedObject, out paras))
        {
            if (curTime - paras.lastUpdateTime == 1)
            {
                // 每帧重新计算向心力、离心力的角度
                if (_fieldType == GravitationType.Centripetal)
                {
                    paras.vAngle   = MathUtil.GetAngleBetweenXAxis(_curPos - affectedObject.GetPosition());
                    paras.accAngle = paras.vAngle;
                }
                else if (_fieldType == GravitationType.Centrifugal)
                {
                    paras.vAngle   = MathUtil.GetAngleBetweenXAxis(affectedObject.GetPosition() - _curPos);
                    paras.accAngle = paras.vAngle;
                }
                paras.timeInGravitationField++;
            }
            else
            {
                paras = CreateGravitationParas(affectedObject);
                paras.timeInGravitationField = 1;
            }
        }
        else
        {
            paras = CreateGravitationParas(affectedObject);
            paras.timeInGravitationField = 1;
        }
        paras.lastUpdateTime = curTime;
        _affectedObjectDic[affectedObject] = paras;
        // 设置额外运动参数
        affectedObject.AddExtraSpeedParas(paras.velocity, paras.vAngle, paras.acce * paras.timeInGravitationField, paras.accAngle);
    }