Ejemplo n.º 1
0
    //取得指定相鄰方向的格子
    public T getNeighborCell <T>(Vector2Int _pos, ArrowFlag _arrow) where T : Tile
    {
        Dictionary <ArrowFlag, Vector2Int> neighborPosList = new Dictionary <ArrowFlag, Vector2Int>();

        neighborPosList.Add(ArrowFlag.Top, new Vector2Int(0, 1));
        neighborPosList.Add(ArrowFlag.Right, new Vector2Int(1, 0));
        neighborPosList.Add(ArrowFlag.Bottom, new Vector2Int(0, -1));
        neighborPosList.Add(ArrowFlag.Left, new Vector2Int(-1, 0));

        return(getCell <T>(V2_V3(_pos + neighborPosList[_arrow])));
    }
Ejemplo n.º 2
0
    //

    //取得指定座標格的方向Flag
    ArrowFlag getCellRoadType(Vector2Int _pos)
    {
        ArrowFlag flag = ArrowFlag.None;

        List <ArrowFlag> flagList = new List <ArrowFlag>()
        {
            ArrowFlag.Top, ArrowFlag.Right, ArrowFlag.Bottom, ArrowFlag.Left
        };

        for (int i = 0; i < flagList.Count; i++)
        {
            Cell targetCell = getNeighborCell <Cell>(_pos, flagList[i]);
            if (targetCell != null)
            {
                if (targetCell.isPassable)
                {
                    flag = flag | flagList[i];
                }
            }
        }

        return(flag);
    }
Ejemplo n.º 3
0
    //由方向Flag轉換為對應Int
    int getRoadSpriteIndex(ArrowFlag _flag)
    {
        switch (_flag)
        {
        case ArrowFlag.Top | ArrowFlag.Bottom: return(0);                                                //上下

        case ArrowFlag.Right | ArrowFlag.Left: return(1);                                                //左右

        case ArrowFlag.Top | ArrowFlag.Right: return(2);                                                 //上右

        case ArrowFlag.Top | ArrowFlag.Left: return(3);                                                  //上左

        case ArrowFlag.Right | ArrowFlag.Bottom: return(4);                                              //右下

        case ArrowFlag.Left | ArrowFlag.Bottom: return(5);                                               //左下

        case ArrowFlag.Top | ArrowFlag.Right | ArrowFlag.Bottom: return(6);                              //上右下

        case ArrowFlag.Top | ArrowFlag.Right | ArrowFlag.Left: return(7);                                //上右左

        case ArrowFlag.Top | ArrowFlag.Bottom | ArrowFlag.Left: return(8);                               //上下左

        case ArrowFlag.Right | ArrowFlag.Bottom | ArrowFlag.Left: return(9);                             //右下左

        case ArrowFlag.Top | ArrowFlag.Right | ArrowFlag.Bottom | ArrowFlag.Left: return(10);            //上右下左

        case ArrowFlag.Top: return(11);                                                                  //上

        case ArrowFlag.Right: return(12);                                                                //右

        case ArrowFlag.Bottom: return(13);                                                               //下

        case ArrowFlag.Left: return(14);                                                                 //左

        default: return(0);
        }
    }
        static void drawAndSave(string filename, Model model, string colorCode, int size, string optString)
        {
            // Create a Bitmap object from a file.
            Bitmap   bitmap        = new Bitmap(size, size);
            Graphics graphics      = Graphics.FromImage(bitmap);
            int      defaultStrike = size / 100;

            for (int i = 0; i < colorCode.Length; i++)
            {
                Char colorChar = colorCode[i];
                if (colorChar == '_')
                {
                    continue;
                }
                Color         color        = colorMap[colorChar];
                Model.Polygen polygen      = model.GetPolygen(i);
                Point[]       points       = polygen.Points;
                PointF[]      scaledPoints = GetScaledPoints(points, size);
                graphics.FillPolygon(new SolidBrush(color), scaledPoints);
                int strike = polygen.GetStrikeSize(defaultStrike);
                if (strike > 0)
                {
                    graphics.DrawPolygon(new Pen(Color.Black, strike), scaledPoints);
                }
            }

            if (optString != null)
            {
                Pen arrowPen = new Pen(Color.Black, defaultStrike);

                string modelArrow = model.GetArrow(optString);
                if (modelArrow != null)
                {
                    optString = modelArrow;
                }
                string[] optStringArray = optString.Split(',');
                foreach (string optS in optStringArray)
                {
                    String    arrow = null;
                    ArrowFlag flag  = ArrowFlag.DEFAULT;
                    if (optS.Contains("--->"))
                    {
                        arrow = "--->";
                        flag  = ArrowFlag.EXTEND_START;
                    }
                    else if (optS.Contains("-->"))
                    {
                        arrow = "-->";
                        flag  = ArrowFlag.DEFAULT;
                    }
                    else if (optS.Contains("->"))
                    {
                        arrow = "->";
                        flag  = ArrowFlag.SHRINK_START;
                    }
                    else
                    {
                        throw new Exception("failed to parse data file.");
                    }

                    string[]      numStr        = optS.Split(new string[] { arrow }, StringSplitOptions.RemoveEmptyEntries);
                    int           first         = int.Parse(numStr[0]);
                    int           second        = int.Parse(numStr[1]);
                    Model.Polygen firstPolygen  = model.GetPolygen(first - 1);
                    Point[]       points        = firstPolygen.Points;
                    PointF[]      scaledPoints  = GetScaledPoints(points, size);
                    PointF        start         = GetCenter(scaledPoints);
                    Model.Polygen secondPolygen = model.GetPolygen(second - 1);
                    points       = secondPolygen.Points;
                    scaledPoints = GetScaledPoints(points, size);
                    PointF end = GetCenter(scaledPoints);
                    drawArrow(start, end, graphics, arrowPen, size, flag);
                }
            }

            // Save
            bitmap.Save(filename);
        }
        static void drawArrow(PointF start, PointF end, Graphics g, Pen pen, int size, ArrowFlag flag)
        {
            int    arrowSize = size / 100 * 6;
            double radians   = 0.0;

            if (start.X == end.X)
            {
                radians = Math.PI / 2 * (end.Y > start.Y ? 1 : -1);
            }
            else
            {
                radians = Math.Atan2(end.Y - start.Y, end.X - start.X);
            }
            int adjust = (flag == ArrowFlag.DEFAULT ? 0 : (flag == ArrowFlag.EXTEND_START ? 1 : -1)) * arrowSize;

            g.DrawLine(
                pen,
                (float)(start.X - adjust * Math.Cos(radians)),
                (float)(start.Y - adjust * Math.Sin(radians)),
                end.X,
                end.Y);
            PointF[] arrow = new PointF[] {
                new PointF((float)(end.X - Math.Sin(radians) * arrowSize / 2), (float)(end.Y + Math.Cos(radians) * arrowSize / 2)),
                new PointF((float)(end.X + Math.Sin(radians) * arrowSize / 2), (float)(end.Y - Math.Cos(radians) * arrowSize / 2)),
                new PointF((float)(end.X + Math.Cos(radians) * arrowSize / 2), (float)(end.Y + Math.Sin(radians) * arrowSize / 2))
            };
            g.FillPolygon(new SolidBrush(Color.Black), arrow);
        }