В прикладном окне ездят несколько машин, которые движутся по кольцевой дороге. Хочу задать движение одной машины только по большому кругу,второй машины только по малому. переменная great ответственна за движение по большому/малому кругу. Написал в классе Cars условие if-else,но фактически оно не выполняется,изменить направление движения автомобиля получается только в главном классе Car. Как возможно прописать,чтобы great менялся в классе Cars?Или еще как-нибудь? | Код | using System; using System.Text; using System.Windows.Forms; using System.Threading; using System.Drawing;
namespace KURSOVAYA {
delegate void delEv();
class Car //класс машины { public event delEv ev; int num; //номер машины int speed; //скорость машины int r; //радиус кольца string name; //имя машины int x, y; //текущая позиция машины bool great, //признак движения по большому кругу life; //жизнь потока Thread t1; //поток //public bool Great { get{ return this.great; } set { this.great = value; } }
public Car(int N, string Name, int X, int Y) { num = N; name = Name; speed = 2; x = X; y = Y; great = true; life = true; t1 = new Thread(new ThreadStart(Move)); t1.Start(); }
public int N { get { return num; } } public int X //свойство координаты X центра машины { get { return x; } } public int Y //свойство координаты Y центра машины { get { return y; } }
int counter; // время существования void Move() //движение { while (life) { counter++; if (great) OnCirclebigroad(); if (!great) OnCirclesmallroad(); if (ev != null) ev(); Thread.Sleep(100); } }
void OnCirclebigroad() //движение по большому кругу { r = 160; x = 170 + (int)Math.Round(r * Math.Cos(counter * 0.05 * speed)); y = 170 + (int)Math.Round(r * Math.Sin(counter * 0.05 * speed)); Console.WriteLine("X=" + x + "Y=" + y + "R=" + r); /*if (counter == 64) { great = false; counter = 0; }*/
}
void OnCirclesmallroad() //движение по малому кругу { r = 120; x = 170 + (int)Math.Round(r * Math.Cos(counter * 0.1 * -1 * speed)); y = 170 + (int)Math.Round(r * Math.Sin(counter * 0.1 * -1 * speed)); Console.WriteLine("X=" + x + "Y=" + y + "R=" + r); /*if (counter == 64) { great = true; counter = 0; }*/ }
public void Finish() { life = false; } }
class Cars : Form { public Car[] pCar; // Массив объектов-машин public int n; // кол-во машин public bool great;
/* public void HandlerEv() // Обработчик события ev { Console.WriteLine(" HandlerEv"); }*/
public Cars() { n = 2; pCar = new Car[n]; this.DoubleBuffered = true; for (int i = 0; i < n; i++) { if (i % 2 == 1) { //pCar[i].Great = true; great = true; pCar[i] = new Car(i, "Машина", 165, 330); pCar[i].ev += new delEv(HandlerEv); } else
{ //pCar[i].Great = false; great = false; pCar[i] = new Car(i, "Машина", 312, 96); pCar[i].ev += new delEv(HandlerEv); } } Text = "Cars"; //Start (); } /* public void Start() // Стартовать { for (int i = 0; i < n; i++) { pCar[i].Start(); } }*/
/* class Mainwindow : Form //класс главного окна { Car car1; //машина Cars pCar[i]; public Mainwindow() { this.Text = "Машины в дороге"; car1 = new Car(1, "Машина", 165, 330); car1.ev += new delEv(HandlerEv); //pCar[i] = new Car(2, "Машина", 312, 96); //pCar[i].ev += new delEv(HandlerEv); }*/
void HandlerEv() { Invalidate(); }
protected override void OnPaint(PaintEventArgs e) //рисование { e.Graphics.DrawEllipse(new Pen(Color.Black, 40), 20, 20, 320, 320); e.Graphics.DrawEllipse(new Pen(Color.Black, 40), 65, 65, 230, 230); for (int i = 0; i < n; i++) { //рисование машины e.Graphics.DrawRectangle(new Pen(Color.Red, 4), pCar[i].X, pCar[i].Y, 20, 20); //e.Graphics.DrawRectangle(new Pen(Color.Green, 4), pCar[i].X, pCar[i].Y, 20, 20); e.Graphics.DrawString(pCar[i].N.ToString(), Font, new SolidBrush(Color.Blue), pCar[i].X + 4, pCar[i].Y + 4); //e.Graphics.DrawRectangle(new Pen(Color.Blue, 4), pCar[i].X, pCar[i].Y, 20, 20); } } protected override void OnClosed(EventArgs e) //закрытие { //car1.Finish(); //pCar[i].Finish(); //for (int i = 0; i < cars.n; i++) // Завершить потоки //cars.pCar[i].Finish();
}
static void Main() //самая главная функция { Cars cars = new Cars(); Application.Run(cars); // Выполнить приложение for (int i = 0; i < cars.n; i++) // Завершить потоки cars.pCar[i].Finish();
} } }
|
|