Перетащите объект в AS3, чтобы воздействовать на currentFrame, а не на координаты x / y. - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть трехмерный объект, вращающийся во флэш-видеофайле (встроенный в MovieClip).Его длина 100 кадров.

Тривиально перетащить объект во Flash, чтобы повлиять на его координаты x / y с помощью startDrag() ...

Но я хочу иметь возможность перетаскивать объект иизменить currentFrame мувиклипа в зависимости от положения мыши слева направо.

Моя лучшая идея заключается в следующем:

  • Иметь невидимую рамку вокруг объекта
  • Инициировать startDrag () в невидимом блоке.
  • Установить currentFrame во время операции перетаскивания на основе позиции от начала координат
  • Привязать невидимый блок обратно к исходному положению при операции перетаскивания.завершено - и запишите смещение кадра в следующий раз, когда кто-то его перетаскивает

Просто хочу убедиться, что нет более простого трюка или чего-то «готового» (либо кода AS3, либо IDE)сценарий), который я мог бы использовать.


Edit Я придерживаюсь этого подхода, и он работает довольно хорошо.Тем не менее, Flash, похоже, не любит случайный поиск назад через видеоклип.Если я перетаскиваю вправо, он воспроизводится плавно, но если я перетаскиваю влево, он очень нервно пытается найти предыдущий кадр.Есть ли AS3 для оптимизации «обратного воспроизведения»?

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

Это на самом деле выглядит довольно интересно! Я бы посоветовал посмотреть на MOUSE_MOVE в Adobe Livedocs . Возможно, вам не нужно перетаскивать объект.

В данном случае я попытался бы вычислить разницу между моим начальным X (который должен быть местом, где произошло ваше событие mousedown) и моим текущим X (я полагаю, event.StageX для вашего MOUSE_MOVE) - в основном, насколько пользователь переместил мышь в направлении X. Затем я бы разделил это значение на «значение шага». Например, если бы я хотел переместить один кадр на каждые 20 единиц по оси x, моим шагом будет значение 20. Затем вы можете использовать Math.floor () или int (), чтобы усечь значение и перевести его на анимацию кадра. , (Достоинства этого метода - если вы определяете значение шага в переменной, вы можете изменить его во время выполнения, что означает, что вы можете иметь быструю и медленную скорости перетаскивания, или все, что вы хотите сделать.)

Это в основном позволяет пропустить шаг "перетаскивание невидимого объекта".

Удачи.

1 голос
/ 01 апреля 2015

Что касается воспроизведения клипа задом наперед, может быть лучше иметь еще 100 кадров после начального движения вперед, которые воспроизводят анимацию вращения назад. Тогда вы можете использовать простую логику для переключения между 1-100 (вперед) кадров и 101-200 (назад кадров).

Таким образом, вы не просите flash воспроизвести клип задом наперед, чего он не предназначен.

1 голос
/ 08 апреля 2011

Ну, если вы хотите AS3 код:

stage.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag );

//triggered on MouseEvent.MOUSE_DOWN
private function beginDrag(e:MouseEvent):void
{
  stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.addEventListener(Event.DEACTIVATE, endDrag);
  stage.addEventListener(Event.MOUSE_LEAVE, endDrag);
  contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

private function drag(e:MouseEvent):void
{
  //do stuff
}

private function endDrag(e:Event):void
{
  stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.removeEventListener(Event.DEACTIVATE, endDrag);
  stage.removeEventListener(Event.MOUSE_LEAVE, endDrag);
  contextMenu.removeEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

Просто знайте, что есть некоторые проблемы с перетаскиванием во флэш-памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...