Доброго времени суток.
Ищу небольшую помощь в реализации функции определение количества ХП перса/моба в мморпг игре по пикселям...для создания бота .
Чтение из памяти процесса отсекается так как в игре стоит античит обойти который мне будет сложнее.
на данный момент уже имеется функция определения цвета пикселя по заданным координатам X,Y...
Я же ищу помощи и идей каким образом возможно реализовать чтение количества определённого цвета в области (Rectangle) большей чем Х У....
так как хотелось бы выводить количество ХП на ProgressBar моей формы .
Заранее спасибо.
________________
Are you hackers ? ......No wee are Russians!
Пример изображения?
Если обычная ПЗ (полоса здоровья), то можно из любой точки на ПЗ начать отсчёт, в обе стороны по оси X двигаться до концов ПЗ и запомнить длину. Потом то же самое, но уже до конца рамок ПЗ. И разделить первое на второе
Ну так на одном уровне по Y цвет одинаков. Даже если не уверены, то можно сделать некоторые проверки. К примеру, вашей же функцией исследовать некоторые области и посмотреть, в какие интервалы по RGB входят цвета этой области. И дальше уже проверять цвета в промежутках
Например цвет пикселя, принадлежащего ПЗ, должен удовлетворять r1 <= r <= r2, g1 <= g <= g2 и b1 <= b <= b2, рамки ПЗ своим границам, полоса без здоровья (недостающее здоровье) своим границам
Античит блочит чтение памяти?
Это какое-то извращение на мой взгляд, вы уверены что открытие handle чисто для чтения (VM_READ only) не даёт результатов?
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
Античит блочит чтение памяти?
Это какое-то извращение на мой взгляд, вы уверены что открытие handle чисто для чтения (VM_READ only) не даёт результатов?
прошу заметить что в начале темы я пояснил что определение ХП по пикселям будет проще реализовать так как обойти античит мне буде сложнее ...в данной игре античит возможно и не блочит чтение НО мониторит такие действия ...что повлечёт за собой бан аккаунтов. к тому же
если было бы возможно чтение из памяти данного процесса без побочных результатов ....уж поверьте я бы не просил помощи тут в этой теме так как мне ближе чтение из памяти чем ковыряние пикселей.
________________
Are you hackers ? ......No wee are Russians!
[Ссылки могут видеть только зарегистрированные пользователи. ]
Вот кароче, x,y области отрисовки это ширина и высота клиента без border-ов, тоесть только область отрисовки.
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
примерно понял суть ...
ХП полоска ...плавающая ...тоесть координаты X1,Y1 каждый раз после перезапуска клиента меняются ...X2,Y2 в зависимости от моба также могут быть разными ...у некоторых мобов она длиннее на несколько пикселей.
На данный момент тестирую метод поиска полоски ХП и перетаскивание её в нужное место ...в заданные тоесть рабочие координаты.
По рисунку вышепреведённому получается что нужно начать сканирование каждого пикселля начиная с Х1 и У1 до конца полоски определяя все ли пиксели красного цвета ...
подскажите примерно как будет выглядеть алгоритм такого сканирования если для поиска цвета пикселя я использую стандартную функцию поиска цвета по заданным координатам
Код:
public Color GetColorAt(int x, int y)
{
IntPtr desk = GetDesktopWindow();
IntPtr dc = GetWindowDC(desk);
int a = (int)GetPixel(dc, x, y);
ReleaseDC(desk, dc);
return Color.FromArgb(255, (a >> 0) & 0xff, (a >> 8) & 0xff, (a >> 16) & 0xff);
}
________________
Are you hackers ? ......No wee are Russians!
Можно таким путем
Добавьте функцию, которая будет ловить относительные координаты клика мыши в окне
В игре кликнули на любое место полосы здоровья и всё. Начинайте отсчёт в обе стороны по оси X и запоминайте первый "некрасный" пиксель слева. Это будет граница. Если там "хорошая" рамка для ПЗ, то возможно с обеих сторон будет одинаковый цвет пикселя на границе. При неполном здоровье также запоминается новый цвет справа, но если не совпадает с граничным (который нашли слева), то запомнить это место и продолжать до границы.
И уже по этим трём точкам делать выводы о здоровье
Спасибо ...попробую ...
Обязательно отпишусь . Дам знать что вышло .
Добавлено через 14 часов 43 минуты
Доброго времени суток..
обещал отписаться что выходит ...
Решил попробовать по последнему совету и прикрутил тестовую функцию
по такой схеме - клик в начало ПЗ полоски...по клику определяется цвет самой полоски ПЗ(красный) далее начинается цикл Т.Е. определение цвета каждого пикселя начиная с Х1 заканчивая Х2
Код:
int count = 1;
int f =Saved_X1;//Зарегестрированные заранее координаты начала ПЗ
while (Saved_X1 != Saved_X2)//Saved_X2 конец полоски ПЗ
{
var c_1 = GetColorAt(Saved_X1);
f++;
if (c_1 == c) // c = Цвет полоски ПЗ взятый по первому клику по ней.
{
count++; // подсчёт красных пикселей
}
richTextBox1.AppendText(count.ToString());
}
Но тут появиилась небольшая загвоздка .....функия работает ...и сканирует каждый пиксель и подсчитывает количество красных....из чего можно подсчитать колличество здоровья НО
сканирование полоски которое на экране составляет 4-5 см почемуто занимает около 25-30 секунд ..........
Буду рад увидеть критику и советы ...заранее спасибо .
________________
Are you hackers ? ......No wee are Russians!
Последний раз редактировалось iMockBa; 26.07.2015 в 15:04.
Причина: Добавлено сообщение
Проблема по всей видимости заключается в оптимизации, либо ты каждый пиксель проверяешь на новом bitmap-е экрана либо у тебя какая-то ну очень сложная функция получения цвета пикселя
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
public Color GetColorAt(int x, int y) { IntPtr desk = GetDesktopWindow(); IntPtr dc = GetWindowDC(desk); int a = (int)GetPixel(dc, x, y); ReleaseDC(desk, dc); return Color.FromArgb(255, (a >> 0) & 0xff, (a >> 8) & 0xff, (a >> 16) & 0xff); }
не надо для каждого пикселя получать новый DC, но все равно большая часть проблемы, как мне кажется, заключается в GetPixel - очень медленный метод, рекомендую к прочтению:
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]