コード例 #1
0
    public void Check(Collider a, Collider b)
    {
        eColliderType type1 = a.GetColliderType();
        eColliderType type2 = b.GetColliderType();

        switch (type1)
        {
        case eColliderType.Circle:
            switch (type2)
            {
            case eColliderType.Circle:
                CheckCircleAndCircle(a as Circle, b as Circle);
                break;

            case eColliderType.Polygon:
                CheckPolygonAndCircle(b as Polygon, a as Circle);
                break;
            }
            break;

        case eColliderType.Polygon:
            switch (type2)
            {
            case eColliderType.Circle:
                //CheckPolygonAndCircle(a as Polygon, b as Circle);
                break;

            case eColliderType.Polygon:
                //CheckPolygonAndCircle(b as Polygon, a as Circle);
                break;
            }
            break;
        }
    }
コード例 #2
0
    public ObjectColliderBase CreateColliderByType(eColliderType type)
    {
        ObjectColliderBase collider = null;

        switch (type)
        {
        case eColliderType.Circle:
            collider = new ColliderCircle();
            break;

        case eColliderType.Rect:
            collider = new ColliderRect();
            break;

        case eColliderType.ItalicRect:
            collider = new ColliderItalicRect();
            break;

        default:
            Logger.LogError("Collider Type " + type + " is not exist!");
            break;
        }
        _colliderList.Add(collider);
        _colliderCount++;
        return(collider);
    }
コード例 #3
0
    /// <summary>
    /// 根据类型创建一个引力场
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int CreateGravitationFieldByType(ILuaState luaState)
    {
        eColliderType      type     = (eColliderType)luaState.ToInteger(-1);
        ObjectColliderBase collider = ColliderManager.GetInstance().CreateGravitationFieldByType(type);

        luaState.PushLightUserData(collider);
        return(1);
    }
コード例 #4
0
    public ObjectColliderBase CreateGravitationFieldByType(eColliderType type)
    {
        ObjectColliderBase collider = null;

        switch (type)
        {
        case eColliderType.Circle:
            collider = new GravitationFieldCircle();
            break;

        case eColliderType.Rect:
            collider = new GravitationFieldRect();
            break;

        default:
            Logger.LogError("GravitationField Type " + type + " is not exist!");
            break;
        }
        _fieldList.Add(collider);
        _fieldCount++;
        return(collider);
    }
コード例 #5
0
    /// <summary>
    /// 创建自定义的collider
    /// <para>customizedName 自定义的类型名称</para>
    /// <para>eColliderType collider的形状类别</para>
    /// <para>参数...</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int CreateCustomizedCollider(ILuaState luaState)
    {
        int           top            = luaState.GetTop();
        int           numArgs        = top - 2;
        string        customizedName = luaState.ToString(-top);
        eColliderType type           = (eColliderType)luaState.ToInteger(-top + 1);
        int           funcRef        = InterpreterManager.GetInstance().GetCustomizedFuncRef(customizedName, eCustomizedType.Collider, eCustomizedFuncRefType.Init);

        luaState.RawGetI(LuaDef.LUA_REGISTRYINDEX, funcRef);
        ObjectColliderBase collider = ColliderManager.GetInstance().CreateColliderByType(type);

        luaState.PushLightUserData(collider);
        // 复制参数
        int copyIndex = -numArgs - 2;

        for (int i = 0; i < numArgs; i++)
        {
            luaState.PushValue(copyIndex);
        }
        luaState.Call(numArgs + 1, 0);
        // 返回结果
        luaState.PushLightUserData(collider);
        return(1);
    }
コード例 #6
0
ファイル: PhysicalSystem.cs プロジェクト: mengtest/fs
        /// <summary>
        ///  通过距离,已优化
        /// </summary>
        public void MoveCheck(Collider a, Collider b)
        {
            if (!a.active || !b.active)
            {
                return;
            }
            if (a == b)
            {
                return;
            }
            if (a is Polygon && b is Polygon)     // 障碍之间不检测
            {
                return;
            }

            if (!m_rolePush)                      // 角色不碰撞时,都是圆时,不处理
            {
                if (a is Circle && b is Circle)
                {
                    return;
                }
            }
            else
            {
                if (a is Circle && b is Circle)   // 如果角色需要碰撞,并且都是圆,很远时,不处理
                {
                    FPCollide.GetDis2(ref m_dis2, ref a.c, ref b.c);
                    if (m_dis2 > CircleCircleDis2)
                    {
                        return;
                    }
                }
            }

            if (a is Circle && b is Polygon)      // 角色和障碍太远不处理
            {
                FPCollide.GetDis2(ref m_dis2, ref a.c, ref b.c);
                if (m_dis2 > CirclePolygonDis2)
                {
                    return;
                }
            }

            eColliderType type1 = a.GetColliderType();
            eColliderType type2 = b.GetColliderType();

            switch (type1)
            {
            case eColliderType.Circle:
                switch (type2)
                {
                case eColliderType.Circle:
                    CheckCircleAndCircle(a as Circle, b as Circle);
                    break;

                case eColliderType.Polygon:
                    CheckPolygonAndCircle(b as Polygon, a as Circle);
                    break;
                }
                break;
            }
        }