Exemple #1
0
        private void DrawGame(Graphics graphics)
        {
            //graphics.Clear(Color.Black);

            playingArea   = new Rectangle(new Point(0, 0), form.Size);
            playingArea.X = playingArea.X + 10;
            playingArea.Y = playingArea.Y + 10;

            playingArea.Width  -= 30;
            playingArea.Height -= 50;

            graphics.DrawRectangle(new Pen(Brushes.White), playingArea.X, playingArea.Y, playingArea.Width, playingArea.Height);


            for (int i = 0; i < gameLogicToDraw.SizeY; i++)
            {
                for (int j = 0; j < gameLogicToDraw.SizeX; j++)
                {
                    float centerPointX = playingArea.X + GetCenterPoint(j, i).X;
                    float centerPointY = playingArea.Y + GetCenterPoint(j, i).Y;

                    int tileX = ConvertScreenToTileCoordsX(j);
                    int tileY = ConvertScreenToTileCoordsY(i);

                    Tile thisTile = gameLogicToDraw.Tiles[tileX, tileY];

                    for (int k = 0; k < 6; k++)
                    {
                        System.Drawing.Drawing2D.Matrix m = new System.Drawing.Drawing2D.Matrix();
                        PointF p1 = Hexagon[k];
                        PointF p2 = Hexagon[(k + 1) % 6];
                        m.Translate(centerPointX, centerPointY);
                        m.Scale(hexRadiusX, hexRadiusY);
                        p1 = m.TransformPoint(p1);
                        p2 = m.TransformPoint(p2);

                        int penWidth = 4;

                        Pen pen1;

                        Tuple <int, int> neighbouringTile = gameLogicToDraw.GetNeighbouringTile(Tuple.Create(tileX, tileY), (HexDirections)k, true);
                        Faction          thisFaction      = gameLogicToDraw.GetTile(Tuple.Create(tileX, tileY)).OccupiedByFaction;

                        if (thisFaction == Faction.Empty)
                        {
                            if (gameLogicToDraw.GetTile(gameLogicToDraw.GetNeighbouringTile(Tuple.Create(tileX, tileY), (HexDirections)k)).OccupiedByFaction == Faction.Empty)
                            {
                                pen1 = new Pen(Color.Gray, penWidth);
                                graphics.DrawLine(pen1, p1, p2);
                            }
                        }
                        else
                        {
                            if (gameLogicToDraw.IsOutOfBounds(neighbouringTile))
                            {
                                pen1 = new Pen(FactionColors[thisFaction.ID], penWidth);
                                graphics.DrawLine(pen1, p1, p2);
                            }
                            else
                            {
                                Faction neighbourFaction = gameLogicToDraw.GetTile(neighbouringTile).OccupiedByFaction;
                                if (neighbourFaction == Faction.Empty)
                                {
                                    //if (k == (int)(HexDirections.Up))

                                    pen1 = new Pen(FactionColors[thisFaction.ID], penWidth);
                                    graphics.DrawLine(pen1, p1, p2);
                                }
                                else if (neighbourFaction == thisFaction)
                                {
                                    continue;
                                }
                                else
                                {
                                    pen1 = new Pen(FactionColors[thisFaction.ID], penWidth);
                                    Pen pen2 = new Pen(FactionColors[neighbourFaction.ID], penWidth);
                                    graphics.DrawLineTwoColour(pen1, pen2, p1, p2, 5);
                                }
                            }
                        }
                    }

                    string tileString = "X";
                    Pen    stringPen  = new Pen(Color.Red);
                    Pen    fillPen    = new Pen(Color.ForestGreen);
                    switch (thisTile.Type)
                    {
                    case TerrainTypes.Land:
                        tileString      = " ";
                        stringPen.Brush = Brushes.SandyBrown;
                        break;

                    case TerrainTypes.Water:
                        tileString      = " ";
                        stringPen.Brush = Brushes.Aqua;
                        fillPen.Color   = Color.DeepSkyBlue;
                        break;

                    case TerrainTypes.City:
                        tileString      = "c";
                        stringPen.Brush = Brushes.LightGray;
                        //fillPen.Color=Color.SandyBrown;
                        break;

                    case TerrainTypes.Harbor:
                        tileString      = "H";
                        stringPen.Brush = Brushes.Yellow;
                        break;

                    case TerrainTypes.Capital:
                        tileString      = "C";
                        stringPen.Brush = Brushes.DarkGray;
                        break;

                    default:
                        tileString = "X";
                        break;
                    }

                    RectangleF rect = new RectangleF(centerPointX - hexRadiusX * 0.8f, centerPointY - hexRadiusY * 0.8f, hexRadiusX * 1.6f, hexRadiusY * 1.6f);
                    graphics.FillEllipse(fillPen.Brush, rect);

                    graphics.DrawString(tileString,
                                        new Font(FontFamily.GenericSansSerif, 25), stringPen.Brush, new PointF(centerPointX - 15, centerPointY - 18));


                    graphics.DrawString(tileX.ToString() + ", " + tileY.ToString() + ";" + gameLogicToDraw.GetTile(Tuple.Create(tileX, tileY)).OccupiedByFaction.ID.ToString(),
                                        new Font(FontFamily.GenericMonospace, 7), Brushes.White, new PointF(centerPointX - 20, centerPointY - 7));
                }
            }

            /*GraphicsPath path = new GraphicsPath();
             * GraphicsPath path2 = new GraphicsPath();
             * //Point[] points = new Point[] { new Point(0, 50), new Point(25, 100), new Point(75, 100), new Point(100, 50), new Point(75, 0), new Point(25, 0) };
             *
             * Point point1 = new Point(-50, 50);
             * point1 = m.TransformPoint(point1);
             *
             * Point point2 = new Point(50, -50);
             * point2 = m.TransformPoint(point2);
             *
             * graphics.DrawLineTwoColour(pen1, pen2, point1, point2, 14);*/

            //path.CloseFigure();
        }
	public RectangleF[] GetRegionScans(Matrix matrix)
	{
		//HACK: this is temporary and will not work on transforms with shear.
		RectangleF[] newRects = new RectangleF[rects.Length];
		for(int i = 0; i < newRects.Length; i++)
		{
			RectangleF r = rects[i];
			float ox, oy, or, ob;
			matrix.TransformPoint(r.X, r.Y, out ox, out oy);
			matrix.TransformPoint(r.Right, r.Bottom, out or, out ob);
			newRects[i] = RectangleF.FromLTRB(ox, oy, or, ob);
		}
		return newRects;
	}