1 (изменено: S.shipilov, 2014-12-01 19:08:36)

Тема: Переход от gosub com1 к Com1(x,y,z,) в обычном кликере Лопание пузырей

Добрый день(вечер. ночь) уважаемые форумчане!

Вопрос связан с переходом от команды gosub к использованию функции com1().
И так, есть работающий код, цель которого по заранее сформированному ini файлу кликать в определенное место на экране, в зависимости от первоначального положения курсора на экране. Первую часть кода не выдаю дабы не грузить лишней информацией но собственно она генерирует ini файл в зависимости от первоначального положения курсора. Ниже переведена вторая часть кода, которая, собственно, считывает данные из ini файла и выполняет клик по заданным координатам от начального положения курсора,  при отжатии хоткея END возвращает курсор в изначальные координаты.

у меня vk23 это END

END = Выполнить скрипт
INS = suspend
DEL = Выход
HOME = Перезагрузка скрипта

+ открыть спойлер

Process, Priority, , High
SetMouseDelay, 2
SetDefaultMouseSpeed 0
SetKeyDelay, 2
SetWorkingDir %A_ScriptDir%
#SingleInstance force
#NoEnv
#InstallKeybdHook
#InstallMouseHook


IniRead    ,    Diff,            res/ini/round1.ini    ,    round1 Settings,        Diff_a 

Diff_b := 60*1000/Diff

loop, 145
{
wer ++
IniRead    ,    x%wer%,            res/ini/round1.ini    ,    round1 search_a,        x%wer%
IniRead    ,    y%wer%,            res/ini/round1.ini    ,    round1 search_a,        y%wer%
}
return

LMBmove(x,y) 
{ 
Sleep 5
SendEvent {Click}
DllCall("mouse_event",uint,1,int,x,int,y,uint,0,int,0) 
}

LMBclick:
    {
    Settimer     LMB_search_a,         %Diff_b%
    gosub         LMB_search_a
    gosub         LMB_unpress
    }
return
        
LMB_unpress:
    if GetKeyState("vk23", "P")
    KeyWait, vk23
        {    
        SendEvent {vk23 up}
        LMBmove(Move_x2, Move_y2)
        Diff_step := 0
        Move_x2 := 0
        Move_y2 := 0
        }
return        

LMB_search_a:
if GetKeyState("vk23", "P")
    {
    Diff_step += 1
    gosub LMB_return
    LMBmove(Move_x1, Move_y1)
    }
    else
        {
        Settimer LMB_search_a, off
        }
return

LMB_return:
{
        Move_x1 := x%Diff_step%
        Move_x2 += -Move_x1
        Move_y1 := y%Diff_step%
        Move_y2 += -Move_y1
}
return


*End:: gosub LMBclick
*Ins:: Suspend
*Home::Reload
*Del:: ExitApp

Собственно у меня есть подозрения что код можно значительно упростить (оптимизировать) в т.ч. уходом от использования gosub к использованию функций вида LMBclick(Diff_b), но я испытываю некоторые сложности потому как  сложить всё в одну функцию с присвоением её исполнения на хоткей END приводит к критическому завершению приложения AHK. бредокод полученный мной выкладывать не буду в виду его полной неработоспособности и прошу помочь мне разобраться поэтапно с упрощением работающего кода.

Заранее благодарен.

P.S. путь для размещения ini файла %root%\res\ini

Post's attachments

round1.ini 174 b, 2 downloads since 2014-12-01 

You don't have the permssions to download the attachments of this post.

2

Re: Переход от gosub com1 к Com1(x,y,z,) в обычном кликере Лопание пузырей

Наверное не все поняли, что Вы хотите. Попробую прочитать мысли.

Имеется файл со списком координат. Необходимо:
1) Считать файл в переменную.
2) По нажатию End (vk23) произвести щелчок ЛКМ в координатах, взятых из списка. На каждый щелчок брать последующие координаты.

3 (изменено: S.shipilov, 2014-12-02 04:44:41)

Re: Переход от gosub com1 к Com1(x,y,z,) в обычном кликере Лопание пузырей

Странно вроде сформулировал правильно, или я уже заработался.
Попытка#2

Есть Работающий скрипт построенный на gosub хочу переделать его используя не gosub, а функции

к примеру

+ открыть спойлер

LMBmove:
{ 
Sleep 5
SendEvent {Click}
DllCall("mouse_event",uint,1,int,%Move_y1%,int,%Move_y1%,uint,0,int,0) 
}

*End:: gosub LMBmove

Можно представить как:

+ открыть спойлер


LMBmove(x,y)
{ 
Sleep 5
SendEvent {Click}
DllCall("mouse_event",uint,1,int,x,int,y,uint,0,int,0) 
}

*End::  LMBmove(Move_x1, Move_y1)

что собственно я уже сделал, но я хочу по возможности вообще отказаться от gosub, если такое возможно, и перейти на использование функций но "плаваю" в синтаксисе и архитектуре построения функции, вот и обратился за помощью.

т.е.

+ открыть спойлер

LMB_unpress:
    if GetKeyState("vk23", "P")
    KeyWait, vk23
        {    
        SendEvent {vk23 up}
        LMBmove(Move_x2, Move_y2)
        Diff_step := 0
        Move_x2 := 0
        Move_y2 := 0
        }
return  

Хочу представить в виде

+ открыть спойлер

LMB_unpress(m_x2, m_y2)
{
    if GetKeyState("vk23", "P")
    KeyWait, vk23
        {    
        SendEvent {vk23 up}
        LMBmove(m_x2, m_y2)
        Diff_step := 0
        M_x2 := 0
        M_y2 := 0
        }
}
return  

а вызов gosub LMB_Unpress

+ открыть спойлер

LMBclick:
    {
    Settimer     LMB_search_a,         %Diff_b%
    gosub         LMB_search_a
    gosub         LMB_unpress
    }
return

заменить на

+ открыть спойлер

LMBclick:
    {
    Settimer     LMB_search_a,         %Diff_b%
    gosub         LMB_search_a
    LMB_unpress(Move_x2, Move_y2)
    }
return

Но у меня что то не работает и AHK завершает работу.