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)); }
public FloatRect TileRect(IntVector2 pos) { return(FloatRect.MakeFromVector2(this.MiddleOfTile(pos) - new Vector2(10f, 10f), this.MiddleOfTile(pos) + new Vector2(10f, 10f))); }
// 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++; } } }