Пример #1
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);
    }
Пример #2
0
    List <MyDrawRect> colliderDrawRect = new List <MyDrawRect>();   // 相交产生的矩形

    void ColliderChange()
    {
        for (int i = 0; i < colliderRect.Count; i++)
        {
            ColliderRect cInfo = colliderRect[i];
            MyDrawRect   rect;
            if (i < colliderDrawRect.Count)
            {
                rect = colliderDrawRect[i];
            }
            else
            {
                rect = GetFreeDrawRectObj();
                colliderDrawRect.Add(rect);
            }

            rect.transform.parent = colliderParent.transform;
            rect.transform.SetAsLastSibling();
            rect.transform.localPosition = Vector3.zero;
            rect.transform.localScale    = Vector3.one;
            rect.SetRect(cInfo.size, cInfo.position);

            DrawTileRect(cInfo.tile1);
            DrawTileRect(cInfo.tile2);
        }

        for (int i = colliderRect.Count; i < colliderDrawRect.Count; i++)
        {
            RecycleDrawRectObj(colliderDrawRect[i]);
        }

//        DrawColliderTile();
    }
Пример #3
0
    // 判断是否有矩形重叠
    void CheckSomeTileOverlapping(List <ColliderRect> colliderRect)
    {
        colliderRect.Clear();
        colliderTileList.Clear();
        // 当前点击的矩形的左上角坐标 左下角0,0坐标系y+矩形位置的/2+矩形大小的一半
        float curX1 = allTiles[selindex].realPos.x - allTiles[selindex].size.x / 2;
        float curY1 = allTiles[selindex].realPos.y - allTiles[selindex].size.y / 2 +
                      allTiles[selindex].show_size.y;
        // 当前点击的矩形的右下角坐标
        float curX2 = allTiles[selindex].realPos.x + allTiles[selindex].size.x / 2;
        float curY2 = allTiles[selindex].realPos.y - allTiles[selindex].size.y / 2;

//        Debug.Log($"curX1===curY1=----{(curX1, curY1)}");
//        Debug.Log($"curX2===curY2=----{(curX2, curY2)}");
        for (int i = 0; i < allTiles.Count; i++)
        {
            if (allTiles[i].id != allTiles[selindex].id)
            {
                float x1 = allTiles[i].realPos.x - allTiles[i].size.x / 2; // 矩形左上角的x坐标
                float y1 = allTiles[i].realPos.y - allTiles[i].size.y / 2 +
                           allTiles[i].show_size.y;                        // 矩形左上角的y坐标

                float x2 = allTiles[i].realPos.x + allTiles[i].size.x / 2; // 矩形右下角的x坐标
                float y2 = allTiles[i].realPos.y - allTiles[i].size.y / 2; //矩形右下角的y坐标

                float StartX    = Math.Min(x1, curX1);
                float EndX      = Math.Max(x2, curX2);
                float StartY    = Math.Max(y1, curY1);
                float EndY      = Math.Min(y2, curY2);
                float CurWidth  = (x2 - x1) + (curX2 - curX1) - (EndX - StartX); // 宽度
                float CurHeight = (y1 - y2) + (curY1 - curY2) - (StartY - EndY); // 高度

                if (CurWidth <= 0 || CurHeight <= 0)
                {
//                Debug.Log(" ------没有相交--------------- ");
                }
                else
                {
//                    Debug.Log(" ------相交--------------- ");
                    float tempX = Math.Max(x1, curX1); // 有相交则相交区域位置为:小中取大为左上角,大中取小为右下角
                    float tempY = Math.Min(y1, curY1);

                    Vector2      curPos = FloorPointChange(new Vector2(tempX, tempY));
                    ColliderRect rect   = new ColliderRect();
                    rect.position = curPos;
                    rect.size     = new Vector2(CurWidth, CurHeight);
                    rect.tile1    = allTiles[selindex];
                    rect.tile2    = allTiles[i];
                    colliderRect.Add(rect);
                    colliderTileList.Add(allTiles[i]);
                    colliderTileList.Add(allTiles[selindex]);
                }
            }
        }
    }
Пример #4
0
 public override void Clear()
 {
     _effect = null;
     _movementObjectTfList.Clear();
     _movementDataList.Clear();
     GameObject.Destroy(_masterSparkObject);
     _masterSparkObject = null;
     _masterSparkTf     = null;
     _sparkContainerTf  = null;
     _movementBodyTf    = null;
     _movementCount     = 0;
     _colliderRect      = null;
 }
Пример #5
0
 public void ClearColliderRectIgnoreTile(BlockTile tile)
 {
     for (int i = 0; i < colliderRect.Count; i++)
     {
         ColliderRect cInfo = colliderRect[i];
         if (tile != cInfo.tile1)
         {
             RecycleTileRectByTile(cInfo.tile1);
         }
         if (tile != cInfo.tile2)
         {
             RecycleTileRectByTile(cInfo.tile2);
         }
     }
 }
Пример #6
0
 /// <summary>
 /// 魔炮张开的阶段
 /// </summary>
 public void UpdateState1()
 {
     _curScaleX = MathUtil.GetEaseInQuadInterpolation(0, 1, _time, _duration);
     _sparkContainerTf.localScale = new Vector3(_curScaleX, 1, 1);
     if (_time >= _duration)
     {
         _curState          = 2;
         _nextMovementIndex = 0;
         _time = 0;
         // 设置碰撞
         _colliderRect = ColliderManager.GetInstance().CreateColliderByType(eColliderType.Rect) as ColliderRect;
         _colliderRect.SetSize(MasterSparkHitBoxWidth, MasterSpartHitBoxHeight);
         _colliderRect.SetColliderGroup(eColliderGroup.EnemyBullet | eColliderGroup.Enemy | eColliderGroup.Boss);
         _colliderRect.SetEliminateType(eEliminateDef.PlayerSpellCard);
         _colliderRect.SetHitEnemyDamage(1.5f);
         _colliderRect.SetPosition(Global.PlayerPos.x + _posOffset.x, Global.PlayerPos.y + _posOffset.y);
         _duration = 240;
     }
     _time++;
 }
    public static bool Get(object o, TValue key, out TValue res)
    {
        ColliderRect collider = (ColliderRect)o;

        res = new TValue();
        if (key.TtIsString())
        {
            switch (key.SValue())
            {
                #region 基础变量
            case "x":
            {
                res.SetNValue(collider.GetPosition().x);
                return(true);
            }

            case "y":
            {
                res.SetNValue(collider.GetPosition().y);
                return(true);
            }

            case "rot":
            {
                res.SetNValue(collider.GetRotation());
                return(true);
            }

            case "dx":
            {
                res.SetNValue(collider.dx);
                return(true);
            }

            case "dy":
            {
                res.SetNValue(collider.dy);
                return(true);
            }

            case "SetPos":
            {
                res.SetClCsValue(_funcSetPos);
                return(true);
            }

            case "GetPos":
            {
                res.SetClCsValue(_funcGetPos);
                return(true);
            }

                #endregion
                #region 运动相关变量
            case "v":
            {
                res.SetNValue(collider.velocity);
                return(true);
            }

            case "vx":
            {
                res.SetNValue(collider.vx);
                return(true);
            }

            case "vy":
            {
                res.SetNValue(collider.vy);
                return(true);
            }

            case "vAngle":
            {
                res.SetNValue(collider.vAngle);
                return(true);
            }

            case "maxV":
            {
                res.SetNValue(collider.maxVelocity);
                return(true);
            }

            case "acce":
            {
                res.SetNValue(collider.acce);
                return(true);
            }

            case "accAngle":
            {
                res.SetNValue(collider.accAngle);
                return(true);
            }

                #endregion
                #region Collider类专属变量
            case "SetCollisionGroup":
            {
                res.SetClCsValue(_funcSetCollisionGroup);
                return(true);
            }

            case "SetSize":
            {
                res.SetClCsValue(_funcSetSize);
                return(true);
            }

            case "SetExistDuration":
            {
                res.SetClCsValue(_funcSetExistDuration);
                return(true);
            }

                #endregion
                #region 运动类专属方法 ISTGMovable
            case "SetV":
            {
                res.SetClCsValue(_funcSetV);
                return(true);
            }

            case "SetAcce":
            {
                res.SetClCsValue(_funcSetAcce);
                return(true);
            }

            case "SetStraightParas":
            {
                res.SetClCsValue(_funcSetStraightParas);
                return(true);
            }

            case "SetPolarParas":
            {
                res.SetClCsValue(_funcSetPolarParas);
                return(true);
            }

            case "MoveTo":
            {
                res.SetClCsValue(_funcMoveTo);
                return(true);
            }

            case "MoveTowards":
            {
                res.SetClCsValue(_funcMoveTowards);
                return(true);
            }

                #endregion
                #region IAttachable
            case "AttachTo":
            {
                res.SetClCsValue(_funcAttachTo);
                return(true);
            }

            case "SetRelativePos":
            {
                res.SetClCsValue(_funcSetRelativePos);
                return(true);
            }

                #endregion
                #region ITaskExecuter
            case "AddTask":
            {
                res.SetClCsValue(_funcAddTask);
                return(true);
            }
                #endregion
            }
        }
        res.SetSValue(string.Format("GetField from userData fail!Invalid key {0} for type {1}", key, typeof(ColliderRect).Name));
        return(false);
    }
    public static bool Set(object o, TValue key, ref TValue value)
    {
        ColliderRect collider = (ColliderRect)o;

        if (key.TtIsString())
        {
            switch (key.SValue())
            {
                #region 基础变量
            case "x":
            {
                Vector2 pos = collider.GetPosition();
                pos.x = (float)value.NValue;
                collider.SetPosition(pos);
                return(true);
            }

            case "y":
            {
                Vector2 pos = collider.GetPosition();
                pos.y = (float)value.NValue;
                collider.SetPosition(pos);
                return(true);
            }

            case "rot":
            {
                collider.SetRotation((float)value.NValue);
                return(true);
            }

                #endregion
                #region 运动相关变量
            case "v":
            {
                collider.velocity = (float)value.NValue;
                return(true);
            }

            case "vx":
            {
                collider.vx = (float)value.NValue;
                return(true);
            }

            case "vy":
            {
                collider.vy = (float)value.NValue;
                return(true);
            }

            case "vAngle":
            {
                collider.vAngle = (float)value.NValue;
                return(true);
            }

            case "maxV":
            {
                collider.maxVelocity = (float)value.NValue;
                return(true);
            }

            case "acce":
            {
                collider.acce = (float)value.NValue;
                return(true);
            }

            case "accAngle":
            {
                collider.accAngle = (float)value.NValue;
                return(true);
            }
                #endregion
            }
        }
        value.SetSValue(string.Format("SetField of userData fail!Invalid key {0} for type {1}", key, typeof(ColliderRect).Name));
        return(false);
    }