Actionscript 3. Как сделать новые экземпляры перетаскиваемыми?

Я пытаюсь создать игру с перетаскиванием, в которой пользователь может создать что-то, используя предоставленные мной изображения. У меня будут изображения в меню, которые пользователь может щелкнуть и перетащить в область здания. Пользователь сможет добавить столько экземпляров этого изображения, сколько захочет.

Я смог заставить часть его работать. Пока что я могу щелкнуть изображение и перетащить его, а также создать столько экземпляров, сколько захочу. Однако я не могу щелкнуть и перетащить изображение после его размещения.

Когда я делаю трассировку, чтобы узнать, что это за имя, оно говорит, что все новые экземпляры называются hillChild1. Я пытался назвать их hillChild1, hillChild2 и т. д., но это, похоже, тоже не работает... хотя не уверен, что это проблема.

Вот мой код:

thesubmenu1.hill.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
stage.addEventListener(MouseEvent.MOUSE_UP, onUp);

var myImage:Sprite = Sprite(new Hill_mc());
var i:Number=0; i++;


function onDown(e:MouseEvent):void {
    var myImage:Sprite = Sprite(new Hill_mc());
    myImage.name = "hillChild"+i;
    addChild(myImage);
    myImage.x = mouseX;
    myImage.y = mouseY;
    myImage.startDrag();
    myImage.buttonMode = true;
}
function onUp(e:MouseEvent):void {
    var myImage:Sprite = Sprite(new Hill_mc());
    myImage.stopDrag();
    myImage.name = "hillChild";
}



stage.addEventListener(MouseEvent.CLICK, traceName);
function traceName(event:MouseEvent):void { trace(event.target.name); }



myImage.getChild(myImage).addEventListener("mouseDown", mouseDownHandler);
stage.addEventListener("mouseUp", mouseUpHandler);

function mouseDownHandler (e:MouseEvent):void{
   myImage.startDrag();
}
function mouseUpHandler (e:MouseEvent):void{
   myImage.stopDrag();
}

Я новичок в StackOverflow, а также в ActionScript 3, если это не очевидно.


person mtdev88    schedule 30.01.2015    source источник
comment
Просто к вашему сведению, нет необходимости играть за Спрайта. var myImage:Sprite = new Hill_mc(); будет работать нормально.   -  person BadFeelingAboutThis    schedule 30.01.2015


Ответы (1)


Ваша проблема, вероятно, заключается в том, что вы создаете новый экземпляр при нажатии мыши (когда вам нужна ссылка на экземпляр, который уже был создан при нажатии мыши). Кроме того, вы никогда не добавляете прослушиватель кликов к своим новым объектам. Добавьте прослушиватель мыши вверх на сцену только после того, как мышь опущена (затем удалите прослушиватель мыши вверх).

thesubmenu1.hill.addEventListener(MouseEvent.MOUSE_DOWN, createCopy);

var i:int=0;
var tmpImage:Sprite; //to store which image is being dragged currently

function createCopy(e:MouseEvent):void {
    tmpImage = new Hill_mc();
    tmpImage.name = "hillChild"+(i++); //increment every copy
    addChild(tmpImage);
    tmpImage.x = mouseX;
    tmpImage.y = mouseY;
    tmpImage.startDrag();
    tmpImage.buttonMode = true;
    tmpImage.addEventListener(MouseEvent.MOUSE_DOWN, onDown); //add the mouse down to this new object
    stage.addEventListener(MouseEvent.MOUSE_UP, onUp); //since the mouse is currently down, we need to listen for mouse up to tell the current copy to stop dragging
}

//this will be called when click a copy
function onDown(e:MouseEvent):void {
    tmpImage = Sprite(e.currentTarget); //get a reference to the one that was clicked, so we know which object to stop dragging on the global mouse up.
    stage.addEventListener(MouseEvent.MOUSE_UP, onUp); //listen for the mouse up
    tmpImage.startDrag();
}
function onUp(e:MouseEvent):void {
    stage.removeEventListener(MouseEvent.MOUSE_UP,onUp); //now that the mouse is released, stop listening for mouse up
    tmpImage.stopDrag(); //stop dragging the one that was clicked
}
person BadFeelingAboutThis    schedule 30.01.2015
comment
Боже мой! Вы спасатель жизни! Я провел почти 3 полных дня, пытаясь найти все, что мог найти... - person mtdev88; 31.01.2015