Урок 6. Круглый регулятор громкости
Автор: PolN, действительный член клуба любителей ММВ
Итак, в начальном положении (α) равен 450, тангенс (α) равен 1, громкость в этом положении равна 0. Значит, в Script1 запишем:
katX=100-MouseX() katY=MouseY()-100 tg=katY/katX If (tg>1) Then rot=0 End If (tg<1) Then rot=5 End
Если мы с помощью мыши попытаемся повернуть регулятор ниже своего минимального значения, то записанное условие не позволит нам это сделать. А если выше, то угол поворота ручки будет равен 50.
Выше было сказано, что минимальное значение угла (α) - это 45 градусов. Если мы повернём ручку на 50, то угол (α) будет равен 400. Вычислим на калькуляторе значение тангенса 400 и получим 0,84. Теперь в Script1 добавим следующее условие:
If (tg<0.84) Then rot=10 End
Это означает, что если мы попытаемся повернуть ручку на угол больше 50, то ручка повернётся на 100. Теперь вычислим значение тангенса 350 и получим 0,7. Добавим в Script1 ещё одно условие:
If (tg<0.7) Then rot=15 End
И так далее, прибавляя к значению rot по 50, пока не дойдём до 450.
Но это ещё не всё. Нужно ещё поворачивать ручку на величину rot. Значит, в конце всех условий нужно прописать команду поворота ручки, которая выглядит следующим образом:
rotate=rot RotateImageTo("Ручка","rotate")
Надеюсь, тут всё понятно. Но и это ещё не всё. Нам ведь надо обеспечить непрерывную работу скрипта Main при нажатой кнопке мыши, и прекратить работу всех скриптов при отпускании кнопки. Как это сделать, я объяснял чуть выше, так что просто добавим в конец скрипта Script1 такое условие:
MStatus=MouseLButton() If (MStatus=0) Then mouseup=TRUE Return() End ScriptTimer("TimerB=Main","50")
На этом работа над скриптом Script1 закончилась. Вот что у нас получилось в итоге:
katX=100-MouseX() katY=MouseY()-100 tg=katY/katX If (tg>1) Then rot=0 End If (tg<1) Then rot=5 End If (tg<0.84) Then rot=10 End If (tg<0.7) Then rot=15 End If (tg<0.57) Then rot=20 End If (tg<0.47) Then rot=25 End If (tg<0.37) Then rot=30 End If (tg<0.27) Then rot=35 End If (tg<0.17) Then rot=40 End If (tg<0.08) Then rot=45 End rotate=rot RotateImageTo("Ручка","rotate") MStatus=MouseLButton() If (MStatus=0) Then mouseup=TRUE Return() End ScriptTimer("TimerB=Main","50")
Теперь нажмём кнопку F5 и посмотрим, как работает наш проект. Ручка поворачивается, но пока ещё слишком мало, она двигается только в первой условной зоне. Ведь мы написали только один скрипт из четырех. Переходим ко второй зоне, за которую должен отвечать скрипт Script2. Здесь мы будем рассматривать уже другой треугольник, и соответственно другие катеты (см.рис.):
В этой зоне значения катетов будут другими. Понятно, что katX равен 100-MouseX(), а katY=100-MouseY(). Начнём без лишних объяснений писать Script2:
katX=100-MouseX() katY=100-MouseY() tg=katY/katX
Вычислим чему равен тангенс 50 и получим 0,08. Добавим в Script2 условие:
If (tg>0.08) Then rot1=5 End
И так далее, пока не дойдём до значения rot1=900.
Угол поворота во второй зоне будет не просто равен значению rot1, к нему надо прибавить ещё 450. Т.к. при rot1=0 угол общий угол поворота ручки равен 45 градусов. Значит после всех условий запишем:
rotate=(45+rot1) RotateImageTo("Ручка","rotate") MStatus=MouseLButton() If (MStatus=0) Then rot1=5 mouseup=TRUE Return() End ScriptTimer("TimerB=Main","50")
Для третьей и четвёртой зоны скрипты напишите сами.
После того, как вы это сделаете, регулятор будет вполне работоспособным, но у него обнаружатся два недостатка. Во-первых, при старте проекта он не будет отклоняться на угол, соответствующий уровню громкости в системе, а во-вторых, если вы захватите регулятор мышью и будете тащить его до максимального значения и по достижении его продолжите движение мышью через низ в сторону первой зоны то регулятор проскочит туда и громкость исчезнет, "сорвётся"; то же самое и в обратную сторону. Значит, придётся устранять эти недостатки.
С первым справится несложно. Нужно создать текстовый объект и назвать его CBK_Volume, а в скрипте старта страницы написать такую строчку:
RotateImageTo("Ручка","CBK_Volume*2.7")
И всё. А вот со второй проблемой сложнее, но исправить её возможно. Для начала нам нужно понять, что следует разрешить, а что запретить. Например, для первой зоны можно разрешить работу скрипта, только если мышь пришла из второй зоны, а для второй зоны можно разрешить работу скрипта, только если мышь пришла из третьей или первой зоны, и т.д. Т.е. работу скриптов можно разрешать, только если мышь пришла из соседних зон. Начнём это реализовывать.
Как определить, в какой зоне находится мышь? Да очень просто. Введём какую-нибудь переменную, например q. В Script1 добавим строку q=1, в Script2 - q=2, в Script3 - q=3 и, соответственно, в Script4 - q=4.
Теперь осталось немного подправить скрипт Main. В условие запуска скрипта Script1 надо добавить дополнительное условие, которое разрешит запустить скрипт, только если мышь пришла из второй зоны. Условие будет выглядеть так:
If (MouseX()<100 & MouseY()>100) Then If (q<>4 & q<>3) Then RunScript("Script1") End End
То же самое проделаем для других условий. Окончательно скрипт Main будет выглядеть так:
VolumeUp("Rotate/2.7") If (MouseX()<100 & MouseY()>100) Then If (q<>4 & q<>3) Then RunScript("Script1") End End If (MouseX()<100 & MouseY()<100) Then If (q<>4) Then RunScript("Script2") End End If (MouseX()>100 & MouseY()<100) Then If (q<>1) Then RunScript("Script3") End End If (MouseX()>100 & MouseY()>100) Then If (q<>1) Then RunScript("Script4") End End MStatus=MouseLButton() If (MStatus=0) Then mouseup=TRUE Return() End ScriptTimer("TimerB=Main","50")
ВСЁ!!! Теперь запустите проект и - о чудо! - регулятор работает, как будто настоящий!
Ну а если вы так и не смогли разобраться во всех хитросплетениях этого урока, то просто скачайте готовый регулятор с сайта, из раздела "Готовые проекты - Отдельные узлы".
Удачи!
Написать отзыв Назад |