PDA

Просмотр полной версии : Реакция на мышь только из одного child'a


vinch
01.11.2010, 23:21
Ситуация такова: есть клип под названием clip. На нижнем слое - маленький круг, под именем main, на верхнем - большой, по именем big. Как сделать, чтобы можно было двигать весь клип (через MOUSE_DOWN и startGrag()) с помощью маленького круга? Т.е., чтобы на большой круг мышь не реагировала.

Как на примере:
http://www.flasher.ru/forum/attachment.php?attachmentid=25417&stc=1&d=1288639110
Нужно, чтобы таскался весь клип, но только за маленький черный круг.
Вроде бы, вопрос простой, но нужную комбинацию mouseEnabled/mouseChildren для clip, main, big не удалось :(

Буду благодарен за советы.

TWETTI
01.11.2010, 23:32
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;

public class Main extends Sprite
{
private var clip:Sprite;
public function Main()
{
clip = new Sprite();
addChild(clip);
clip.x = 200;
clip.y = 200;

var big:Sprite = new Sprite();
big.graphics.beginFill(0x939393);
big.graphics.drawCircle(0, 0, 50);
big.graphics.endFill();
clip.addChild(big);

var main:Sprite = new Sprite();
main.graphics.beginFill(0x000000);
main.graphics.drawCircle(0, 0, 10);
main.graphics.endFill();
clip.addChild(main);

main.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
main.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}

private function onMouseDown(event:MouseEvent):void
{
clip.startDrag();
}

private function onMouseUp(event:MouseEvent):void
{
clip.stopDrag();
}
}
}

bav
01.11.2010, 23:48
TWETTI, там же большой круг лежит выше маленького.package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;

/**
* For the short tests
* @author bav
*/
public class Main extends Sprite
{
private var clip:Sprite = new Sprite();
private var big:Sprite = new Sprite();
private var main:Sprite = new Sprite();

public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

big.graphics.beginFill(0xCCCC00, 0.5);
big.graphics.drawCircle(0, 0, 50);
big.graphics.endFill();

main.graphics.beginFill(0xDD6600, 1);
main.graphics.drawCircle(0, 0, 10);
main.graphics.endFill();

clip.addChild(main);
clip.addChild(big);
clip.x = clip.y = big.width / 2;
addChild(clip);

big.mouseEnabled = false;
main.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
}

private function mouseDownHandler(event:MouseEvent):void
{
(event.currentTarget.parent as Sprite).startDrag();
(event.currentTarget as Sprite).addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}

private function mouseUpHandler(event:MouseEvent):void
{
(event.currentTarget.parent as Sprite).stopDrag();
(event.currentTarget as Sprite).removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}
}
}

f.g.programmer
01.11.2010, 23:58
Если большой и малый круг лежат в одном контейнере, достаточно установить hitArea и mouseChildren для контейнера

var small:Sprite = new Sprite();
var big:Sprite = new Sprite();
var container:Sprite = new Sprite();
container.addChild(big);
container.addChild(small);
container.hitArea = small;
container.mouseChildren = false;
container.addEventListener(MouseEvent.CLICK, trace);

vinch
01.11.2010, 23:59
bav , спасибо, но у меня big сверху. В принципе, на этом примере, если поставить big.mouseEnabled = false - работает; но у меня big - анимированные мувиклип круглой формы с множеством детей - может из-за этого у меня проблемы?

Мне казался верным такой вариант:
(sprite.getChildByName("main") as MovieClip).addEventListener(MouseEvent.MOUSE_DOWN, startSpriteDrag);
(sprite.getChildByName("big") as MovieClip).mouseEnabled = false;
(sprite.getChildByName("big") as MovieClip).mouseChildren = false;
Но так вообще не двигается.
А так:
sprite.addEventListener(MouseEvent.MOUSE_DOWN, startSpriteDrag);
(sprite.getChildByName("big") as MovieClip).mouseEnabled = false;
(sprite.getChildByName("big") as MovieClip).mouseChildren = false;
Двигается и за big.

f.g.programmer, огромное спасибо, помогло; не знай о таком свойстве ;)