using System; using System.Drawing; using Cairo; using Gdk; using Gtk; class Area : DrawingArea { private static int igame = 0, // стан гри idir = 0, // напрям руху xb = 0, // найбільше досягнуте значення абсциси jb = 0, // номер точки траєкторії з найбільшим // досягнутим значенням абсциси jt = 0, // поточний номер точки траєкторії при поверненні // у точку "відриву" за найменшу кількість кроків s = 2, // крок переміщення круга по горизонталі чи вертикалі ntr=0, // кількість запам'ятованих точок траєкторії j0,j1,k0,k1;// межі значень екранних координат аналізованих пікселів private int[,] tr = new int[10000,2];//траєкторія центрів круга private bool incjt = true; // зростання поточного номера точки траєкторії // при поверненні у "точку відриву від перешкоди" // за найменшу кількість кроків // can[j] - чи можна рухатися у напрямку j private bool[] can = new bool [4] { true, true, true, true }; public int r = 8, // радіус рухомого круга xmax, // розміри поля по горизонталі ymax, // розміри поля по вертикалі x, // поточна абсциса центра круга y; // поточна ордината центра круга public ImageSurface surface;// поверхня для відображення public Bitmap bm; // зображення в оперативній пам'яті public bool timer = true; // чи потрібна перемальовувати? protected override bool OnDrawn(Context cr) // малювання { cr.SetSourceSurface(surface, 0, 0); cr.Paint(); cr.SetSourceColor(new Cairo.Color(1, 1, 1, 1)); cr.Arc(x, y, r, 0, 2 * Math.PI); cr.Fill(); return true; } // # 4 Визначення координат центра круга й // відображення нового його розташування public void Move() { x += s; // Прямоліний рівномірний рух праворуч timer = x < xmax; } // # 4 Кінець } class OwnWindow : Gtk.Window { public Area a; public OwnWindow(string s) : base("Оминання перешкод") { a = new Area(); try { a.surface = new ImageSurface(s); } catch { Console.WriteLine("Файлу зображення не знайдено"); Environment.Exit(1); } a.bm = new Bitmap(s); // Зчитування з файлу s Resize(a.surface.Width, a.surface.Height); a.xmax = a.surface.Width; // розміри поля по горизонталі a.ymax = a.surface.Height;// розміри поля по вертикалі a.x = a.r; // поточна абсциса центра круга a.y = a.ymax/2; // поточна ордината центра круга DeleteEvent += delegate { Application.Quit(); }; // # 5a Виклик методу OnTimer з допомогою таймеру GLib.Timeout.Add(20, new GLib.TimeoutHandler(OnTimer)); // Кожні 20 мс виклик методу OnTimer. // # 5a Кінець Add(a); ShowAll(); } protected override bool OnDeleteEvent(Event e) { Application.Quit(); return true; } // # 5b Метод для виклику таймером bool OnTimer() { if (!a.timer) return false; a.Move(); a.QueueDraw(); return true; } // # 5b Кінець } class Example { static void Main() { Application.Init(); OwnWindow w = new OwnWindow("field.png"); Application.Run(); } }