Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Amperandus on November 08, 2016, 07:12:38 PM
-
Здравствуйте. Есть такой вот кусок кода. Проблема в том что переменная $count не обнуляется. Более того не обнуляется arrsize($partyHpArr). пробовал undefinу, разные названия переменных, хотя в моем понимании все должно работать так, как написано сейчас. Возможно я в чем то ошибаюсь и не вижу этого в упор
sub(partyHeal)
getscreen()
SCANPXL($partyHpArr,$pHpX1,$wy1,$pHpX2,$wy2,$colPartyHpLive)
$count = arrsize($partyHpArr)
if($count > 0)
$pHpY = 0
$minX = 1000
for($i=1,$i < $count)
if($partyHpArr[$i] ! $phpY)
SCANPXL($partyYArr,$pHpX1,$partyHpArr[$i],$pHpX2,$partyHpArr[$i],$colPartyHpLive)
$X = $partyYArr[arrsize($partyYArr) - 2]
if($minX > $X)
$minX = $X
$minY = $partyHpArr[$i]
end_if
end_if
INC($i,2)
end_cyc
if($minX ! $pHpX2)
IF_PICTURE_IN($wx1,$wy1,$wx2,$wy2,"screens/svHeal.bmp")
logwrite(partyHeal)
IF_PICTURE_IN($wx1,$wy1,$wx2,$wy2,"screens/svPreHeal.bmp")
keypress($btnPreHeal)
waitms($timeSkill)
end_if
MOVE($minX,$minY)
waitms($timeButton)
lclick($minX,$minY)
waitms($timeButton)
keypress($btnHeal)
waitms($timeSkill)
$f = 1
end_if
end_if
end_if
end_sub
т.е. logwrite($count) выдает вот такое вот
21:15:11 302
21:15:12 604
21:15:12 906
21:15:13 1208
21:15:13 1510
21:15:15 1812
21:15:16 2114
21:15:17 2416
-
Из такого, что первым бросается в глаза - у тебя
$count = arrsize($partyHpArr)
....
for($i=1,$i < $count)
....
Примечания
Не стоит забывать, что индексация массива идет от нуля, поэтому максимально доступный индекс всегда будет arrsize()-1
-
так и есть. в нормальном цикле было бы <= а тут только <
-
getscreen() - у функции не нужно писать пустые скобки
logwrite(partyHeal) - строки нужно помещать в кавычки
INC($i,2) - цикл фор сам наращивает переменную, причем последним параметром можно указать на сколько.
sub(partyHeal)
getscreen
SCANPXL($partyHpArr,$pHpX1,$wy1,$pHpX2,$wy2,$colPartyHpLive)
$count = arrsize($partyHpArr)
if($count > 0)
$pHpY = 0
$minX = 1000
for($i=0,$i < $count,2)
if($partyHpArr[$i] ! $phpY)
SCANPXL($partyYArr,$pHpX1,$partyHpArr[$i],$pHpX2,$partyHpArr[$i],$colPartyHpLive)
$X = $partyYArr[arrsize($partyYArr) - 2]
if($minX > $X)
$minX = $X
$minY = $partyHpArr[$i]
end_if
end_if
end_cyc
if($minX ! $pHpX2)
IF_PICTURE_IN($wx1,$wy1,$wx2,$wy2,"screens/svHeal.bmp")
logwrite("partyHeal")
IF_PICTURE_IN($wx1,$wy1,$wx2,$wy2,"screens/svPreHeal.bmp")
keypress($btnPreHeal)
waitms($timeSkill)
end_if
MOVE($minX,$minY)
waitms($timeButton)
lclick($minX,$minY)
waitms($timeButton)
keypress($btnHeal)
waitms($timeSkill)
$f = 1
end_if
end_if
UNDEFINE($partyHpArr)
end_if
end_sub
-
Спасибо вот это помогло
UNDEFINE($partyHpArr)
но не понятна природа явления. я читал про то, что переменная в цикле не обнуляется, но вроде бы не тот случай в моем коде. Придется теперь все arrsize проверять :(
-
UNDEFINE($partyHpArr)
но не понятна природа явления. я читал про то, что переменная в цикле не обнуляется, но вроде бы не тот случай в моем коде. Придется теперь все arrsize проверять :(
При чём здесь arrsize?
функция SCANPXL($partyHpArr.... ищет подходящие пикселы и собирает их координаты в массив $partyHpArr. Если массив не пустой, то данные добавляются. То же самое и смассивом $partyYArr.
Т.к. этот код находится в подпрограмме и вызывается много раз, нужно очищать массивы перед/после каждого прохода. Если , конечно, задача другая не стоит.
-
Да имелось в виду массив целиком, тут слегка в запаре просто.
Стоит добавить, что массивы, как и переменные хранят свои значения. Поэтому последовательный вызов двух scanpicture (например) без извлечения элементов через arrpop приведет к тому что у вас будет двойная очередь координат. Поэтому если вам для работы необходим «чистый» массив, то не забывайте высвобождать память, путем вызова undefine($var). Тут все как для переменных.
разве переменные не обнуляются при новом цикле?
подпрограмма вызывается ровно один раз.
$partyHpArr - 1 раз инициализируется за цикл.
$partyYArr - тут вот может быть и надо обнулять.
-
разве переменные не обнуляются при новом цикле?
С чего бы это?
подпрограмма вызывается ровно один раз.
$partyHpArr - 1 раз инициализируется за цикл.
$partyYArr - тут вот может быть и надо обнулять.
Тут тебе видней. Показал ты только подпрограмму.
-
в общем и целом понятно. спасибо за объяснения, до этого с массивами не приходилось сталкиваться в clickermanne.
-
чтобы не плодить темы
толи лыжи не едут то ли я ****
$hwnd = wndfind("***")
wndgetinfo($hwnd, $wx1, $wy1, $w, $h)
if($wx1 ! 0 OR $wy1 ! 0)
logwrite("pos")
wndpos($hwnd,0,0)
wait(5)
end_if
logwrite($w,"\",$h)
if($w ! 1280 OR $h ! 700)
logwrite($w,"/",$h)
wndsize($hwnd,1280,700)
wait(5)
end_if
16:24:36 1280\700
16:24:36 1280/700
16:24:45 1280\700
16:24:45 1280/700
16:24:56 1280\700
16:24:56 1280/700
16:25:06 1280\700
16:25:06 1280/700
Почему if($w ! 1280 OR $h ! 700) выполняется, хотя не должно. ну по моей логике.
-
Почему if($w ! 1280 OR $h ! 700) выполняется, хотя не должно. ну по моей логике.
Потому что минимум
if(($w ! 1280) OR ($h ! 700))
И в верхнем условии тоже
-
тоже не то... пойду юзать поиск, не найду вернусь
-
a ! b - истинно, если a неравно b (поддерживает строки)
что то я не понимаю...
-
тоже не то... пойду юзать поиск, не найду вернусь
Что не то?
$w = 1280
$h = 700
IF(($w ! 1280) OR ($h ! 700))
logwrite($w,"/",$h)
ELSE
LOGWRITE("условие не выполняется")
END_IF
HALT
15:34:22 условие не выполняется
-
Спасибо. Все таки я, крыша слегка едет от работы и еще в промежутках тут пытаюсь ковыряться - вот и получается что то не то.