using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Caisses { public class GraphicalClient : Client { const int MAX_CLIENT_SPEED = 5; const int MIN_CLIENT_SPEED = -5; private PointF _speed; private PointF _position; private Color _color; private Size _size; private Rectangle _area; public PointF Speed { get => _speed; set => _speed = value; } public PointF Position { get => _position; set => _position = value; } public Color Color { get => _color; set => _color = value; } public Size Size { get => _size; set => _size = value; } public Rectangle Area { get => _area; set => _area = value; } public GraphicalClient(Point Entrance,Random random):base(random) { Random = random; Position = Entrance; //Position = new Point(Random.Next(0, 100), Random.Next(0, 100)); Speed = new PointF(NextFloat(MIN_CLIENT_SPEED, MAX_CLIENT_SPEED), NextFloat(MIN_CLIENT_SPEED, MAX_CLIENT_SPEED)); Color = Color.FromArgb(ShoppingTime * 2, 0, 0); int clientWidth = Random.Next(20, 30); Size = new Size(clientWidth, clientWidth); } static float NextFloat(float min, float max) { double val = (Random.NextDouble() * (max - min) + min); return (float)val; } public void Update(Size area) { //base.Tick(); Position = checkBounds(Position,area); Color = Color.FromArgb(ShoppingTime * 2, 0, 0); } public void Draw(Bitmap storeImage) { Update(storeImage.Size); Graphics g = Graphics.FromImage(storeImage); switch (State) { case ClientState.Shopping: g.FillEllipse(new SolidBrush(Color), new RectangleF(Position, Size)); g.DrawString(ShoppingTime.ToString(), new Font("Arial", 16), new SolidBrush(Color.White),new PointF(Position.X,Position.Y)); break; case ClientState.Waiting: g.FillEllipse(new SolidBrush(Color.Red), new RectangleF(Position, Size)); g.DrawString(WaitingTime.ToString(), new Font("Arial", 16), new SolidBrush(Color.White), new PointF(Position.X, Position.Y)); break; case ClientState.Inline: //g.FillEllipse(new SolidBrush(Color.Violet), new RectangleF(Position, Size)); break; case ClientState.Checkout: //g.FillEllipse(new SolidBrush(Color.Green), new RectangleF(Position, Size)); //g.DrawString(CheckoutTime.ToString(), new Font("Arial", 16), new SolidBrush(Color.Black), new PointF(Position.X, Position.Y)); break; default: break; } } public PointF checkBounds(PointF position, Size area) { PointF newPosition = new PointF(position.X,position.Y); /* if (position.X < 0) { newPosition.X = 0; Speed = new Point(Speed.X * -1, Speed.Y); } if (position.X > area.Width) { newPosition.X = area.Width; Speed = new Point(Speed.X * -1, Speed.Y); } if (position.Y < 0) { newPosition.Y = 0; Speed = new Point(Speed.X, Speed.Y * -1); } if (position.Y > area.Height) { newPosition.Y = area.Height; Speed = new Point(Speed.X, Speed.Y * -1); }*/ if (position.X + Speed.X > 0 && position.X + Size.Width + Speed.X < area.Width) { newPosition.X = position.X + Speed.X; } else { float diff = Math.Abs(position.X + Speed.X); newPosition.X = diff; //newPosition = new Point(0, position.Y); Speed = new PointF(Speed.X * -1,Speed.Y); //speed.X += -1; } if (position.Y + Speed.Y > 0 && position.Y + Size.Height + Speed.Y < area.Height) { newPosition.Y = position.Y + Speed.Y; } else { float diff = Math.Abs(position.Y + Speed.Y); newPosition.Y = diff; //newPosition = new Point(position.X, 0); Speed = new PointF(Speed.X,Speed.Y * -1); //speed.Y *= -1; } return newPosition; } } }