If (dvig)
{ dx1 = (int)(19 * System::Math::Sin(fi)); dy1 = (int)(19 * System::Math::Cos(fi));
x += dx1; y += dy1;
} else { dx2 = (int)(28 * System::Math::Sin(fi)); dy2 = (int)(28 * System::Math::Cos(fi)); y -= dx2; x -= dy2;
}
fi += 0.1;
}
evSpecial();
} }
void Suspend() { if (run) { run = false;
} }
void Resume() { if (!run) { run = true;
} } };
ref class Avtos: public Form { private: ArrayList ^al; //ссылка на список машин int num;// = 0;//номер объекта машины Form ^f;// ссылка на дочернее окно управления Button ^add;// ссылки на кнопки bool run;// = true;//признак движения машин
public: Avtos() { num=0; al = gcnew ArrayList(); run = true; Size = Drawing::Size(770, 770); Text = "Шоссе";
f = gcnew Form(); f->Text = "Control"; f->Size = Drawing::Size(300, 150); f->Show();
add = gcnew Button(); add->Text = "Add"; add->Size = Drawing::Size(45, 30); add->Location = Point(5, 50); add->Click += gcnew EventHandler(this, &Avtos::ADD); f->Controls->Add(add);
}
public: void ADD(Object ^obj, EventArgs ^arg) { num++; Avto ^b; Random ^r = gcnew Random(); //Random rand = new Random(); if (num % 2 == 0) { Avto ^a = gcnew Avto(num, 385, 660, r->Next(50, 100)); System::Console::WriteLine("Добавлен автомобиль"+num); a->dvig = false; b = a; } else { Avto ^a = gcnew Avto(num, 195, 400, r->Next(50, 100)); System::Console::WriteLine("Добавлен автомобиль"+num); a->dvig = true; // a.ev += new Del(this.Handlerev); b = a; }
al->Add(b); IEnumerator ^inum = al->GetEnumerator(); while (inum->MoveNext()) { Avto ^q = (Avto^)inum->Current; q->evSpecial += gcnew delEv(this, &Avtos::HandlerEvSpecial); } }
public: void HandlerEvSpecial() { Invalidate(); }
protected: virtual void OnPaint(PaintEventArgs ^arg) override { arg->Graphics->FillEllipse(gcnew SolidBrush(Color::Gray), 100, 100, 604, 604);//внешнее кольцо arg->Graphics->FillEllipse(gcnew SolidBrush(Color::White), 173, 173, 454, 454);//разделительная полоса arg->Graphics->FillEllipse(gcnew SolidBrush(Color::Gray), 175, 175, 450, 450);//внутреннее кольцо arg->Graphics->FillEllipse(gcnew SolidBrush(Color::YellowGreen), 245, 245, 300, 300); this->BackColor = Color::YellowGreen; // Закрасить фон зеленым this->MaximizeBox = false; // Убрать кнопку "Развернуть окно" this->DoubleBuffered = true; // Включить буферизацию изображения IEnumerator ^inum = al->GetEnumerator(); while (inum->MoveNext()) { Avto ^a = (Avto^)inum->Current; arg->Graphics->FillEllipse(gcnew SolidBrush(Color::Red), a->X, a->Y, 25, 25);//машина arg->Graphics->DrawString(a->N.ToString(), gcnew Drawing::Font("Comic Sans MS", 10), gcnew SolidBrush(Color::White), a->X + 5, a->Y + 5);//номера машин
} } };
static void main() { Application::Run(gcnew Avtos()); } Результат:
Пример 5.3.3.3. Реализация третьего этапа разработки Avtos–приложения на языке Java.
import java.util.*; import java.awt.*; import java.awt.event.*; import java.io.*;
public class Avto extends Observable implements Runnable { public int num; public int x, y; public double fi = 0.1; public int dx1, dy1, dx2, dy2; Thread thr; public boolean dvig = true, run = true; boolean life; public int speed;
public int N() { return num; } public int X() { return x; } public int Y() { return y; }
public Avto(int N, int X, int Y, int Speed) { num = N; x = X; y = Y; speed = Speed; life = true; thr = new Thread(this); thr.start();
}
public void report() { setChanged(); notifyObservers(); }
public void Finish() { Resume(); life = false; }
public void run() { while (life) { if (run) {
try { Thread.sleep(speed); } catch (InterruptedException e) { }
if (dvig) { x += dx1; y += dy1;
dx1 = (int)(19 * Math.sin(fi)); dy1 = (int)(19 * Math.cos(fi)); } else { y -= dx2; x -= dy2; dx2 = (int)(28 * Math.sin(fi)); dy2 = (int)(28 * Math.cos(fi));
}
fi += 0.1; report(); }
} }
public void Suspend() { if (run) { run = false;
} } public void Resume() { if (!run) { run = true; } } }
public class Autos extends Frame implements Observer, ActionListener, ItemListener { public ArrayList al; private boolean run; private Frame f; private Button add; private int num = 0; private Random r;
public Autos() { al = new ArrayList(); r = new Random(); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent wE) { for (int n = 0; n < al.size(); n++) { Avto a = (Avto)al.get(n); a.Suspend(); } System.exit(0); } });
setTitle("Шоссе"); setLocation(new Point(600, 0)); setBackground(Color.green); run = true; f = new Frame(); f.setSize(300, 100); f.setTitle("Control"); f.setLocation(new Point(150,150)); f.setLayout(new FlowLayout());
add = new Button("Add"); add.setActionCommand("ADD"); add.addActionListener(this); f.add(add); f.setVisible(true);
} //обработать уведомдение public void update(Observable obj, Object arg) { repaint(); } //перерисовать окно public void paint(Graphics g) {
g.setColor(Color.gray); g.fillOval(100, 100, 604, 604); g.fillOval(175, 175, 450, 450); g.setColor(Color.white); g.fillOval(173, 173, 454, 454); g.setColor(Color.gray); g.fillOval(175, 175, 450, 450); g.fillOval(175, 175, 450, 450); g.setColor(Color.green); g.fillOval(245, 245, 300, 300); for (int i = 0; i < al.size(); i++) { g.setColor(Color.red); Avto a = (Avto)al.get(i); g.fillOval(a.X(), a.Y(), 25, 25); g.setColor(Color.white); g.drawString(Integer.toString(a.num), a.X() + 5, a.Y() + 15);
}
} //выполнить команды для нажатия кнопок public void actionPerformed(ActionEvent aE) { String str = aE.getActionCommand(); if (str.equals("ADD")) { num++; Avto b; r = new Random(); if (num % 2 == 0)
{ Avto a = new Avto(num, 385, 666, r.nextInt(100)+50); System.out.println("Dobavlen avto " + num); a.dvig = false; b = a; } else { Avto a = new Avto(num, 195, 400, r.nextInt(100)+50); System.out.println("Dobavlen avto " + num); a.dvig = true; b = a; } b.addObserver(this); al.add(b);
} repaint(); }
public void itemStateChanged(ItemEvent e) { repaint(); }
public static void main(String[] args) { Autos auto = new Autos();
|