![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2012
Сообщений: 8
|
Доброго времени суток.
Необходимо сделать ручку регулятора, которая бы вращалась за курсором только при зажатой ПКМ. Т.е. наводим курсор на регулятор, зажимай ПКМ, двигаем курсор куда хотим по всей сцене и регулятор вертится за мышью. Отпускаем ПКМ и регулятор перестает вращаться за мышью. Соответсвенно на клик ПКМ вне области регулятора он не реагирует. Вот что у меня получилось var m_roll:M_roll= new M_roll(); addChild(m_roll); var temp_roll:int=0; m_roll.addEventListener(MouseEvent.MOUSE_MOVE, RotationCircle); function RotationCircle(e:MouseEvent):void { m_roll.addEventListener(MouseEvent.MOUSE_DOWN, RotationCircleDown); function RotationCircleDown(e:MouseEvent):void { temp_roll=1 } m_roll.addEventListener(MouseEvent.MOUSE_UP, RotationCircleUp); function RotationCircleUp(e:MouseEvent):void { temp_roll=0 } if(temp_roll==1) { var X:Number = m_roll.x; var Y:Number = m_roll.y; var mX:Number = mouseX; var mY:Number = mouseY; var AB:Number; var OB:Number; var sina:Number; var a:Number; AB = Math.abs(X - mX); OB = Math.abs(Math.sqrt(Math.pow(X - mX ,2) + Math.pow(Y - mY ,2))); sina = AB / OB; a = Math.asin(sina) * 180 / Math.PI; if (Y >= mY && X <= mX) { m_roll.rotation = a; } else if (Y < mY && X <= mX) { m_roll.rotation = 180 - a; } else if (Y >= mY && X > mX) { m_roll.rotation = 360 - a; } else if (Y < mY && X > mX) { m_roll.rotation = 180 + a; } } } Только есть некоторые проблемки. 1) Регулятор вращается только при курсоре в его области. 2) Если отжать ПКМ за областью регулятора, то он будет вращаться без клика при возвращении курсора в его область 3) Хотелось бы "цеплять" регулятор в любом месте. в моем же случае он резко вращается к курсору при клике. Посьба сильно не пинать, с AS только знакомлюсь ![]() |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 8
|
Мда) Видимо мои познания еще малы, что бы разобраться с Вашим решением, Wolsh.
Я пока пишу скрипты в кадре, а работу с файлами и классами (если правильно понял Ваш ответ) еще не изучал. Все же посидев вечерок избавился от первых двух проблем таким способом var m_roll_fon:M_roll_fon= new M_roll_fon(); addChild(m_roll_fon); var m_roll:M_roll= new M_roll(); addChild(m_roll); var temp_roll:int=0; m_roll_fon.addEventListener(MouseEvent.MOUSE_MOVE, RotationCircle); m_roll.addEventListener(MouseEvent.MOUSE_MOVE, RotationCircle); function RotationCircle(e:MouseEvent):void { if(temp_roll==1) { var X:Number = m_roll.x; var Y:Number = m_roll.y; var mX:Number = mouseX; var mY:Number = mouseY; var AB:Number; var OB:Number; var sina:Number; var a:Number; AB = Math.abs(X - mX); OB = Math.abs(Math.sqrt(Math.pow(X - mX ,2) + Math.pow(Y - mY ,2))); sina = AB / OB; a = Math.asin(sina) * 180 / Math.PI; if (Y >= mY && X <= mX) { m_roll.rotation = a; } else if (Y < mY && X <= mX) { m_roll.rotation = 180 - a; } else if (Y >= mY && X > mX) { m_roll.rotation = 360 - a; } else if (Y < mY && X > mX) { m_roll.rotation = 180 + a; } } } m_roll.addEventListener(MouseEvent.MOUSE_DOWN,RotationCircleDown); function RotationCircleDown(e:MouseEvent):void {temp_roll=1; m_roll.addEventListener(MouseEvent.MOUSE_MOVE, RotationCircle); m_roll_fon.addEventListener(MouseEvent.MOUSE_MOVE, RotationCircle);} m_roll_fon.addEventListener(MouseEvent.MOUSE_UP,RotationCircleUp); m_roll.addEventListener(MouseEvent.MOUSE_UP,RotationCircleUp); function RotationCircleUp(e:MouseEvent):void {temp_roll=1; m_roll.removeEventListener(MouseEvent.MOUSE_MOVE, RotationCircle); m_roll_fon.removeEventListener(MouseEvent.MOUSE_MOVE, RotationCircle);} Может как-нибудь можно избавиться от третей проблемки в моем случае? или всеже придется изучить создание файлов и классов? |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
С чем там разбираться? Там 10 строк кода – три обработчика.
Все остальное это рисование объекта – ручки. Просто не пользуюсь Flash IDE, а искать картинку было лень. Вся функция init() только рисует спрайтик ручки и вешает на него один единственный слушатель нажатия мышки. Повесьте на вашу ручку этот слушатель как у меня и добавьте три обработчика, переписав имена объектов конечно. Второй код для Мейна, он вообще ничего не делает кроме создания экземпляра ручки и добавления его на сцену. И да, абсолютно круто было бы бросить кадры и научиться писать в классах))) Непривычно сначала, но это же совсем другой уровень. Это уже серьезно. И это не так страшно, как кажется на первый взгляд. Надо только начинать с чего-то простенького. Можно начать с того, чтобы запустить этот мой код из двух классов. первый сохранить как Knob.as, второй как Main.as (это класс документа, его надо указать в соответствующем поле во Flash) Должно получиться что-то такое:
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 09.04.2012 в 02:03. |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 8
|
Спасибо Вам огромное, Wolsh. маленько разобрался с этим способом, воспросизвел код
ручка у вас отличнейшая! спасибо |
|
|||||
|
Не получается заменить рисунок ручки на грампластинку
Подскажите пожалуйста какой кусочек кода поменять?С какой переменной снимать данные уровня громкости? Написал код в кадре Мувик _knob разместил на таймлайне, прописал instance name: _knob Переделал код. import flash.display.*; import flash.events.*; const RAD:Number = 0.0174533; var _knobAngleLast:Number = 0; var _handAngleStart:Number; _knob.addEventListener(MouseEvent.MOUSE_DOWN, handlerDown); function handlerDown(event:MouseEvent) : void { _knobAngleLast = _knob.rotation; _handAngleStart = Math.atan2(mouseY, mouseX) / RAD; stage.addEventListener(MouseEvent.MOUSE_MOVE, handlerMove); stage.addEventListener(MouseEvent.MOUSE_UP, handlerUp); }// end function function handlerUp(event:MouseEvent) : void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, handlerMove); stage.removeEventListener(MouseEvent.MOUSE_UP, handlerUp); }// end function function handlerMove(event:MouseEvent) : void { var _loc_2:* = Math.atan2(mouseY, mouseX) / RAD; var _loc_3:* = _handAngleStart - _loc_2; _handAngleStart = _loc_2; _knob.rotation = _knob.rotation - _loc_3; if (_knob.rotation < 0) { } if (_knob.rotation > -(360 - 240)) { _knob.rotation = _knobAngleLast; } else { _knobAngleLast = _knob.rotation; } }// end function ![]() Последний раз редактировалось Шурик_2; 13.06.2012 в 16:31. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Ахах, декомпил что ли?
Ну вот с картинкой. Но хоть убейте, в кадре не могу написать. Для ФД. Но думаю разберетесь.
__________________
Reality.getBounds(this); |
|
|||||
|
Великая сила декомпилятора
У меня и FD где-то был. Спасибо, сейчас буду сушить мозг дальше.Добавлено через 7 часов 31 минуту Промучился, переводя код в мой проект в Flash CS4, но так ничего и не вышло А в FD работает отлично. Жалею, что не умею писать в классах ![]() Ваши умения кодить дизайн впечатляют... Сколько времени понадобилось научиться? Последний раз редактировалось Шурик_2; 14.06.2012 в 00:27. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Так а зачем переводить код? Добавьте класс в проект. Положите его в папку, где .FLA. У себя в коде создайте экземпляр класса Disc, передав ему Вашу картинку (см. как у меня в классе Мейн), добавьте этот экземпляр на сцену.
Можно конечно попробовать привязать класс к Вашему мувику напрямую, но тогда его придется переписать слегка, да и сам мувик изменить, чтобы он был контейнером, в котором внутри мувик-картинка _disc (она собственно будет вращаться). Параметр для изменения громкости это конечно rotation, но его придется нормализовать из 0..180 и 0..-180 к 0..360, а потом просто применять коэфициент, чтобы 0..360 стало, скажем, 0..1 или 0..100. В том же месте, где картинке назначается окончательно вычисленный поворот, можно диспатчить событие, что значение поворота изменилось, на которое можно подписаться "извне" и что-то менять: громкость, скорость воспроизведения и тп. p.S. дело наверно не во времени; было бы искреннее желание и объективная оценка своих знаний, предохраняющая от бессмысленных попыток написать Quake III до того, как научишься двигать по сцене квадратик. Можно пять лет заниматься мечтаниями и расковыриванием сомнительных исходников, насобирав полный мозг мусора. А можно за пару месяцев осилить книгу Колина Мука, делая максимально простые примитивные тесты, которые ничего не добавляют самолюбию, зато становятся надежной платформой понимания, что и как работает. Изучить AS3, и даже ООП, можно, делая кнопочки, чекбоксы и скроллеры. "Делая" MMORPG, платформеры и гоночки, фотошопы и прочие великие вещи, не открыв ни разу учебник, только потеряешь время и забъешь голову быдлокодом и дикими доморощенными идеями. Правильные усилия + Правильные источники = Эффективное Правильное обучение.
__________________
Reality.getBounds(this); |
|
|||||
|
P.S. Дата моей регистрации не говорит о том, что я пять лет назад начал изучать AS3/2. Меня пять лет назад интересовала только анимация. Только в этом году я начал интересоваться кодированием анимации
Возможности впечатляют. Спасибо за обстоятельный ответ, Вы мой кумир. Пожалуй мне стоит внимательно "перелопатить" страницы этой довольно увесистой книги. |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:27. |
|
|
« Предыдущая тема | Следующая тема » |
|
|