Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - yogukum

Pages: [1]
1
To Vint: не в этом дело, это не решает траблу. Только что проверил, only_tray = 0 не влияет на баг.

2
Апну тему. Испортил скрипт, благодаря этому глюку. В полной мере проблема проявляется на ХР. Чтобы увидеть делаем (на ХР): открываем любой скрипт в редакторе, пишем что-нибудь, сворачиваем редактор (он падает куда-то, вроде в трей), открываем двумя щелчками из трея, смотрим. Изменения исчезли. Изменения теряются, если открывать скрипт двумя щелчками или обычным способом - через "Открыть файл".

На Вин7 проблема остается, если открыть вначале Кликермен, а в нем скрипт.  Тогда все тоже самое, что и на ХР. Если же открывать скрипт двумя щелчками, то все вроде нормально, хотя полностью потестить не получилось.

Несколько открытых экземпляров программы могут обмениваться кодом редактора. Это еще один прикол.

Очень стремный глюк, на мой взгляд, если скрипт маленький заметить что-то можно, но когда большая портянка...

Рекомендация: работать ТОЛЬКО в одном экземпляре программы, НЕ сворачивать окно редактора (да и лучше вообще не сворачивать ничего в проге),  делать резервные копии.

3
Мои пять копеек :) Вот упрощенный вариант вашего скрипта
Code: (clickermann) [Select]

Thread(thr_analys,1)

//wait(1)
waitms(100)

print("Начали")

$rand = RND(1,4)

SWITCH($rand)
case(1)
SETTHREAD (thr_looting, 1)
SETTHREAD (thr_analys, 0)

case(2)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)

case(3)
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_SWITCH

SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)


//wait(2)
end_thread

//===================== thr_looting

Thread(thr_looting,0)

waitms(100)

//wait(1)
for($a=1, $a<6)

print("Делай - ", $a)

end_cyc

SETTHREAD (thr_analys, 1)
SETTHREAD (thr_looting, 0)
end_thread

//===================== thr_teleport

Thread(thr_teleport,0)

waitms(100)

//wait(1)
for($a=1, $a<6)

print("Ляляля - ", $a)

end_cyc


SETTHREAD (thr_analys, 1)
SETTHREAD (thr_teleport, 0)
end_thread

//===================== thr_run

Thread(thr_run,0)

waitms(100)

//wait(1)
for($a=1, $a<6)

print("Бубубу  - ", $a)

end_cyc

SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
end_thread


После "Начали" в логе, теоретически, должен быть один набор хрени типа Ляляля - х, но не тут то было, думаю разберетесь: в главном потоке  в любом случае выполнится последний thr_run, даже если перед этим он уже выполнился. Но фишка еще в том, что потоки очень быстро отрабатывают и кажется, что они фигачат подряд без остановки. Попробуйте поставить задержку повыше в главном и посмотри, что происходит

Насчет сабов - они хороши, если существует 100% определенная последовательность действий. Т.е. сто пудов будет так, например: иду, собрал, атаковал, сел - и этот набор никогда не меняется. Но в вашем случае, я думаю, это не 100% :) Так же, как и у меня было :) По-любому выскочит какое-нибудь окно, проскочит левый цвет, или последовательность изменится. Поэтому пришлось делать что-то вроде этого:

Code: (clickermann) [Select]

SUB($trh, $name, $is_start)

$array[0] = "thr_looting"
$array[1] = "thr_teleport"
$array[2] = "thr_run"

for ($i = 0, $i < arrsize($array))
IF($array[$i] ! $name)
SETTHREAD ($array[$i], $is_start)
END_IF
end_cyc

END_SUB

Thread(thr_analys,1)

//wait(5)
waitms(100)

print("Проверяю, что делать")

$rand = RND(1,3)


SETTHREAD (thr_analys, 0)


//wait(2)
end_thread

//===================== thr_looting

Thread(thr_looting,1)

waitms(300)

//wait(1)
if ($rand = 1)

thr(thr_looting,0)

for($a=1, $a<6)
print("Лутаю - ", $a)
end_cyc

thr(thr_looting,1)

SETTHREAD (thr_analys, 1)

end_If

end_thread

//===================== thr_teleport

Thread(thr_teleport,1)

waitms(300)

//wait(1)

if ($rand = 2)

thr(thr_teleport,0)

for($a=1, $a<6)
print("Телепорт - ", $a)
end_cyc

thr(thr_teleport,1)

SETTHREAD (thr_analys, 1)

end_If


end_thread

//===================== thr_run

Thread(thr_run,1)

waitms(300)

//wait(1)
if ($rand = 3)

thr(thr_run,0)

for($a=1, $a<6)
print("Бегу - ", $a)
end_cyc

thr(thr_run,1)

SETTHREAD (thr_analys, 1)

end_If

end_thread
.

4
Пока что  увидел только это (103 строка) :

Code: [Select]

SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
ELSE
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
END_IF


Если поток остановится перед ELSE, то следующий вызов начнется не с начала, а продолжит за ELSE и понеслась. Я без понятия, как в таком случае интерпретируется тогда ELSE..

5
Ваша картинка просто "невлазит в область поиска, увеличте область на один пиксель в каждую сторону.

Да, я тоже так думал, проверил сразу, хотя если из-за такого условие срабатывает - это еще хуже, на мой взгляд.. :)

Ни какого глюка, скорее недоработка. Дело в том что для области getscreen вторые два числа нужно указывать на 1 пиксел больше области поиска.


Вообщем, я подготовил архив, в котором сэмплы и кодес :) Короче говоря, if_picture_in находит соответствие сэмплу за пределами указанной области. Т.е. по сути сэмпл выпадает "за экран". Как вариант if_picture_in считает, что совпадение части сэмпла достаточно.. Сразу оговорюсь, это мои предположения.

В архиве несколько файлов:
1. somepic.bmp - эту пикчу надо найти
2. bug.bmp - здесь надо найти п.1
3. shot0019.bmp - эту область создал SCREENSHOTEX(671,309, 708,401), вот по ней и нужно ориентироваться, указывая координаты для bug.bmp
4. bug_with_help_dots.bmp - это для примера, где нужно указать координаты - я там точечки поставил :) Только не ее использовать, а п.2
5. if_picture_in_trouble_f.cms - непосредственно сам скрипт, там комменты есть.

Как я делал - открыл bug.bmp, открыл где нибудь рядом shot0019.bmp, и глядя на  shot0019, приблизительно определил координаты этого места на bug.bmp, вписал их и запустил скрипт.. Вуаля.. У меня условие исполнилось.. Кому вообще в лом - тому видос, http://rghost.ru/private/6mrY7pKYr/20bb050076959d11162d7856e0c561d3, пасс для скачивания - 1379

ЗЫ Кстати, scanpicture также работает, находит за пределами. В первом посте я ошибся и забыл массив указать.

6
Привет!

Есть поток, в нем крутиться постоянно проверка определенной области экрана. Внутри проверка вида:

Code: [Select]
getscreen(671,309, 708,401)
IF_PICTURE_IN(671,309, 708,401, "somepict.bmp")
LOGWRITE("OK")
somesub()
ELSE
LOGWRITE("Not OK")
END_IF
wait(1)

Проблема: при любом состоянии экрана условие срабатывает.

Подробнее:

Искомая картинка однородного цвета, залита полностью. Скрипт к окну не привязан, потоков штук 10, один главный, остальные - контроль. 

Неожиданно заметил, что в логе присутствует сообщение из этого условия, хотя на экране в искомом месте картинка меняется, т.е. статичный сэмпл ну никак не может в этом месте находиться. Сразу решил проверить это условие отдельно - скопировал его в новое окно в редакторе и давай там же запускать. Все то же самое - условие срабатывает. В целях проверки добавил scanpicture с выводом в лог координат и SCREENSHOTEX:

Code: [Select]
getscreen(671,309, 708,401)
IF_PICTURE_IN(671,309, 708,401, "somepict.bmp")
LOGWRITE("OK")

scanpicture(671,309, 708,401, "somepict.bmp")
while (arrsize($var) > 0)
  $y = arrpop($var)
  $x = arrpop($var)
  print($x,":", $y)
end_cyc

SCREENSHOTEX(671,309, 708,401)
 
somesub()
ELSE
LOGWRITE("Not OK") 
END_IF
wait(1)

Но увы, scanpicture координат картинки не видит. И SCREENSHOTEX сохраняет правильные участки с динамикой, сымпла на них нет.  В конце концов добавил в начало getscreen без координат и проверочный скрипт заработал корректно. Код под спойлером:

[spoiler]
Code: [Select]

getscreen
getscreen(671,309, 708,401)
IF_PICTURE_IN(671,309, 708,401, "somepict.bmp")
LOGWRITE("OK")

scanpicture(671,309, 708,401, "somepict.bmp")
while (arrsize($var) > 0)
  $y = arrpop($var)
  $x = arrpop($var)
  print($x,":", $y)
end_cyc

SCREENSHOTEX(671,309, 708,401)
 
somesub()
ELSE
LOGWRITE("Not OK") 
END_IF
wait(1)

[/spoiler]

Обрадовался. И тут читаю на форуме, что работа из окна редактора не рекомендуется и можно посмотреть, что скрипт видит под курсором мыши :). Громко вздыхаю, загружаю основной скрипт, запускаю НЕ из редактора и... Условие опять срабатывает!. Открываю редактор, нажимаю лупу, навожу на искомую область - ну никак там не может быть сэмпла, все двигается, мерцает и моргает, а сэмпл (я повторюсь) просто прямоугольник залитый одним цветом. Добавил также scanpicture в основной скрипт - не находит сэмпл. А условие все равно срабатывает :). Getscreen без координат в основном уже есть, т.е. постоянно экран обновляется полностью. Размер сэмпла в высоту чуть меньше размера области поиска, да просто глазами видно, что не должно срабатывать условие.

Краткая суть бага: иногда, при определенных условиях, конструкция GETSCREEN(x,y,x1,y1) - IF_PICTURE_IN работает некорректно и может возвращать неправильный результат (человеческим языком - находит картинки там, где их нет)

ЗЫ Расписал все подробно, из уважения к автору :). Классная прога. И вообще, этот баг мне жить не мешает, можно заменить тем же scanpicture и все заработает, но как бы может в натуре баг :)

Pages: [1]