PDA

Просмотр полной версии : Как определить, перетаскиваеться в данный момент объект с помощью startDrag или нет.


krolser
16.10.2007, 18:50
Как определить, перетаскиваеться в данный момент объект с помощью startDrag или нет?

Это написано в документации на StartDrag (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/Sprite.html#startDrag())

Lets the user drag the specified sprite. The sprite remains draggable until explicitly stopped through a call to the Sprite.stopDrag() method, or until another sprite is made draggable. Only one sprite is draggable at a time.

Т.е. получаеться, что одновременно может перемещаться с помощью startDrag только один объект, поэтому с помошью флажка отследить нереально, из за того, что при начале перетягивая нового объекта предыдущий перетягиваемый автоматически остановиться.

Может есть какое то свойство у кого нибудь, или события типа dragged?

Ostgur
16.10.2007, 19:58
проверь меняются ли координаты относительно тех, пока не взял на drag, а вообще нет isDragged.

BlooDHounD
16.10.2007, 22:13
а унаследовать класс от спрайта и переопределить свойство startDrag и stopDrag?

private static var _dragged:Sprite;

public function get dragged():Boolean {
return ( this === _dragged );
}

public override function startDrag():void {
_dragged = this;
super.startDrag();
}
public override function stopDrag():void {
super.stopDrag();
_dragged = null;
}


что-то типа того.

krolser
17.10.2007, 12:18
Спасибо всем ответившим.

to Ostgur: вообще не понял, что ты пердлагаешь.

to BlooDHounD: Идея хорошая и даже очень правильная, но.... для её реализации мне все мои классы придётся отнаследовать от моего Апгрейднутого sprite. Вот в этом то и загвоздка. Ведь иногда мне нужно наследоваться не только от Sprite, но и от MovieClip, который будет лишен этой функциональности.

Так что вопрос остаётся открытым.

Я пытался переопреелить эти функции у прототипа Sprite. Но у меня ничего не получилось. Просто с прототипами я на "..... твою мать". Может кто знает, как правильно это сделать.

etc
17.10.2007, 12:57
Ну сделай апгрейденный MovieClip =)

BlooDHounD
17.10.2007, 12:58
в АС3 с портотипами так просто не поработаешь :)

2morrowMan
17.10.2007, 13:30
Как вариант:

var dragSprite:Sprite = null;
...
public function dragSprite(spr:Sprite):void
{
dragSprite = spr;
spr.startDrag();
}

public function dropSprite(spr:Sprite):void
{
spr.stopDrag();
dragSprite = null;
}

public function isDraging(spr:Sprite):Boolean
{
return (dragSprite && (dragSprite == spr));
}

Если будут перетаскиваться несколько объекто, то делаешь:

var dragSprites:Array = [];
// ну и т.д. :)

BlooDHounD
17.10.2007, 13:49
несколько объектов не могут драгаться :) что бы драгать несколько объектов, необходимо писать свой драгманагер :)

krolser
17.10.2007, 14:59
Ну сделай апгрейденный MovieClip =)
Это проблемы не решает. А вдруг мне надо, а мне и надо, использовать сторонние компоненты, которые уж точно не будут наследоваться от моего Апгрейднутого MovieClip.

to 2morrowMan: Смотри внимательно третий пост в этой тебе. В нем хоть наследование есть, а у тебя нету. НО всё равно спасибо, что отклинкнулся.

в АС3 с портотипами так просто не поработаешь :)
А можно по подробнее, почему так просто не получиться?

Вопрос всё еще открыт. И теперь он преобретает еще более интересный окрас. А можно ли вообще сделать то, о чем я говорю?

Kikasso
17.10.2007, 15:18
Заведи себе драг менеджера, отдельным классом, и обращайся примерно так:
// вместо startDrag
DragManager.currentDrag = mySprite;
// вместо stopDrag
DragManager.currentDrag = null;
ну а внутри статик геттер-сеттер..

krolser
17.10.2007, 15:34
Заведи себе драг менеджера, отдельным классом, и обращайся примерно так:
// вместо startDrag
DragManager.currentDrag = mySprite;
// вместо stopDrag
DragManager.currentDrag = null;
ну а внутри статик геттер-сеттер..

Не пойдет по описанным выше причинам.

Ладно....Обясню по русски.
У меня уже много чего написанно. И вдруг мне понадобилось, чтобы объект при получении какогото события знал, такскаеться он сейчас или нет. Я конечно могу при startDrag запомнить, что мы начали его таскать... НО, я никак не могу отловить момент, когда его перестают тоскать. Почему? А потому, что этот момент может наступить, когда начнут тоскать что-нибудь другое.

Все ваши варианты предполагают полный проход по всему коду. Или всех переонаследовать, что не совсем корректно, кода я использую чужие классы. Или найти все вхождения startDrag и написать там какое-нибудь "запоминание" (неважно менаджер это или флажок). А я хочу достичь эффекта "малой кровью".

2morrowMan
17.10.2007, 16:19
to 2morrowMan: Смотри внимательно третий пост в этой тебе. В нем хоть наследование есть, а у тебя нету.
Причем тут наследование?
Блин, небыло времени все расписывать, но вижу придется!
(Пишу все находу без проверки на работоспособность - извиняйте за ошибки)


// Drager.as
package
{
public class Drager // DragManager, называй как хочешь
{
private var target:Sprite = null;

public function DragMgr()
{
}

public function dragSprite(spr:Sprite):void
{
target = spr;
spr.startDrag();
}

public function dropSprite(spr:Sprite):void
{
if (spr) spr.stopDrag();
target = null;
}

public function isDraging(spr:Sprite):Boolean
{
return (target && (target == spr));
}
}
}



// somewhere...
import Drager;
...
var myDrager = new Drager();
...
function onMouseDown(event:MouseEvent):void
{
if (event.currentTarget is Sprite)
myDrager.dragSprite(event.currentTarget);
}

function mouseReleased(event:MouseEvent):void {
{
myDrager.dropSprite(event.currentTarget);
}
...
function someFunc()
{
trace(myDrager.isDraging(mySomething));
}

krolser
17.10.2007, 16:51
to 2morrowMan: Тогда у меня к тебе второй вопрос, как твою штуку внедрить к кучу классов. Мне что везде вместо startDrag писать myDrager.startDrag? Я это делать не особо хочу потому что
Это проблемы не решает. А вдруг мне надо, а мне и надо, использовать сторонние компоненты

BlooDHounD
17.10.2007, 18:54
ну обычно люди прежде чем писать кучу классов думают, что им это грозит, а потом уже пишут. процесс называется "проектирование". либо написав эту кучу классов выбрают из предложенных решений и реализовывают. или сами находят эти решения. врят ли человек написавший кучу классов придёт на форум с вопросом "как таскать мувик"

Kikasso
17.10.2007, 21:24
>Все ваши варианты предполагают полный проход по всему коду
Кошмар. А что нет такого пункта в меню как "найти в файлах"?

lowka
17.10.2007, 22:34
Я это делать не особо хочу потому что:
А вдруг мне надо, а мне и надо, использовать сторонние компоненты

99.9% визуальных компонентов имеют в цепочке наследования flash.display.Sprite. 0.01% оставлена для компонентов, порожденных композиций (не встречал таких -- полагаю, что это изначально тупиковая ветвь). А заменять sprite.startDrag на dragManager.startDrag(sprite) всеравно придется.

krolser
18.10.2007, 13:24
ну обычно люди прежде чем писать кучу классов думают, что им это грозит, а потом уже пишут. процесс называется "проектирование". либо написав эту кучу классов выбрают из предложенных решений и реализовывают. или сами находят эти решения. врят ли человек написавший кучу классов придёт на форум с вопросом "как таскать мувик"
Отправляю к первому посту. Мне кажеться там другой вопрос задавался, есть ссылка на документацию, не поленился даже сделать вольный перевод. Я задал серьёзный, стоящий вопрос. Он же не сводиться только к тасканию Sprite, он гораздо шире, как подменить функциональность стандартных классов AWM2, не прибегая к наследованию, чтобы остальные написаные классы (может даже не мною) даже не догадались, что что работает иначе.

Кстати, запостил комент в LifeDoc (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/Sprite.html) с предложением о внесении такого метода (isDragged) в стандарт. Авось появиться в следующей версии.

Особое спасибо lowka, за описание примерного соотношения классов в AS3.

Скорее всего применю вариант из третьего поста.

Так как начался флейм с поучением как "проектировать" и как искать по файлам, то предлагаю админам закрыть тему, дабы не плодить флуд.
Спасибо всем откликнувшимся.

BlooDHounD
18.10.2007, 16:30
жесть :) в первом послу небыло условия: "лень править кучу классов" :)