Название для этого сообщения было довольно сложно думать, поэтому, если вы можете придумать более описательный заголовок, пожалуйста, скажите мне. Во всяком случае, моя проблема довольно специфична и требует некоторых простых математических знаний. Я пишу приложение С# WinForms, которое немного похоже на старое приложение xeyes Linux. В основном это набор глаз, которые следуют вокруг вашего курсора мыши. Сначала это может показаться легким, однако может стать довольно сложным, если вы такой перфекционист, как я: P. Это мой код до сих пор (только метод paint, который вызывается с интервалом 16).
int lx = 35;
int ly = 50;
int rx;
int ry;
int wx = Location.X + Width / 2;
int wy = Location.Y + Height / 2;
Rectangle bounds = Screen.FromControl(this).Bounds;
// Calculate X
float tempX = (mx - wx) / (float)(bounds.Width / 2);
// Calculate Y
float tempY = (my - wy) / (float)(bounds.Height / 2);
// Draw eyes
e.Graphics.FillEllipse(Brushes.LightGray, 10, 10, 70, 100);
e.Graphics.FillEllipse(Brushes.LightGray, 90, 10, 70, 100);
// Draw pupils (this only draws the left one)
e.Graphics.FillEllipse(Brushes.Black, lx += (int)(25 * tempX), ly += (int)(40 * tempY), 20, 20);
Теперь это работает на базовом уровне, однако иногда это может произойти, если пользователь помещает курсор в 0,0.
Теперь мой вопрос: как это исправить? Что бы оператор IF был проверить, где находится указатель мыши, а затем уменьшить зрачок X в зависимости от этого?
Спасибо.
Изменить: Здесь я получаю позиции мыши (my
и mx
):
private void timer_Tick(object sender, EventArgs e)
{
mx = Cursor.Position.X;
my = Cursor.Position.Y;
Invalidate();
}
Таймер запускается в событии eyes_Load, а интервал - 16.
Изменить 2: Окончательное решение: http://pastebin.com/fT5HfiQR