inre25 |
Отправлено: 06 Января, 2020 - 13:28:56
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Май 2019
Репутация: 0
|
Создаю бота для стрельбы по цели. Необходимо перемещение курсора в заданные координаты по оси Х. координаты Y константа.
Работа бота в оконном режиме (sx_KIB sy_KIB) координаты окна и области поиска все есть.
По изображению есть координата цели по оси х. в коде x_цель.
Не понимаю как это прописать в коде
Требуется чтобы, чем больше расстояние до цели по оси х от центра( в моем случае центр это 574 +-24 пикселя и постепенно увеличивается либо уменьшается) тем менее был разбег смещения мыши. То есть если x_цель находится в диапазоне от 550 до 598 то выполняется этот код mousemove(sx_KIB+ex1+x_цель, sy_KIB+400);
Я пишу:
if (x_цель=[550][594])
{
mousemove(sx_KIB+ex1+x_цель, sy_KIB+400);
}
Но походу что-то не правильно, только что?
Далее мне необходимо чем дальше будет разбег от центра тем меньше смещение, то есть если x_цель находится в диапазоне от 526 до 549 или от 595 до 619 то
mousemove(sx_KIB+ex1+x_цель+12, sy_KIB+400)); или mousemove(sx_KIB+ex1+x_цель-12, sy_KIB+400));
пишу:
else
{
if (x_цель=[526][549])
mousemove(sx_KIB+ex1+x_цель+12, sy_KIB+400));
}
else
{
if (x_цель=[595][619])
mousemove(sx_KIB+ex1+x_цель-12, sy_KIB+400));
}
и так пока не дойду по уменьшению до 20, а по увеличению до 1128, но чем выше разбег тем сильнее сглаживание, то есть если if (x_цель=[502][525]) . то
mousemove(sx_KIB+ex1+x_цель+24, sy_KIB+400));
3-й разбег смещаем на x_цель+-24, 4-й разбег смещаем на x_цель+-36, 5-й разбег смещаем на x_цель+-48 и т.д
Надеюсь логика понятна. Осталось понять как это сделать..... |
|
|
Zireael |
Отправлено: 06 Января, 2020 - 15:56:20
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: 574 +-24 пикселя
от 595 до 619
Тогда уж от 598 до 622.
Цитата: if (x_цель=[550][594])
CODE:if (x_цель >= 550 && x_цель <= 594) // если x_цель больше или равно 550 и x_цель меньше или равно 594
Цитата: 3-й разбег смещаем на x_цель+-24, 4-й разбег смещаем на x_цель+-36, 5-й разбег смещаем на x_цель+-48 и т.д
Смещение с фиксированным шагом, можно не заморачиваться с нагромождением if/else.
CODE:int x_цель = 530;
int delta_x = func(x_цель); // вызов функции, вернёт на сколько нужно сместить
messagebox(delta_x);
// mousemove(sx_KIB+ex1+x_цель + delta_x, sy_KIB+400));
function func(int x)
{
if(x==574)return 0;
int delta;
if(x < 574)delta=ceil((574 - x_цель) / 24 - 1.000001) * 12;
else delta=ceil((574 - x_цель) / 24 + 0.000001) * 12;
return delta;
}
function ceil (double value){int a; if(value>=0)a=value+1; else a=value; return a;} |
|
|
inre25 |
Отправлено: 07 Января, 2020 - 08:28:38
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Май 2019
Репутация: 0
|
if (x_цель >= 550 && x_цель <= 594) // если x_цель больше или равно 550 и x_цель меньше или равно 594
Да больше или равно я понял как.
Но вопрос был Как сделать от и до, без равно.
То есть если x_цель находится в диапазоне от 550 до 598 то есть только в нашем случае от 550 и до 598, то что Вы написали x_цель >= 550 тут и 600 подходит под это условие, а нужно не более 598, и сюда x_цель <= 594 тут и 549 подходит под это условие, а нужно не менее 550. Или я что то не понимаю?
(Добавление)
Смещение с фиксированным шагом, можно не заморачиваться с нагромождением if else.
Я просто еще с эти операторами не до конца разобрался как правильно скобки ставить и else правильно добавить. Ваш код наверно крутой, что Вы написали, но мне он вообще не понятен.
1. int x_цель = 530; - почему тут 530 ?
2. int delta_x = func(x_цель); тут как я понял delta_x равно func(x_цель); но func(x_цель); больше в коде нет, тогда зачем это ?
3. messagebox(delta_x); это зачем ? чтобы на экран вывести координаты и остановить код?
4. mousemove(sx_KIB+ex1+x_цель + delta_x, sy_KIB+400)); тут вроде понятно но сдесь тоько плюсовое значение, почему?
5. function func(int x) непонятно ? это может начало выполнения функции func, но откуда он возьмет x?
6. if(x==574)return 0; это я так понял то что смещение не будет и код пойдет дальше?
7. int delta; объявили переменную delta, разве переменные не должны быть оъявленны в начале кода?
8. ceil - не знаю что это?
9. if(x < 574)delta=ceil((574 - x_цель) / 24 - 1.000001) * 12; Если х меньше 574 то delta равна ceil которая 574 отнимает например x_цель делит на 24 и отнимает 1,000001 и умножает на 12.
как пример x_цель = 570 получится ((574-570)/24-1,000001)*12 = (4/24-1,000001)*12=(-0,83)*12= -10,00001 такая задумка ? минус 10
почему не округлить ? зачем 1,000001
10. else delta=ceil((574 - x_цель) / 24 + 0.000001) * 12; разве тут не нужно перед else эту скобку поставить { ?
и я так понимаю это переход при условии х больше 574 .
как пример x_цель = 580 получится ((574 - 580) / 24 + 0.000001) * 12=((-6) / 24 + 0.000001) * 12=( -0,249999)*12= -2,999988 такая задумка ? минус 3
11. return delta; переходит на delta, но в коде Вашем не пойму это куда и где будет это смещение?
12. function ceil (double value){int a; if(value>=0)a=value+1; else a=value; return a;} эту строку я не могу прочитать вообще, кроме dable это хранение дробного числа в блоке.
Прошу ответить на вопросы которых стало еще больше |
|
|
Zireael |
Отправлено: 07 Января, 2020 - 10:53:37
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Но вопрос был Как сделать от и до, без равно.
Равно можно убрать.
Цитата: 1. int x_цель = 530; - почему тут 530 ?
530 это для примера. Поставьте другое число и посмотрите что вернёт функция.
Цитата: 2. int delta_x = func(x_цель); тут как я понял delta_x равно func(x_цель); но func(x_цель); больше в коде нет, тогда зачем это ?
Чтобы посчитать какое требуется смещение.
Цитата: 3. messagebox(delta_x); это зачем ? чтобы на экран вывести координаты и остановить код?
Можно убрать, оно для информации. Код и так остановится, он для примера как посчитать смещение.
Цитата: 4. mousemove(sx_KIB+ex1+x_цель + delta_x, sy_KIB+400)); тут вроде понятно но сдесь тоько плюсовое значение, почему?
Потому что функция может возвращать отрицательные значения.
Цитата: 5. function func(int x) непонятно ? это может начало выполнения функции func, но откуда он возьмет x?
При вызове функции будет передано значение x_цель и оно запишется в x.
Цитата: 7. int delta; объявили переменную delta, разве переменные не должны быть оъявленны в начале кода?
Если объявить вначале, то она будет глобальной, т. е. видно в любом месте скрипта, если в функции, то локальной, видна только в этой функции.
Цитата: 8. ceil - не знаю что это?
Округление x до ближайшего целого, которое больше x.
Цитата: -10,00001 такая задумка ? минус 10
-2,999988 такая задумка ? минус 3
Функция возвращает целые значения кратные 12. Если x_цель = 570 или 580, то delta_x будет равна 0, т. к. смещение не требуется.
Может так нагляднее будет:
code (Отобразить)CODE:int x_цель = 574;
while(x_цель> 20 && x_цель < 1128)
{
textbkcolor(0, 65279);
int delta_x = func(x_цель); // вызов функции, вернёт на сколько нужно сместить
textout(0, 300, 300, "Переменная x_цель равна: "+format(x_цель), 1);
textout(1, 300, 320, "Переменная delta_x равна: "+format(delta_x), 1);
textbkcolor(16777215, 255);
textout(2, 300, 370, "Остановить скрипт Ctrl + SHift + Z", 1);
x_цель--; // или x_цель++;
sleep(300);
}
function func(int x)
{
if(x==574)return 0;
int delta;
if(x < 574)delta=ceil((574 - x_цель) / 24 - 1.000001) * 12;
else delta=ceil((574 - x_цель) / 24 + 0.000001) * 12;
return delta;
}
function ceil (double value){int a; if(value>=0)a=value+1; else a=value; return a;} |
|
|
Zireael |
Отправлено: 09 Января, 2020 - 06:24:19
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: 1. те есть, если * 12; заменить на 1 то будет более точное значение?
Нет, в диапазоне 550-574 вернёт 1, 526-550 вернёт 2 и т.д.
Цитата: 2. для чего 1,000001 и 0.000001 их можно заменить на просто 1 и 0 или будет потом ошибка?
Чтобы числа, к примеру 550 и 598 входили в диапазон, т. е. int x_цель = 550; функция вернёт 0.
Если заменить 1,000001 на 1, то 550 не будет входить в диапазон и функция вернёт 12.
Если убрать 0.000001, то при int x_цель = 598; вернёт -12, а не 0. |
|
|
inre25 |
Отправлено: 09 Января, 2020 - 10:55:26
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Май 2019
Репутация: 0
|
Спасибо большое за разъяснение.
Я убрал в коде то что было для визуально восприятия, оно очень помогает в настройке и то что как показалось лишнее и без этого работает.
int x_цель = 574;
while(x_цель> 20 && x_цель < 1128)
textbkcolor(0, 65279);
textout(0, 300, 300, "Переменная x_цель равна: "+format(x_цель), 1);
textout(1, 300, 320, "Переменная delta_x равна: "+format(delta_x), 1);
textbkcolor(16777215, 255);
textout(2, 300, 370, "Остановить скрипт Ctrl + SHift + Z", 1);
x_цель--; // или x_цель++;
sleep(300);
первую поскольку у меня же х_цель само присваивается по координатам (я ее в старте прописываю), а вторую так и не понял. но без нее работает.
Гляньте это точно лишнее ?
1. Но опять загвоздка... я общий код делаю в визуальном редакторе. Ваш крутой код вставил в пустой блок кода и нагородил с блоков что мне нужно.
Но проблема в том, что он постоянно его выполняет(зациклено), а мне нужно чтобы после того как он выполнится, еще и другие значения отслеживались, но не знаю как это сделать.
2. я это от Вашего кода оставил
{
int delta_x = func(x_цель); // вызов функции, вернёт на сколько нужно сместить
}
function func(int x)
{
if(x==313)return 0;
int delta;
if(x < 313)delta=ceil((313 - x_цель) / 24 - 1.000001) * 12;
else delta=ceil((313 - x_цель) / 24 + 0.000001) * 12;
return delta;
}
function ceil (double value){int a; if(value>=0)a=value+1; else a=value; return a;}
последнюю строку не понимаю, может тут что то убрать чтобы он после одного раза выполнения переходил в другой блок кода.
(Добавление)
с тем что по кругу крутилось разобрался это я сам не добавил блоки при переходах неправда. но остальные вопросы открыты. |
|
|
Zireael |
Отправлено: 09 Января, 2020 - 16:42:07
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: function ceil (double value){int a; if(value>=0)a=value+1; else a=value; return a;}
последнюю строку не понимаю
Как работают функции понимать не требуется. Вызвали в нужном месте func(x_цель), получили результат.
Цитата: код вставил в пустой блок кода
Это должны быть функции, а не просто блоки кода.
|
|
|
Zireael |
Отправлено: 10 Января, 2020 - 11:27:38
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: чтобы показывал помимо нахождения координат и смещения
code (Отобразить)CODE:int x_цель = 574;
while(x_цель > 20 && x_цель < 1128)
{
textbkcolor(0, 65279);
textout(0, 300, 300, "Переменная x_цель равна: "+format(x_цель), 1);
textout(1, 300, 320, "Переменная delta_x равна: "+format(delta_x), 1);
textbkcolor(0, 65280);
int delta_x = func(x_цель); // вызов функции, вернёт на сколько нужно сместить
textout(2, x_цель, 400, "X", 1);
textout(3, x_цель + delta_x, 420, "d", 1);
textbkcolor(16777215, 255);
textout(4, 300, 500, "Остановить скрипт Ctrl + SHift + Z", 1);
x_цель--; // или x_цель++;
sleep(30);
}
function func(int x)
{
if(x==574)return 0;
int delta;
if(x < 574)delta=ceil((574 - x_цель) / 24 - 1) * 12;
else delta=ceil((574 - x_цель) / 24) * 12;
return delta;
}
function ceil (double value){int a; if(value>=0)a=value+1; else a=value; return a;} |
|
|
|