Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.04.2012, 16:44
Vasil вне форума Посмотреть профиль Отправить личное сообщение для Vasil Найти все сообщения от Vasil
  № 1  
Ответить с цитированием
Vasil

Регистрация: Apr 2012
Сообщений: 8
По умолчанию Пытаюсь сделать регулятор

Доброго времени суток.
Необходимо сделать ручку регулятора, которая бы вращалась за курсором только при зажатой ПКМ. Т.е. наводим курсор на регулятор, зажимай ПКМ, двигаем курсор куда хотим по всей сцене и регулятор вертится за мышью. Отпускаем ПКМ и регулятор перестает вращаться за мышью. Соответсвенно на клик ПКМ вне области регулятора он не реагирует.
Вот что у меня получилось
Код AS3:
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;
            }
  }
 }
где m_roll клип с изображением ручки регулятора.
Только есть некоторые проблемки.
1) Регулятор вращается только при курсоре в его области.
2) Если отжать ПКМ за областью регулятора, то он будет вращаться без клика при возвращении курсора в его область
3) Хотелось бы "цеплять" регулятор в любом месте. в моем же случае он резко вращается к курсору при клике.
Посьба сильно не пинать, с AS только знакомлюсь

Старый 08.04.2012, 19:44
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
http://flasher.ru/forum/showpost.php...2&postcount=15
__________________
Reality.getBounds(this);

Старый 08.04.2012, 20:39
Vasil вне форума Посмотреть профиль Отправить личное сообщение для Vasil Найти все сообщения от Vasil
  № 3  
Ответить с цитированием
Vasil

Регистрация: Apr 2012
Сообщений: 8
Мда) Видимо мои познания еще малы, что бы разобраться с Вашим решением, Wolsh.
Я пока пишу скрипты в кадре, а работу с файлами и классами (если правильно понял Ваш ответ) еще не изучал.
Все же посидев вечерок избавился от первых двух проблем таким способом
Код AS3:
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);}
где m_roll_fon область всей сцены.
Может как-нибудь можно избавиться от третей проблемки в моем случае? или всеже придется изучить создание файлов и классов?

Старый 09.04.2012, 01:50
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
С чем там разбираться? Там 10 строк кода – три обработчика.
Все остальное это рисование объекта – ручки. Просто не пользуюсь Flash IDE, а искать картинку было лень. Вся функция init() только рисует спрайтик ручки и вешает на него один единственный слушатель нажатия мышки.
Повесьте на вашу ручку этот слушатель как у меня
Код AS3:
_knob.addEventListener(MouseEvent.MOUSE_DOWN, handlerDown);
и добавьте три обработчика, переписав имена объектов конечно.
Второй код для Мейна, он вообще ничего не делает кроме создания экземпляра ручки и добавления его на сцену.
И да, абсолютно круто было бы бросить кадры и научиться писать в классах)))
Непривычно сначала, но это же совсем другой уровень. Это уже серьезно. И это не так страшно, как кажется на первый взгляд. Надо только начинать с чего-то простенького. Можно начать с того, чтобы запустить этот мой код из двух классов. первый сохранить как Knob.as, второй как Main.as (это класс документа, его надо указать в соответствующем поле во Flash)
Должно получиться что-то такое:
Вложения
Тип файла: zip Knob.zip (2.4 Кб, 61 просмотров)
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 09.04.2012 в 02:03.
Старый 24.04.2012, 19:48
Vasil вне форума Посмотреть профиль Отправить личное сообщение для Vasil Найти все сообщения от Vasil
  № 5  
Ответить с цитированием
Vasil

Регистрация: Apr 2012
Сообщений: 8
Спасибо Вам огромное, Wolsh. маленько разобрался с этим способом, воспросизвел код ручка у вас отличнейшая! спасибо

Старый 13.06.2012, 14:04
Шурик_2 вне форума Посмотреть профиль Отправить личное сообщение для Шурик_2 Найти все сообщения от Шурик_2
  № 6  
Ответить с цитированием
Шурик_2
 
Аватар для Шурик_2

Регистрация: Dec 2007
Сообщений: 73
Отправить сообщение для Шурик_2 с помощью ICQ Отправить сообщение для Шурик_2 с помощью Skype™
Не получается заменить рисунок ручки на грампластинку Подскажите пожалуйста какой кусочек кода поменять?
С какой переменной снимать данные уровня громкости?
Написал код в кадре
Мувик _knob разместил на таймлайне, прописал instance name: _knob
Переделал код.
Код AS3:
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
Но мувик _knob не двигается... Где я допустил ошибку?


Последний раз редактировалось Шурик_2; 13.06.2012 в 16:31.
Старый 13.06.2012, 16:48
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ахах, декомпил что ли?
Ну вот с картинкой.
Но хоть убейте, в кадре не могу написать.
Для ФД. Но думаю разберетесь.
Вложения
Тип файла: zip dj.zip (388.1 Кб, 49 просмотров)
__________________
Reality.getBounds(this);

Старый 13.06.2012, 16:51
Шурик_2 вне форума Посмотреть профиль Отправить личное сообщение для Шурик_2 Найти все сообщения от Шурик_2
  № 8  
Ответить с цитированием
Шурик_2
 
Аватар для Шурик_2

Регистрация: Dec 2007
Сообщений: 73
Отправить сообщение для Шурик_2 с помощью ICQ Отправить сообщение для Шурик_2 с помощью Skype™
Великая сила декомпилятора У меня и FD где-то был. Спасибо, сейчас буду сушить мозг дальше.

Добавлено через 7 часов 31 минуту
Промучился, переводя код в мой проект в Flash CS4, но так ничего и не вышло А в FD работает отлично. Жалею, что не умею писать в классах
Ваши умения кодить дизайн впечатляют... Сколько времени понадобилось научиться?


Последний раз редактировалось Шурик_2; 14.06.2012 в 00:27.
Старый 14.06.2012, 14:08
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: 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);

Старый 14.06.2012, 14:22
Шурик_2 вне форума Посмотреть профиль Отправить личное сообщение для Шурик_2 Найти все сообщения от Шурик_2
  № 10  
Ответить с цитированием
Шурик_2
 
Аватар для Шурик_2

Регистрация: Dec 2007
Сообщений: 73
Отправить сообщение для Шурик_2 с помощью ICQ Отправить сообщение для Шурик_2 с помощью Skype™
P.S. Дата моей регистрации не говорит о том, что я пять лет назад начал изучать AS3/2. Меня пять лет назад интересовала только анимация. Только в этом году я начал интересоваться кодированием анимации Возможности впечатляют. Спасибо за обстоятельный ответ, Вы мой кумир. Пожалуй мне стоит внимательно "перелопатить" страницы этой довольно увесистой книги.

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:27.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 18:27.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.