Проблема с пользовательским курсором в ActionScript 3.0 - PullRequest
1 голос
/ 04 августа 2011

Я написал простую игру и хочу добавить собственный указатель.Я создал MovieClip с именем Pointer, экспортировал его в AS3 и написал следующий код:

var pointer:Pointer = new Pointer();
pointer.scaleX=0.1; //that's because cursor turned to be MUCH bigger than needed
pointer.scaleY=0.1;
stage.addEventListener(MouseEvent.MOUSE_MOVE, redrawCursor); 
stage.addEventListener(Event.MOUSE_LEAVE, hideCursor); 
Mouse.hide(); 
function redrawCursor (event:MouseEvent):void { 
    pointer.visible = true; 
    pointer.x = event.stageX; 
    pointer.y = event.stageY; 
} 
function hideCursor (event:Event):void { 
    pointer.visible = false; 
} 

Полагаю, что объяснять нечего - код слишком прост.В игре на кадре 74 некоторые объекты создаются на сцене.Если я вставлю этот код ДО создания и добавления других экземпляров MovieClip, курсор фактически будет за этими объектами.Если я вставляю этот код ПОСЛЕ, мышь находится сверху, но MouseListeners вообще не реагируют.В чем проблема?: SS

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Каждый раз, когда вы используете метод addChild, он помещает DisplayObject поверх всего остального в списке отображения цели.

Либо сделайте два DisplayObjects, поместите мышь в верхнюю и все остальные в нижнюю или используйте метод addChildAt, чтобы поместить все под вашу мышь.

EDIT: Обычные следующие курсоры очень запаздывают и обычно не дают такого хорошего пользовательского опыта. Если вы можете использовать flash player 10.2+, вы должны использовать собственный курсор мыши.

var cursorData:MouseCursorData = new MouseCursorData();
var bitmapDatas:Vector.<BitmapData> = new Vector.<BitmapData>();
var bitmap:Bitmap = new zoomCursor();
bitmapDatas[0] = bitmap.bitmapData;
cursorData.data = bitmapDatas;
Mouse.registerCursor("myCursor", cursorData);
Mouse.cursor = "myCursor";
1 голос
/ 04 августа 2011

Добавьте контейнер к вашему фильму в самом верху.Если вы не уверены, используйте:

var container : Sprite = new Sprite();
container.name = "pointer";
stage.addChild(container);

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

Добавьте указатель на этот контейнер.

Sprite(stage.getChildByName("pointer")).addChild(pointer);

Отключите интерактивность мыши вашего указателя.В противном случае он может проглотить щелчки мышью, и они никогда не дойдут до видеоклипов внизу.

pointer.mouseEnabled = false;
...