class Shar : ISaveLoad
{
//номер, скорость,, координаты шара, радиус шара
private int _number,_speed, _x, _y, _vector,_radS;
//поле, хранящие цвет шара
private Color _color;
//положение шара
private double a;
//поле, хранящие информацию о формате текста
private static StringFormat _strF;
//поле, храняшие параметры шрифта
private static Font _f;
//ссылка на область отображения
private Traekt _Space;
//статический конструктор, инициализирующий
//статические поля
static Shar()
{
_strF = new StringFormat();
_strF.Alignment = StringAlignment.Center;
_f = new Font("Arial", 10);
}
//конструктор, применяемый при чтении из файла
public Shar(Traekt NewSpace)
{
_Space = NewSpace;
_x = -1;
_y = -1;
}
//свойство цвета шара, для доступа из вне
public Color colball
{
get { return _color; }
set { _color = value; }
}
//свойство радиуса шара, для доступа из вне
public int radS
{
get { return _radS; }
set { _radS = value; }
}
//свойство номера шара, для доступа из вне
public int num
{
get { return _number; }
}
//свойство скорости шара, для доступа из вне
public int speed
{
get { return _speed; }
set { _speed = value; }
}
//свойство направления шара, для доступа из вне
public int v
{
get { return _vector; }
set { _vector = value; }
}
//основной конструктор шара
public Shar(Traekt newSpace, int NNumber, int uSpeed, int uVector,int uradS)
{
_Space = newSpace;
_vector = uVector;
_speed = uSpeed;
_radS = uradS;
_number = NNumber;
a = 90 * (Math.PI / 180);
Show();
}
//метод отрисовки шара
public void Show()
{
Graphics gr = Graphics.FromImage(_Space.S_picture.Image);
SolidBrush sBrush=new SolidBrush(_color);
Pen sPen = new Pen(Color.Black);
_f = new Font("Arial", 8);
{
/* //рисование траэктории
gr.DrawEllipse(sPen, _Space.S_x - _radiusOr,
_Space.S_y - _radiusOr,
_radiusOr * 2,
_radiusOr * 2);*/
}
//рисование шара
sBrush.Color = colball;
gr.FillEllipse(sBrush, _x, _y, radS * 2, radS * 2);
gr.DrawEllipse(sPen, _x, _y, radS * 2, radS * 2);
sBrush.Color = Color.White;
gr.DrawString(_number.ToString(), _f, sBrush, _x+radS , _y+radS/2 );
_Space.S_picture.Refresh();
sBrush.Dispose();
sPen.Dispose();
}
//метод стирания шара
public void Hide()
{
Graphics gr=Graphics.FromImage(_Space.S_picture.Image);
Pen sPen = new Pen(Color.White, 1);
SolidBrush sBr = new SolidBrush(Color.White);
//стирание траэктории
/* {
gr.DrawEllipse(sPen, _Space.S_x - Convert.ToInt32(_radiusOr) - 1,
_Space.S_y - Convert.ToInt32(_radiusOr) - 1,
Convert.ToInt32(_radiusOr) * 2 + 2,
Convert.ToInt32(_radiusOr) * 2 + 2);
}*/
//удаление самого шара
gr.FillEllipse(sBr, _x - 1, _y - 1, (radS * 2) + 2, (radS * 2) + 2);
sPen.Dispose();
sBr.Dispose();
}
//метод движения шара
public void Move()
{
Hide();
int _radiusOr = _Space.S_picture.Height / 4;
a = a + (speed * _vector*Math.PI/180);
{
_x = (int)Convert.ToInt32(_Space.S_x + _radiusOr * Math.Cos(a) - radS);
_y = (int)Convert.ToInt32(_Space.S_y + _radiusOr * Math.Sin(a) - radS);
}
Show();
}
//метод получения номера шара
public override string ToString()
{
return "Шар "+_number+";";
}
//запись
//в текстовый файл в начале предыдущий шарик, затем количество, а дальше весь список
public void Save(StreamWriter sw)
{
sw.WriteLine(_number);
sw.WriteLine(_speed);
sw.WriteLine(_x);
sw.WriteLine(_y);
sw.WriteLine(_vector);
sw.WriteLine(_radS);
sw.WriteLine(a);
}
//запись
//в двоичный файл
public void Save(BinaryWriter bw)
{
bw.Write(_number);
bw.Write(_speed);
bw.Write(_x);
bw.Write(_y);
bw.Write(_vector);
bw.Write(_radS);
bw.Write(a);
}
//чтение
//из текстового файла
public void Load(StreamReader sr)
{
Hide();
_number = Convert.ToInt32(sr.ReadLine());
_speed = Convert.ToInt32(sr.ReadLine());
_x= Convert.ToInt32(sr.ReadLine());
_y = Convert.ToInt32(sr.ReadLine());
_vector = Convert.ToInt32(sr.ReadLine());
_radS = Convert.ToInt32(sr.ReadLine());
a = Convert.ToDouble(sr.ReadLine());
Show();
}
//чтение
//из двоичного файла
public void Load(BinaryReader br)
{
Hide();
_number = br.ReadInt32();
_speed = br.ReadInt32();
_x = br.ReadInt32();
_y = br.ReadInt32();
_vector = br.ReadInt32();
_radS = br.ReadInt32();
a = br.ReadDouble();
Show();
}
public Boolean Collapse(Shar ball) // Метод проверки на пересечение
{
if (Math.Sqrt(Math.Pow(_x - ball._x + radS - ball.radS, 2) + Math.Pow(_y - ball._y + radS - ball.radS, 2)) < (ball._radS + _radS))
return true;
else
return false;
}
}
}