Есть флеш игра типа "Guitar Hero" (Мастер гитары в контакте). Решил ради интереса написать программу, которая могла бы проходить хотя бы простенькие уровни.
Алгоритм программы следующий :
1) Получаю части экрана 10 х 10 пикселей в bmp на всех дорожках перед самым концом грифа.
2) С помощью getPixel(5,5) проверяю в какой диапазон входит цвет.
3) В зависимости от цвета вызываю sendKeys.Send() с нужной клавишей (A,S,D,J,K,L).
Столкнулся со следующей проблемой:
функция sendKeys.Send() успевает сработать несколько раз ( иногда доходит до десятка ), но при этом очень много нот на дорожках пропускается.
Почему ноты нажимаются не всегда ? Насколько это эффективный подход и какой подход был бы лучше ?
Собственно код (пока для одной дорожки):
private void label6_Click(object sender, EventArgs e)
{
main();
}
private void analys_map(Bitmap map)
{
var pixel = map.GetPixel(5, 5);//Синий J
//Входит ли в нужный цветовой диапазон
if (pixel.R > 20 && pixel.R < 25 &&
pixel.G > 55 && pixel.G < 65 &&
pixel.B > 135 && pixel.B < 145)
{
label4.Text = (Convert.ToInt32(label4.Text) + 1).ToString();//Количество нот, которые обнаружил
SendKeys.SendWait("j");
}
}
private void main()
{
int h = 40;
while (true)
{
System.Threading.Thread.Sleep(30);//Задержка немного улучшила положение вещей.
Application.DoEvents();
int c = this.Location.Y + this.Size.Height;
int x = this.Location.X;
pictureBox4.Image = screen(x + pictureBox4.Location.X, c + h);//возвращает bitmap
analys_map(new Bitmap(pictureBox4.Image));
}
}