コード例 #1
0
        public static FloatRect RectCollision(Vector2 pos, Vector2 lastPos, FloatRect rct)
        {
            //检测上一帧位置与当前位置,连线是否与Rect边界存在交点
            Vector2 leftVec   = Utils.VerticalCrossPoint(lastPos, pos, rct.left);
            Vector2 rightVec  = Utils.VerticalCrossPoint(lastPos, pos, rct.right);
            Vector2 bottomVec = Utils.HorizontalCrossPoint(lastPos, pos, rct.bottom);
            Vector2 topVec    = Utils.HorizontalCrossPoint(lastPos, pos, rct.top);

            //如果X轴未变化,统一 上、下交点的X值
            if (lastPos.x == (double)pos.x)
            {
                bottomVec = new Vector2(lastPos.x, rct.bottom);
                topVec    = new Vector2(lastPos.x, rct.top);
            }
            //如果上一帧位置不再Rect中,计算两帧距离变化
            float   dst        = !rct.Vector2Inside(lastPos) ? Vector2.Distance(lastPos, pos) : float.MaxValue;
            Vector2 upperRight = new Vector2(0.0f, 0.0f);
            Vector2 lowerLeft  = pos;

            //如果左边界交点Y值 在Top和Bottom之间  &&  上一帧位置和交点位置小于距离:证明位移与Rect发生碰撞,从左边界进入
            if (leftVec.y >= (double)rct.bottom && leftVec.y <= (double)rct.top && Utils.DistLess(lastPos, leftVec, dst))
            {
                lowerLeft  = leftVec;
                dst        = Vector2.Distance(lastPos, leftVec);
                upperRight = new Vector2(1f, 0.0f);
            }
            //右边界碰撞
            if (rightVec.y >= (double)rct.bottom && rightVec.y <= (double)rct.top && Utils.DistLess(lastPos, rightVec, dst))
            {
                lowerLeft  = rightVec;
                dst        = Vector2.Distance(lastPos, rightVec);
                upperRight = new Vector2(-1f, 0.0f);
            }
            //下边界碰撞
            if (bottomVec.x >= (double)rct.left && bottomVec.x <= (double)rct.right && Utils.DistLess(lastPos, bottomVec, dst))
            {
                lowerLeft  = bottomVec;
                dst        = Vector2.Distance(lastPos, bottomVec);
                upperRight = new Vector2(0.0f, 1f);
            }
            //上边界碰撞
            if (topVec.x >= (double)rct.left && topVec.x <= (double)rct.right && Utils.DistLess(lastPos, topVec, dst))
            {
                lowerLeft = topVec;
                Vector2.Distance(lastPos, topVec);
                upperRight = new Vector2(0.0f, -1f);
            }
            return(FloatRect.MakeFromVector2(lowerLeft, upperRight));
        }
コード例 #2
0
 public FloatRect TileRect(IntVector2 pos)
 {
     return(FloatRect.MakeFromVector2(this.MiddleOfTile(pos) - new Vector2(10f, 10f), this.MiddleOfTile(pos) + new Vector2(10f, 10f)));
 }
コード例 #3
0
    // Token: 0x06001C81 RID: 7297 RVA: 0x001847C0 File Offset: 0x001829C0
    private void FindGrabPos()
    {
        if (grabDelay > 0)
        {
            grabDelay--;
            return;
        }
        IntVector2?intVector = null;
        int        num       = 0;

        while (num < 9 && intVector == null)
        {
            intVector = SharedPhysics.RayTraceTilesForTerrainReturnFirstSolid(room, BasePos, room.GetTilePosition(desiredGrabPos) + Custom.eightDirectionsAndZero[num] * 5);
            if (intVector != null && room.GetTile(intVector.Value + new IntVector2(0, 1)).Solid)
            {
                intVector = null;
            }
            num++;
        }
        if (intVector != null)
        {
            if (grabDest == null || GripPointAttractiveness(intVector.Value) > GripPointAttractiveness(grabDest.Value))
            {
                MoveGrabDest(Custom.RestrictInRect(FloatBase + tentacleDir * Vector2.Distance(FloatBase, room.MiddleOfTile(intVector.Value)) * 0.5f, FloatRect.MakeFromVector2(room.MiddleOfTile(intVector.Value) - new Vector2(11f, 11f), room.MiddleOfTile(intVector.Value) + new Vector2(11f, 11f))));
                sureOfFootingCounter = 0;
            }
            else
            {
                sureOfFootingCounter++;
            }
        }
    }