Я довольно новичок в использовании C #, и я создаю приложения, используя Gtk в MonoDevelop. Я могу делать простые статические рисунки, но я не могу создать цикл рисования нескольких объектов.
В настоящее время у меня установлен интервал с использованием System.Timers для рисования каждые шестидесятые секунды. Это используется, чтобы просто переместить прямоугольник и отразить его от краев. Тем не менее, кажется, что ничего не рисуется после вызова Application.Run()
.
Основной метод:
public static void Main()
{
Application.Init();
Window w = new Window("Drawing");
w.SetDefaultSize(width, height);
canvas = new DrawingArea();
canvas.ExposeEvent += ExposeHandler;
canvas.SizeAllocated += SizeAllocatedHandler;
SetupPensBrushes();
Box box = new HBox(true, 0)
{
canvas
};
w.Add(box);
w.ShowAll();
w.DeleteEvent += Quit;
Application.Run();
}
Интервал и рисунок:
public static void ExposeHandler(object obj, ExposeEventArgs args)
{
ev = args.Event;
window = ev.Window;
ctx = Gtk.DotNet.Graphics.FromDrawable(window);
FillRect(new SolidBrush(Color.Black), 0, 0, width, height); // (Custom function for a rectangle) This works and creates a black background
interval.Interval = 1000 / 30;
interval.Elapsed += ElapsedEvt;
interval.Start(); // 'ElapsedEvt' includes moving and drawing an object, but it cannot be seen on the screen.
}
public class Obj
{
public int x;
public int y;
public int w;
public int h;
public int xv = rnd.Next(-width / 50, width / 50);
public int yv = rnd.Next(-height / 50, height / 50);
public Obj(int x, int y, int w, int h)
{
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
public void Move()
{
x += xv;
y += yv;
}
public void Show()
{
FillRect(Brushes["LightBlue"], x, y, w, h);
}
}
public static void ElapsedEvt(object sender, ElapsedEventArgs e)
{
boxObj.Move();
boxObj.Show();
// boxObj has been defined already as a new Obj()
}
РЕДАКТИРОВАТЬ: проблема была решена с помощью canvas.QueueDraw()
каждый раз, когда интервал истек. Тем не менее, даже после того, как все утилизировано, примерно через 10 секунд работы программы наблюдается значительное отставание.