2016-01-28 164 views
0

Как сделать клон мувиклипа после его перетаскивания и сделать клонирование, где перетаскиваемый мувиклип был перед перетаскиванием?Клонирование объекта (Перетаскивание) Flash As3

Это то, что я до сих пор:

movieClip_1.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag_2); 

function fl_ClickToDrag_2(event:MouseEvent):void 
{ 
movieClip_1.startDrag(); 
} 

stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_2); 

function fl_ReleaseToDrop_2(event:MouseEvent):void 
{ 
movieClip_1.stopDrag(); 
} 

Кроме того, я также хотел бы знать, как сделать кнопку сброса, чтобы сбросить перетащены объекты на сцене

+0

Вы можете включить экспорт для Actionscript опции контекстного меню на символе библиотеки используется movieClip_1. Как только вы это сделаете, вы можете легко создать новый экземпляр и скопировать координаты x, y. ... –

+0

После того, как вы экспортируете movieClip_1 для actionscript как MovieClip_1 (соглашение заключается в использовании первой буквы в начале имени класса), вы можете сделать что-то вроде этого в '' 'fl_ReleaseToDrop_2''':' '' movieClip_1.stopDrag() ; // создаем новый экземпляр символа библиотеки - предполагается, что вы установили ссылку/Export для имени ActionScript как MovieClip_1 (смотрите M) var duplicate: MovieClip = new MovieClip_1(); // копирует координаты мыши -> это глобальные координаты этапа duplicate.x = event.stageX; duplicate.y = event.stageY; // добавить мувиклип на главную сцену addChild (duplicate); '' ' –

+0

Использовать ООП, и делать это будет легко. Время развиваться. – BotMaster

ответ

0

Вы можете выбрать символ вы хотите, чтобы сделать дубликат в Library Panel, перейдите к Symbol Properties (щелкнув правой кнопкой мыши значок и выберите Свойства ) и включите Экспорт для ActionSc НИИЮ

Flash Symbol Properties

В качестве примера символа, я создал символ плюс и названный символ Plus.

После того, как вы сделали это, вы можете легко создать новый экземпляр этого символа:

addChild(new Plus()); 

Обратите внимание, что Plus то же самое вы дали символ в символ свойства, так что если вы называете ваш символ MovieClip_1 в библиотеке, и она экспортируется в ActionScript код будет выглядеть следующим образом:

addChild(new MovieClip_1()); 

Если вы сделаете это, вы заметите, что символ будет помещен на 0,0, так что следующее, что нужно сделать, это установить x, y положение нового inst Анс. Прежде всего, необходимо создать переменную, которую можно повторно использовать для этого экземпляра:

var newPlus:MovieClip = new Plus(); 

Тогда вы можете получить доступ к его x и y свойства, так же как и любой другой MovieClip.

Поскольку вы используете MOUSE_DOWN событие, чтобы создать дубликат, вы можете использовать MouseEvent's stageX and stageY свойства:

function fl_ClickToDrag_2(event:MouseEvent):void 
{ 
    var newPlus:MovieClip = new Plus(); 
    newPlus.x = event.stageX; 
    newPlus.y = event.stageY; 
    addChild(newPlus); 
} 

Просто нужно, чтобы начать перетаскивание:

function fl_ClickToDrag_2(event:MouseEvent):void 
{ 
    var newPlus:MovieClip = new Plus(); 
    newPlus.x = event.stageX; 
    newPlus.y = event.stageY; 
    addChild(newPlus); 
    newPlus.startDrag(); 
} 

Конечно, нужно слушать этап MOUSE_UP событие, чтобы остановить перетаскивание. Для этого мы можем сделать переменную, хранящую ссылку на последний дублированный клип вне обработчика MOUSE_DOWN. Таким образом, всякий раз, когда добавляется новый клип, он будет доступен/видим из обработчика MOUSE_UP, поэтому перетаскивание может остановиться. Уловка заключается в проверке того, был ли первый клип взят первым, потому что пользователь может щелкнуть по сцене без создания дубликата.

Вот прокомментировал фрагмент:

import flash.display.MovieClip; 

//a reference to the latest/most recently cloned movie clip 
var latestClone:MovieClip; 

plus.addEventListener(MouseEvent.MOUSE_DOWN, onPlusPressed); 

function onPlusPressed(event:MouseEvent):void 
{ 
    //make a new instance using the linkage/Export for ActionScript name 
    latestClone = new Plus(); 
    //copy mouse position to movie clip position 
    latestClone.x = event.stageX; 
    latestClone.y = event.stageY; 
    //add it to the stage 
    addChild(latestClone); 
    //start dragging it, instead of the symbol manually placed on stage 
    latestClone.startDrag(); 
} 

stage.addEventListener(MouseEvent.MOUSE_UP, onStageReleased); 

function onStageReleased(event:MouseEvent):void 
{ 
    //if there was a clone already made/dragged 
    if(latestClone != null){ 
     //then release it 
     latestClone.stopDrag(); 
    } 
} 

Обратите внимание, что я назвал один символ плюс помещается вручную на этапе plus. Так экземпляр на сцене plus, то/имя класса символ Plus:

Symbol instance name

Вы можете запустить эту here и скачать zipped xfl Flash source here

Update на Основываясь на ваш комментарий сильфона, оказывается, это не так сложно сделать дублированные экземпляры перетаскиваемыми. Это можно установить в 3 этапа:

  1. Добавить обработчик события MOUSE_DOWN для клонированного экземпляра. Теоретически вы можете повторно использовать существующий обработчик, но вам нужно будет иметь способ дифференцировать источник клонирования мувиклипа и клонированные экземпляры. Это будет чище иметь отдельный обработчик, используемый только клонированные экземплярами
  2. Установите latestClone ссылки на данный момент щелкнули клонированные например: таким образом onStageReleased обработчика может быть повторно использован также прекратить перетаскивание клонированных экземпляров
  3. перетаскивайте

Основываясь на предыдущем примере кода, используя символ Plus, обновленный фрагмент кода выглядит следующим образом:

import flash.display.MovieClip; 
import flash.events.MouseEvent; 

//a reference to the latest/most recently cloned movie clip 
var latestClone:MovieClip; 

plus.addEventListener(MouseEvent.MOUSE_DOWN, onPlusPressed); 

function onPlusPressed(event:MouseEvent):void 
{ 
    //make a new instance using the linkage/Export for ActionScript name 
    latestClone = new Plus(); 
    //copy mouse position to movie clip position 
    latestClone.x = event.stageX; 
    latestClone.y = event.stageY; 
    //add it to the stage 
    addChild(latestClone); 
    //start dragging it, instead of the symbol manually placed on stage 
    latestClone.startDrag(); 
    //add a separate MOUSE_DOWN event handler for the cloned instance 
    latestClone.addEventListener(MouseEvent.MOUSE_DOWN,onClonedPlusPressed); 
} 
//event handler for a cloned instance 
function onClonedPlusPressed(event:MouseEvent):void{ 
    //set the latest clone to be what's currently clicked (MouseEvent's current target) 
    //for more details on target/currentTarget and event bubbling see http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html 
    latestClone = MovieClip(event.currentTarget);//event.currentTarget return an Object and latestClone is a MovieClip, therefore we cast the currentTarget Object to a MovieClip type 

    //start dragging 
    latestClone.startDrag(); 
} 

stage.addEventListener(MouseEvent.MOUSE_UP, onStageReleased); 

function onStageReleased(event:MouseEvent):void 
{ 
    //if there was a clone already made/dragged 
    if(latestClone != null){ 
     //then release it 
     latestClone.stopDrag(); 
    } 
} 
+0

Большое спасибо, Джордж! Мне удалось выполнить ваши инструкции и заставить работать так, как я хотел, за исключением того, что клоны становятся перетаскиваемыми, но я понял, как это сделать с кодом, который вы отправили, поэтому на мой вопрос ответили. – New2AS3

+0

Рад ответить полезным. Нетрудно заставить клонов перетащить. Я добавил обновленный фрагмент выше, объясняя, как он работает –

Смежные вопросы