using System; using Cairo; using Gdk; using Gtk; class Area : DrawingArea { // # 3а Надання значень властивостям області малювання public int i=0, // стан гри il=0, // кількість очок на рахунку програми ir=0, // кількість очок на рахунку гравця w=780, // ширина вікна програми та ігрового поля h=500, // висота ігрового поля a=10, // ширини прямокутника — зображення ракетки b=100, // висота прямокутника — зображення ракетки, r=10, // радіус круга — зображення м'яча, d_=8, // приріст ординати ракетки на одне оновлення екрану (3), dx, // приріст поточної величини абсциси круга за 1 такт оновлення екрану dy, // приріст поточної величини ординати круга за 1 такт оновлення екрану dx_=9, // модуль приросту абсциси круга за 1 такт оновлення екрану dy_=7, // верхня межа приросту ординати круга за 1 такт оновлення екрану x =390,// поточна абсциса центра зображення м'яча y =250,// поточна ордината центра зображення м'яча yl=200,// ордината верхнього краю прямокутника-ракетки ліворуч, керованого програмою yr=200;// ордината верхнього краю прямокутника-ракетки праворуч, керованого людиною public bool up = false, // потрібно рухати жовтий прямокутник догори down = false, // потрібно рухати жовтий прямокутник донизу timer = true; // # 3a Кінець protected override bool OnDrawn(Context cr) // малювання { cr.SetSourceRGB(0, 0.5, 0); // Темно-зелений колір cr.Paint(); return true; } } class OwnWindow : Gtk.Window // клас вікна застосунку { public Area da; public OwnWindow() : base("Гра «Пінг-Понг»") { // # 3b Зміна розміру вікна програми da = new Area(); Resize(da.w, da.h); GLib.Timeout.Add(50, new GLib.TimeoutHandler(OnTimer)); // Кожні 20 мс виклик методу OnTimer. // # 3b Кінець DeleteEvent += delegate { Application.Quit(); }; Add(da); } protected override bool OnDeleteEvent(Event e) { Application.Quit(); return true;} bool OnTimer() { if (!da.timer) return false; da.QueueDraw(); return true; } } class Example { static void Main() { Application.Init(); OwnWindow w = new OwnWindow(); w.ShowAll(); Application.Run(); } }